Дорогие друзья, поздравляем вас с выполнением лабораторных работ! Вам предстоит решить   очень интересную задачу, а именно, вам нужно будет  построить два светофора, первый  для большого перекрестка и второй - специальный  для плохо видящих  людей.

Не будем больше ждать, поехали!
 

Светофор для большого перекрестка

Светофор для большого перекрестка - это светофор который постоянно работает. Он состоит из двух светофоров для встречных направлений. Сначала нам нужно будет собрать  схему подключения всех элементов светофора, а затем  написать программу, которая будет включать и выключать светофоры в определённое время. В этом документе находятся две программы: одна, с помощью которой можно управлять светофорами из приложения Alterozoom, и вторая, которая просто задаёт последовательность работы светофоров.

источник: https://ru.depositphotos.com/192130610/stock-illustration-city-street-vector-cartoon-illustration.html

Оборудование

  1. Плата NodeMCU
  2. Блок питания 5В
  3. Провода
  4. Светодиод красный 4 шт.
  5. Светодиод зелёный 4 шт.
  6. Светодиод жёлтый 4 шт.
  7. Резисторы 220Ом 6 шт. 



 

Оборудование для одного светофора

 

Схема подключения


В основе этого проекта находится схема подключения диода. 

источник:http://edurobots.ru/2014/03/arduino-svetodiod/

Вам нужно подключить ещё жёлтый и зелёный диоды и схема первого светофора готова!

Второй светофор подключается аналогичным образом.



Если мы посмотрим на перекресток повнимательней,  то мы заметим, что нам нужно два светофора для одного направления и два светофора для другого направления. 



Из-за нехватки контактов на платформе NodeMCU мы просто будем дублировать количество диодов на одном контакте, т.е. рядом с уже подключенными диодами мы будем подключать дополнительные диоды. 
На картинке показано как это можно сделать. 


Плата NodeMCU подключается к 5В следующим образом: на контакт 3В нужно подключить напряжение, а на контакт G подключить землю. 

Программа без управления, "тупой светофор"


Прежде чем начать работать с платой NodeMCU почитайте материалы в окне снизу. 



Скетч:


void setup() {
pinMode(D0,OUTPUT);//GREEN
pinMode(D1,OUTPUT);//YELLOW
pinMode(D2,OUTPUT);//RED
pinMode(D5,OUTPUT);//GREEN
pinMode(D4,OUTPUT);//YELLOW
pinMode(D3,OUTPUT);//RED
}
void loop() {
digitalWrite(D1,LOW);
digitalWrite(D3,LOW);
digitalWrite(D4,LOW);
digitalWrite(D2,HIGH);
digitalWrite(D5,HIGH);
delay(5000);
digitalWrite(D5,LOW);
delay(500);
digitalWrite(D5,HIGH);
delay(500);
digitalWrite(D5,LOW);
delay(500);
digitalWrite(D5,HIGH);
delay(500);
digitalWrite(D5,LOW);
delay(500);
digitalWrite(D5,HIGH);
delay(500);
digitalWrite(D5,LOW);
delay(500);
digitalWrite(D1,HIGH);
digitalWrite(D4,HIGH);
delay(3000);
digitalWrite(D1,LOW);
digitalWrite(D2,LOW);
digitalWrite(D0,HIGH);
digitalWrite(D4,LOW);
digitalWrite(D3,HIGH);
delay(5000);
digitalWrite(D0,LOW);
delay(500);
digitalWrite(D0,HIGH);
Adelay(500);
digitalWrite(D0,LOW);
delay(500);
digitalWrite(D0,HIGH);
delay(500);
digitalWrite(D0,LOW);
delay(500);
digitalWrite(D0,HIGH);
delay(500);
digitalWrite(D0,LOW);
delay(500);
digitalWrite(D1,HIGH);
digitalWrite(D4,HIGH);
delay(3000);
}

 


Описание команд:
 

Команда Описание

void setup() {}

Функция которая быполняется только один раз, преднозначена для обявления пинов 

pinMode(пин,режим);

Обявление пина

void loop() {}

