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

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

источник: https://www.yaplakal.com/forum2/topic1966000.html

 

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

  1. Плата NodeMCU
  2. Насос https://iarduino.ru/shop/Mehanika/membrannyy-nasos.html
  3. Силовой ключ https://iarduino.ru/shop/Expansion-payments/silovoy-klyuch-trema-modul.html
  4. Провода
  5. Основание
  6. RGB светодиод
  7. Резисторы 3 шт.
  8. Блоки питания 12В и 5В


 

источник: https://www.chipdip.ru/product/micro-water-pump

 

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


Чтобы подключить светодиод рекомендуем  вам посмотреть следующую лабораторную работу: 




Для того чтобы подключить насос, посмотрите следующие материалы: 

Замечание: Так-как на плате NodeMCU нет напряжения от 5В, то вам нужно подключить силовой ключ к внешнему источнику питания. 

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

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

 

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

Скетч: 
 

void setLeds(int r,int g,int b)
{
    digitalWrite(D1,r);
    digitalWrite(D2,g);
    digitalWrite(D3,b);
    delay(500);
}
byte pump = D0;


void setup() {
pinMode(D1,OUTPUT);
pinMode(D2,OUTPUT);
pinMode(D3,OUTPUT);
pinMode(pump,OUTPUT);


}

void loop() {
digitalWrite(pump,HIGH);
setLeds(HIGH,LOW,LOW);
setLeds(LOW,HIGH,LOW);
setLeds(LOW,LOW,HIGH);
setLeds(LOW,HIGH,HIGH);
setLeds(HIGH,LOW,HIGH);
setLeds(HIGH,HIGH,LOW);
setLeds(HIGH,HIGH,HIGH);
}

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

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

void setup() {}

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

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

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

void loop() {}

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

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

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

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

Задержка

void setLeds(int r,int g,int b)
{
    digitalWrite(D1,r);
    digitalWrite(D2,g);
    digitalWrite(D3,b);
    delay(500);
}

Функция с аргументамы r,g, и b. Аргументы могут имеет значения либо HIGH либо LOW. 

setLeds(HIGH,LOW,LOW);

Команда которая говорит что аргумент r=HIGH (красный светодиод горит), g=LOW (зелёный диод не горит) и b=LOW (синий диод тоже не горит).

 

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

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

Перед началом работы рекомендуем прочитать материалы, расположенные в 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="Fountain";  // naziv uredjaja

const ARpcUuid deviceId("{f7bd39cd-53b9-4f2b-b487-cee1b80d2e3f}");
 

const char *interfaceStr="<controls>"

"<group title=\"FOUNTAIN_SETTINGS\">"

  "<control title=\"PUMP ON\" command=\"pumpon\"/>"

  "<control title=\"RGB ON\" command=\"rgbon\"/>"

  "<control title=\"PUMP OFF\" command=\"pumpoff\"/>"

  "<control title=\"RGB OFF\" command=\"rgboff\"/>"

"</group>"

"</controls>";
 

byte pump = D0;

void setLeds(int r, int g, int b)

{

  digitalWrite(D1,r);

  digitalWrite(D2,g);

  digitalWrite(D3,b);

  delay(500);

}

 

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,"pumpon")   ==0) {

            digitalWrite(pump,HIGH);

            wifiDev.disp().writeOk();

          }

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

          setLeds(HIGH,LOW,LOW);

          setLeds(LOW,HIGH,LOW);

          setLeds(LOW,LOW,HIGH);

          setLeds(LOW,HIGH,HIGH);

          setLeds(HIGH,LOW,HIGH);

          setLeds(HIGH,HIGH,LOW);

          setLeds(HIGH,HIGH,HIGH);

          wifiDev.disp().writeOk();

          }

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

         

            digitalWrite(pump,LOW);

            wifiDev.disp().writeOk();

          }

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

         

            setLeds(LOW,LOW,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(pump,OUTPUT);

  pinMode(D1,OUTPUT);

  pinMode(D2,OUTPUT);

  pinMode(D3,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())

//    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 или передаче информации парсеру.  

 

/messages/6020