Функция которая выполняется много раз, цикл

digitalWrite(пин,HIGH или LOW);

Команда с помощью которой включаем светодиод (если HIGH) или выключаем (если LOW)

delay(время в милисекундах);

Задержка

 

Примечание: Все команды заканчиваются точкой запятой, в функциях команды находятся между {}.

 

Программа с управлением, "умный светофор"

Перед началом работы рекомендуем прочитать материалы, расположенные в ifraim-ах ниже. 
Также вам нужно скачать приложение Alterozoom, его вы можете скачать с официального сайта, потом вам нужно установить лицензию.
Для получения лицензии свяжитесь с нами по почте: branislava.jankovic.1998@ gmail.com


 





Скетч:

#include <ARpcArduStrHlp.h>
#include <ARpcDevice.h>
#include <ARpcDeviceState.h>
#include <ARpcIDevEventsCallback.h>
#include <ARpcIMessageCallback.h>
#include <ARpcIWriteCallback.h>
#include <ARpcRealDeviceMessageDispatch.h>
#include <ARpcSrvReady.h>
#include <ARpcStarNetDevice.h>
#include <ARpcStarNetEndPoint.h>
#include <ARpcStarNetEndPointDevice.h>
#include <ARpcStarNetStreamWriter.h>
#include <ARpcStreamParser.h>
#include <ARpcStreamWriter.h>
#include <ARpcUuid.h>
#include <BearSSLHelpers.h>
#include <CertStoreBearSSL.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiClientSecureAxTLS.h>
#include <WiFiClientSecureBearSSL.h>
#include <WiFiServer.h>
#include <WiFiServerSecure.h>
#include <WiFiServerSecureAxTLS.h>
#include <WiFiServerSecureBearSSL.h>
#include <WiFiUdp.h>
#include <ESP8266HTTPClient.h>

 

uint16_t port=4081;

WiFiServer server(port);

WiFiClient client;

IPAddress bCastSenderIp;

WiFiUDP bCastCli;

 

bool        connecting=false;

const char* ssid="WL3";

const char* password="11111111";

 

unsigned long lastSyncMillis=0;

 

const char *deviceName="bigtrafficklight";  // naziv uredjaja

const ARpcUuid deviceId("{61897b19-6fb3-4d7a-b5e1-5ecfa9091eca}");

 

const char *interfaceStr="<controls>"

"<group title=\"BIG_TRAFFIC_LIGHT_SETTINGS\">"

  "<control title=\"BIG TRAFFIC LIGHT ON\" command=\"btlon\"/>"

  "<control title=\"BIG TRAFFIC LIGHT Off\" command=\"btloff\"/>"

"</group>"

"</controls>";


class NetWriteCb

    :public ARpcIWriteCallback

{

public:

    void writeData(const char *d,unsigned long sz)override

    {

        client.write(d,sz);

    }

    void writeStr(const char *str)override

    {

        client.print(str);

    }

        void writeStr(const __FlashStringHelper *str)override

    {

        client.print(str);

    }

}netCb;


class SerialWriteCb

    :public ARpcIWriteCallback

{

public:

    void writeData(const char *d,unsigned long sz)override

    {

        Serial.write(d,sz);

    }

    void writeStr(const char *str)override

    {

        Serial.print(str);

    }

    void writeStr(const __FlashStringHelper *str)override

    {

        Serial.print(str);

    }

}serialCb;

ARpcDevice wifiDev(300,&netCb,&deviceId,deviceName);

ARpcDevice serialDev(300,&serialCb,&deviceId,deviceName);

//callback-класс для обработки команд, вызывается библиотекой ARpc

 

class EventsCb

    :public ARpcIDevEventsCallback

{

public:

    explicit EventsCb(ARpcDevice *d)

    {

        dev=d;

    }

   

    virtual void processCommand(const char *cmd,const char *args[],unsigned char argsCount)

    {

        byte cmdOK = 1;

        if     (strcmp(cmd,"btlon")   ==0) {

            digitalWrite(D1,LOW);

            digitalWrite(D3,LOW);

            digitalWrite(D4,LOW);

            digitalWrite(D2,HIGH);

            digitalWrite(D5,HIGH);

            delay(5000);

            digitalWrite(D5,LOW);

            delay(500);

            digitalWrite(D5,HIGH);

            delay(500);

            digitalWrite(D5,LOW);

            delay(500);

            digitalWrite(D5,HIGH);

            delay(500);

            digitalWrite(D5,LOW);

            delay(500);

            digitalWrite(D5,HIGH);

            delay(500);

            digitalWrite(D5,LOW);

            delay(500);

            digitalWrite(D1,HIGH);

            digitalWrite(D4,HIGH);

            delay(3000);

            digitalWrite(D1,LOW);

            digitalWrite(D2,LOW);

            digitalWrite(D0,HIGH);

            digitalWrite(D4,LOW);

            digitalWrite(D3,HIGH);

            delay(5000);

            digitalWrite(D0,LOW);

            delay(500);

            digitalWrite(D0,HIGH);

            delay(500);

            digitalWrite(D0,LOW);

            delay(500);

            digitalWrite(D0,HIGH);

            delay(500);

            digitalWrite(D0,LOW);

            delay(500);

            digitalWrite(D0,HIGH);

            delay(500);

            digitalWrite(D0,LOW);

            delay(500);

            digitalWrite(D1,HIGH);

            digitalWrite(D4,HIGH);

            delay(3000);

            wifiDev.disp().writeOk();

          }

        else if(strcmp(cmd,"btloff") ==0) {

            digitalWrite(D1,LOW);

            digitalWrite(D2,LOW);

            digitalWrite(D3,LOW);

            digitalWrite(D4,LOW);

            digitalWrite(D5,LOW);

            digitalWrite(D0,LOW);

            wifiDev.disp().writeOk();

          }

        else {

            wifiDev.disp().writeErr("Unknown cmd"); 

            cmdOK = 0;

          }

    }

    virtual void onSyncMsg()

    {

        lastSyncMillis=millis();

    }

  private:

    ARpcDevice *dev;

}serialEcb(&serialDev),wifiEcb(&wifiDev);

class SrcReadyCb

    :public ARpcISrvReadyCallback

{

public:

    void processSrvReadyMsg(const ARpcUuid &srvId,const char *srvName)

    {

        serialDev.disp().writeInfo("Server detected: ",bCastSenderIp.toString().c_str(),srvName);

        if(client.connected()||connecting)return;

        serialDev.disp().writeInfo("Connecting to server...");

        connecting=true;

        client.connect(bCastSenderIp,port);

        for(int i=0;i<20;++i)

        {

            if(client.connected())

                break;

            delay(100);

        }

        serialDev.disp().writeInfo("Connected to server");

        connecting=false;

        wifiDev.resetParser();

        lastSyncMillis=millis();

    }

}srvReadyCb;

ARpcSrvReady srvReadyParser(200,&srvReadyCb);

void connectWifi()

{

    WiFi.begin(ssid,password);

    while(WiFi.status()!=WL_CONNECTED)

    {

        delay(500);

        serialDev.disp().writeInfo("Wifi connecting");

    }

    serialDev.disp().writeInfo("WiFi connected");

}

void setup() {

  // pin definition

  pinMode(D0,OUTPUT);//GREEN

  pinMode(D1,OUTPUT);//YELLOW

  pinMode(D2,OUTPUT);//RED

  pinMode(D5,OUTPUT);//GREEN D5

  pinMode(D4,OUTPUT);//YELLOW

  pinMode(D3,OUTPUT);//RED D3

 

  // other stuff

    delay(2000);

    Serial.begin(9600);

    wifiDev.disp().installDevEventsHandler(&wifiEcb);

    wifiDev.disp().setControls(interfaceStr);

    serialDev.disp().installDevEventsHandler(&serialEcb);

    serialDev.disp().setControls(interfaceStr);

    connectWifi();

    bCastCli.begin(port);

   

    // Start the server

    server.begin();

    serialDev.disp().writeInfo("Server started");

   

    // Print the IP address

    serialDev.disp().writeInfo(WiFi.localIP().toString().c_str());

    serialDev.resetStream();    

}

void checkBCastCli()

{

    static int sz=0;

    sz=bCastCli.parsePacket();

    if(sz>0)

    {

        bCastSenderIp=bCastCli.remoteIP();

        for(int i=0;i<sz;++i)

            srvReadyParser.putByte(bCastCli.read());

    }

}

void checkWifiClient()

{

    if(client)

    {

        if(!client.connected())

        {

            serialDev.disp().writeInfo("Client connection lost");

            client=server.available();

            if(client)

            {

                serialDev.disp().writeInfo("Take next pending incoming connection");

                lastSyncMillis=millis();

                wifiDev.resetStream();

                wifiDev.resetParser();

            }

            delay(100);

        }

        else

        {

            while(client.available())

                wifiDev.putByte(client.read());

        }

    }

    else

    {

        client=server.available();

        if(client)

        {

            serialDev.disp().writeInfo("Take next pending incoming connection");

            lastSyncMillis=millis();

            wifiDev.resetStream();

            wifiDev.resetParser();

        }

        delay(100);

    }

}

void loop() {

//    while(Serial.available())

//    dev.putByte(Serial.read());

    while(Serial.available())

        serialDev.putByte(Serial.read());

    if(WiFi.status()!=WL_CONNECTED)

        connectWifi();

    checkBCastCli();

    checkWifiClient();

    if(((millis()-lastSyncMillis)>12000)&&client.connected())

    {

        client.stop();

        checkWifiClient();

    }

    delay(50);

}

 

Замечание: Красными буквами написана основная часть программы, зелёными написано то, что можно менять. 

 

Команда Описание

#include <название библиотекы>

Команда с помощью которой подключаем библотеку
const char* ssid="название сети к которой подключен локальный сервер"; Определяем сеть к которой будет подключатся ваше IoT устройство
const char* password="пароль сети"; Указиваем пароль сети
const char *deviceName="название IoT устройства";  Указиваем название вашего устройства
const ARpcUuid deviceId("{Id вашего устройства}"); УказиваемID вашего устройства

const char *interfaceStr="<controls>"

"<group title=\"название настроек\">"

  "<control title=\"название команды которое будет выдно из проложения Alteroyzoom после нажатия на кнопку Controle device \" command=\"команда\"/>"

"</group>"

"</controls>";

Определение названия команд 

if(strcmp(cmd,"команда") ==0) {

        чась программы которая выполняется после нажатия кнопки с         названием вашей команды из приложения

            wifiDev.disp().writeOk();

          }

Определяем что должно случится после нажатия вашей команды, если команда существует и она перечислена в разделе controls вы получаете сообщение от парсера что всё хорошо и что он команду узнал. 

wifiDev.disp().writeErr("Unknown cmd"); 

Сообщение которое получаете когда вы указали команду которая не указана в разделе controls

 

Замечание: Остальние команды либо перечислены сверху, либо соответствуют подключению к серверу и WiFi или передаче информации парсеру.  

 

Светофор для слепых


Данный светофор мало чем отличается от предыдущего. Единственое отличе   в том, что теперь нам нужны два светофора для машин, два для людей и кроме того нам нужны две кнопки и  "пищалка". 
 

Оборудование

  1. Плата NodeMCU
  2. Блок питания 5В
  3. Провода
  4. Светодиод красный 4 шт.
  5. Светодиод зелёный 4 шт.
  6. Светодиод жёлтый 2 шт.
  7. Резисторы 220Ом 6 шт. 
  8. Кнопка 2 шт.
  9. Пищалка



 

На фотографии находится часть оборудования, а именно для светофора для людей

 

Схема подключения


Схема подключения принципиально не отличаетя, она базируется на подключении диода и кнопки. Контакты, к которыми должны подключатся диоды и остальние элементы, можете посмотреть внутры скетча.

 

Замечание: Нам опять нужно подключить два диода на один контакт из-за нехватки контактов. Пищалка подключается как диод только ей не нужен резистор. 


Замечание: Вам нужны только 2 кнопки


Плата NodeMCU питается темже самым способом. На контакт 3В подключаем 5В внешнего источника, а контакт G потключаем к земле. 
 

Програма без управления "тупой светофор"

 

const int buttonPin = D4;     // the number of the pushbutton pin

const int GreenPin =  D5; // the number of the LED pin

const int RedPin =  D6;

const int S_greenpin =  D3;

const int S_yellowpin =  D2;

const int S_redpin =  D1;

const int soundPin = D0;

// variables will change:

int buttonState = 0;         // variable for reading the pushbutton status

void setup() {

  // initialize the LED pin as an output:

  pinMode(GreenPin, OUTPUT);

  pinMode(RedPin, OUTPUT);

  pinMode(S_greenpin, OUTPUT);

  pinMode(S_yellowpin, OUTPUT);

  pinMode(S_redpin, OUTPUT);

  pinMode(buttonPin, INPUT);

  pinMode(soundPin,OUTPUT);

}

 

void loop() {

  // read the state of the pushbutton value:

  buttonState = digitalRead(buttonPin);

 

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:

  if (buttonState == HIGH) {

    digitalWrite(S_greenpin,LOW);

    delay(500);

    digitalWrite(S_greenpin,HIGH);

    delay(500);

    digitalWrite(S_greenpin,LOW);

    delay(500);

    digitalWrite(S_greenpin,HIGH);

    delay(500);

    digitalWrite(S_greenpin,LOW);

    delay(500);

    digitalWrite(S_greenpin,HIGH);

    delay(500);

    digitalWrite(S_greenpin,LOW);

    digitalWrite(S_yellowpin,HIGH);  

    delay(2000);

    digitalWrite(S_yellowpin,LOW);

    digitalWrite(S_redpin,HIGH);

    delay(2000);

    digitalWrite(GreenPin,HIGH);

    digitalWrite(RedPin,LOW);

    digitalWrite(soundPin,HIGH);

    delay(3500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    delay(500);

    digitalWrite(soundPin,HIGH);

    digitalWrite(GreenPin,HIGH);

    delay(500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    delay(500);

    digitalWrite(soundPin,HIGH);

    digitalWrite(GreenPin,HIGH);

    delay(500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    delay(500);

    digitalWrite(soundPin,HIGH);

    digitalWrite(GreenPin,HIGH);

    delay(500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    delay(500);

    digitalWrite(soundPin,HIGH);

    digitalWrite(GreenPin,HIGH);

    delay(500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    delay(500);

    digitalWrite(soundPin,HIGH);

    digitalWrite(GreenPin,HIGH);

    delay(500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    digitalWrite(RedPin,HIGH);

    delay(3000);

    digitalWrite(S_yellowpin,HIGH);

    delay(1500);

    digitalWrite(S_redpin,LOW);

    digitalWrite(S_yellowpin,LOW);  

  } else {

    // turn LED off:

    digitalWrite(S_greenpin,HIGH);

    digitalWrite(RedPin,HIGH);

  }

}

В табличке перечислим команды с которыми раньше не сталкивались. 
 

Команда Описание

buttonState = digitalRead(buttonPin);

Переменая ButtonState получает значение в зависимости нажали ли вы кнопку или нет

if (buttonState == HIGH) {

часть программи которая слчится после нажатиё на кнопку
}

Указиваем что должно случится если кнопка нажата. 

 

Программа с управлением, "умный светофор"

 

#include <ARpcArduStrHlp.h>

#include <ARpcDevice.h>

#include <ARpcDeviceState.h>

#include <ARpcIDevEventsCallback.h>

#include <ARpcIMessageCallback.h>

#include <ARpcIWriteCallback.h>

#include <ARpcRealDeviceMessageDispatch.h>

#include <ARpcSrvReady.h>

#include <ARpcStarNetDevice.h>

#include <ARpcStarNetEndPoint.h>

#include <ARpcStarNetEndPointDevice.h>

#include <ARpcStarNetStreamWriter.h>

#include <ARpcStreamParser.h>

#include <ARpcStreamWriter.h>

#include <ARpcUuid.h>

 

 

 

#include <BearSSLHelpers.h>

#include <CertStoreBearSSL.h>

#include <ESP8266WiFi.h>

#include <ESP8266WiFiAP.h>

#include <ESP8266WiFiGeneric.h>

#include <ESP8266WiFiMulti.h>

#include <ESP8266WiFiScan.h>

#include <ESP8266WiFiSTA.h>

#include <ESP8266WiFiType.h>

#include <WiFiClient.h>

#include <WiFiClientSecure.h>

#include <WiFiClientSecureAxTLS.h>

#include <WiFiClientSecureBearSSL.h>

#include <WiFiServer.h>

#include <WiFiServerSecure.h>

#include <WiFiServerSecureAxTLS.h>

#include <WiFiServerSecureBearSSL.h>

#include <WiFiUdp.h>

#include <ESP8266HTTPClient.h>

 

 

uint16_t port=4081;

WiFiServer server(port);

WiFiClient client;

IPAddress bCastSenderIp;

WiFiUDP bCastCli;

 

bool        connecting=false;

const char* ssid="WL3";

const char* password="11111111";

 

unsigned long lastSyncMillis=0;

 

const char *deviceName="littletrafficklight";  // naziv uredjaja

const ARpcUuid deviceId("{1c7af6ee-abcb-4e64-8796-d0160d1d0df7}");

 

 

 

const char *interfaceStr="<controls>"

"<group title=\"NODEMCU1_SETTINGS\">"

  "<control title=\"LITTLE TRAFFIC LIGHT ON\" command=\"ltlon\"/>"

  "<control title=\"LITTLE TRAFFIC LIGHT Off\" command=\"ltloff\"/>"

"</group>"

"</controls>";

 

const int buttonPin = D4;     // the number of the pushbutton pin

const int GreenPin =  D5; // the number of the LED pin

const int RedPin =  D6;

const int S_greenpin =  D3;

const int S_yellowpin =  D2;

const int S_redpin =  D1;

const int soundPin = D0;

 

 

 

// opšte

int buttonState = 0; 

////////////////////////////////////////////////////////////////////////////////////////

class NetWriteCb

    :public ARpcIWriteCallback

{

public:

    void writeData(const char *d,unsigned long sz)override

    {

        client.write(d,sz);

    }

    void writeStr(const char *str)override

    {

        client.print(str);

    }

        void writeStr(const __FlashStringHelper *str)override

    {

        client.print(str);

    }

}netCb;

 

 

 

class SerialWriteCb

    :public ARpcIWriteCallback

{

public:

    void writeData(const char *d,unsigned long sz)override

    {

        Serial.write(d,sz);

    }

    void writeStr(const char *str)override

    {

        Serial.print(str);

    }

    void writeStr(const __FlashStringHelper *str)override

    {

        Serial.print(str);

    }

}serialCb;

ARpcDevice wifiDev(300,&netCb,&deviceId,deviceName);

ARpcDevice serialDev(300,&serialCb,&deviceId,deviceName);

 

 

//callback-класс для обработки команд, вызывается библиотекой ARpc

 

 

class EventsCb

    :public ARpcIDevEventsCallback

{

public:

    explicit EventsCb(ARpcDevice *d)

    {

        dev=d;

    }

   

    virtual void processCommand(const char *cmd,const char *args[],unsigned char argsCount)

    {

        byte cmdOK = 1;

        if     (strcmp(cmd,"ltlon")   ==0) {

            digitalWrite(S_greenpin,LOW);

            delay(500);

            digitalWrite(S_greenpin,HIGH);

            delay(500);

            digitalWrite(S_greenpin,LOW);

            delay(500);

            digitalWrite(S_greenpin,HIGH);

            delay(500);

            digitalWrite(S_greenpin,LOW);

            delay(500);

            digitalWrite(S_greenpin,HIGH);

            delay(500);

            digitalWrite(S_greenpin,LOW);

            digitalWrite(S_yellowpin,HIGH);  

            delay(2000);

            digitalWrite(S_yellowpin,LOW);

            digitalWrite(S_redpin,HIGH);

            delay(2000);

            digitalWrite(GreenPin,HIGH);

            digitalWrite(RedPin,LOW);

            digitalWrite(soundPin,HIGH);

            delay(3500);

            digitalWrite(soundPin,LOW);

            digitalWrite(GreenPin,LOW);

            delay(500);

            digitalWrite(soundPin,HIGH);

            digitalWrite(GreenPin,HIGH);

            delay(500);

            digitalWrite(soundPin,LOW);

            digitalWrite(GreenPin,LOW);

            delay(500);

            digitalWrite(soundPin,HIGH);

            digitalWrite(GreenPin,HIGH);

            delay(500);

            digitalWrite(soundPin,LOW);

            digitalWrite(GreenPin,LOW);

            delay(500);

            digitalWrite(soundPin,HIGH);

            digitalWrite(GreenPin,HIGH);

            delay(500);

            digitalWrite(soundPin,LOW);

            digitalWrite(GreenPin,LOW);

            delay(500);

            digitalWrite(soundPin,HIGH);

            digitalWrite(GreenPin,HIGH);

            delay(500);

            digitalWrite(soundPin,LOW);

            digitalWrite(GreenPin,LOW);

            delay(500);

            digitalWrite(soundPin,HIGH);

            digitalWrite(GreenPin,HIGH);

            delay(500);

            digitalWrite(soundPin,LOW);

            digitalWrite(GreenPin,LOW);

            digitalWrite(RedPin,HIGH);

            delay(3000);

            digitalWrite(S_yellowpin,HIGH);

            delay(1500);

            digitalWrite(S_redpin,LOW);

            digitalWrite(S_yellowpin,LOW);

            wifiDev.disp().writeOk();

          }

        else if(strcmp(cmd,"ltloff") ==0) {

            digitalWrite(S_greenpin,HIGH);

            digitalWrite(RedPin,HIGH);

            wifiDev.disp().writeOk();

          }

        else {

            wifiDev.disp().writeErr("Unknown cmd"); 

            cmdOK = 0;

          }

 

 

 

    }

 

 

 

    virtual void onSyncMsg()

    {

        lastSyncMillis=millis();

    }

 

 

 

  private:

    ARpcDevice *dev;

}serialEcb(&serialDev),wifiEcb(&wifiDev);

 

 

 

class SrcReadyCb

    :public ARpcISrvReadyCallback

{

public:

    void processSrvReadyMsg(const ARpcUuid &srvId,const char *srvName)

    {

        serialDev.disp().writeInfo("Server detected: ",bCastSenderIp.toString().c_str(),srvName);

        if(client.connected()||connecting)return;

        serialDev.disp().writeInfo("Connecting to server...");

        connecting=true;

        client.connect(bCastSenderIp,port);

        for(int i=0;i<20;++i)

        {

            if(client.connected())

                break;

            delay(100);

        }

        serialDev.disp().writeInfo("Connected to server");

        connecting=false;

        wifiDev.resetParser();

        lastSyncMillis=millis();

    }

}srvReadyCb;

 

 

 

ARpcSrvReady srvReadyParser(200,&srvReadyCb);

 

 

 

void connectWifi()

{

    WiFi.begin(ssid,password);

    while(WiFi.status()!=WL_CONNECTED)

    {

        delay(500);

        serialDev.disp().writeInfo("Wifi connecting");

    }

    serialDev.disp().writeInfo("WiFi connected");

}

 

 

 

void setup() {

  // pin definition

  pinMode(GreenPin, OUTPUT);

  pinMode(RedPin, OUTPUT);

  pinMode(S_greenpin, OUTPUT);

  pinMode(S_yellowpin, OUTPUT);

  pinMode(S_redpin, OUTPUT);

  pinMode(buttonPin, INPUT);

  pinMode(soundPin,OUTPUT);

 

  // other stuff

    delay(2000);

   

    Serial.begin(9600);

    wifiDev.disp().installDevEventsHandler(&wifiEcb);

    wifiDev.disp().setControls(interfaceStr);

  

    serialDev.disp().installDevEventsHandler(&serialEcb);

    serialDev.disp().setControls(interfaceStr);

 

    connectWifi();

 

 

 

    bCastCli.begin(port);

   

    // Start the server

    server.begin();

    serialDev.disp().writeInfo("Server started");

   

    // Print the IP address

    serialDev.disp().writeInfo(WiFi.localIP().toString().c_str());

    serialDev.resetStream();

   

   

}

 

void checkBCastCli()

{

    static int sz=0;

    sz=bCastCli.parsePacket();

    if(sz>0)

    {

        bCastSenderIp=bCastCli.remoteIP();

        for(int i=0;i<sz;++i)

            srvReadyParser.putByte(bCastCli.read());

    }

}

 

 

 

void checkWifiClient()

{

    if(client)

    {

        if(!client.connected())

        {

            serialDev.disp().writeInfo("Client connection lost");

            client=server.available();

            if(client)

            {

                serialDev.disp().writeInfo("Take next pending incoming connection");

                lastSyncMillis=millis();

                wifiDev.resetStream();

                wifiDev.resetParser();

            }

            delay(100);

        }

        else

        {

            while(client.available())

                wifiDev.putByte(client.read());

        }

    }

    else

    {

        client=server.available();

        if(client)

        {

            serialDev.disp().writeInfo("Take next pending incoming connection");

            lastSyncMillis=millis();

            wifiDev.resetStream();

            wifiDev.resetParser();

        }

        delay(100);

    }

}

 

void loop() {

    while(Serial.available())

        serialDev.putByte(Serial.read());

    if(WiFi.status()!=WL_CONNECTED)

        connectWifi();

    checkBCastCli();

    checkWifiClient();

    if(((millis()-lastSyncMillis)>12000)&&client.connected())

    {

        client.stop();

        checkWifiClient();

    }

    delay(50);

 

 

  buttonState = digitalRead(buttonPin);

 

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:

  if (buttonState == HIGH) {

    digitalWrite(S_greenpin,LOW);

    delay(500);

    digitalWrite(S_greenpin,HIGH);

    delay(500);

    digitalWrite(S_greenpin,LOW);

    delay(500);

    digitalWrite(S_greenpin,HIGH);

    delay(500);

    digitalWrite(S_greenpin,LOW);

    delay(500);

    digitalWrite(S_greenpin,HIGH);

    delay(500);

    digitalWrite(S_greenpin,LOW);

    digitalWrite(S_yellowpin,HIGH);  

    delay(2000);

    digitalWrite(S_yellowpin,LOW);

    digitalWrite(S_redpin,HIGH);

    delay(2000);

    digitalWrite(GreenPin,HIGH);

    digitalWrite(RedPin,LOW);

    digitalWrite(soundPin,HIGH);

    delay(3500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    delay(500);

    digitalWrite(soundPin,HIGH);

    digitalWrite(GreenPin,HIGH);

    delay(500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    delay(500);

    digitalWrite(soundPin,HIGH);

    digitalWrite(GreenPin,HIGH);

    delay(500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    delay(500);

    digitalWrite(soundPin,HIGH);

    digitalWrite(GreenPin,HIGH);

    delay(500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    delay(500);

    digitalWrite(soundPin,HIGH);

    digitalWrite(GreenPin,HIGH);

    delay(500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    delay(500);

    digitalWrite(soundPin,HIGH);

    digitalWrite(GreenPin,HIGH);

    delay(500);

    digitalWrite(soundPin,LOW);

    digitalWrite(GreenPin,LOW);

    digitalWrite(RedPin,HIGH);

    delay(3000);

    digitalWrite(S_yellowpin,HIGH);

    delay(1500);

    digitalWrite(S_redpin,LOW);

    digitalWrite(S_yellowpin,LOW);  

  } else {

    // turn LED off:

    digitalWrite(S_greenpin,HIGH);

    digitalWrite(RedPin,HIGH);

  }

}


/messages/6017