9.4. Управление из IoT Manager исполнительными устройствами на плате NodeMCU
В данной главе рассмотрим управление исполнительными устройствами, подключенными к NodeMCU, из мобильного приложения IoT Manager. В скетч для NodeMCU необходимо внести следующие изменения. Изменяем количество виджетов для отображения (увеличение на количество исполнительных устройств):
const int nWidgets = 5;
В процедуре initVar() прописываем настройки для виджетов управления исполнительными устройствами, нам необходим виджет toggle.  Параметру page[] присваиваем значение RelaysNodemcu, что позволит на экране мобильного приложения IoT Manager разделять датчики и исполнительные устройства по разным вкладкам.

  id    [2] = "2";
  page  [2] = "RelaysNodeMcu";
  descr [2] = "Light";
  widget[2] = "toggle";
  //pin[0] = 4;                                            
  defaultVal[2] = 0;                                       
  inverted[2] = false;
  sTopic[2]   = prefix + "/" + deviceID + "/light";
  color[2]   = "\"color\":\"red\"";                       
  id    [3] = "3";
  page  [3] = "RelaysNodeMcu";
  descr [3] = "Pump";
  widget[3] = "toggle";
  //pin[0] = 4;                                            
  defaultVal[3] = 0;                                       
  inverted[3] = false;
  sTopic[3]   = prefix + "/" + deviceID + "/pump";
  color[3]   = "\"color\":\"red\"";                       

  id    [4] = "4";
  page  [4] = "RelaysNodeMcu";
  descr [4] = "Fun";
  widget[4] = "toggle";
  //pin[0] = 4;                                            
  defaultVal[4] = 0;                                       
  inverted[4] = false;
  sTopic[4]   = prefix + "/" + deviceID + "/fun";
  color[4]   = "\"color\":\"red


Добавляем параметры конфигурации отображения виджетов управления исполнительными устройствами, которые необходимо направить брокеру:

thing_config[2] = "{\"id\":\"" + id[2] + "\",\"page\":\"" + page[2]+"\",\"descr\":\"" + descr[2] + "\",\"widget\":\"" + widget[2] + "\",\"topic\":\"" + sTopic[2] + "\"," + color[2] + "}";
  thing_config[3] = "{\"id\":\"" + id[3] + "\",\"page\":\"" + page[3]+"\",\"descr\":\"" + descr[3] + "\",\"widget\":\"" + widget[3] + "\",\"topic\":\"" + sTopic[3] + "\"," + color[3] + "}";
  thing_config[4] = "{\"id\":\"" + id[4] + "\",\"page\":\"" + page[4]+"\",\"descr\":\"" + descr[4] + "\",\"widget\":\"" + widget[4] + "\",\"topic\":\"" + sTopic[4] + "\"," + color[4] + "}";

Необходимо обрабатывать получаемые из брокера сообщения об изменении статуса исполнительных устройств. Вносим изменения в функцию callback:

void callback(const MQTT::Publish& sub) {
  Serial.print("Get data from subscribed topic ");
  Serial.print(sub.topic());
  Serial.print(" => ");
  Serial.println(sub.payload_string());

  if (sub.topic() == sTopic[2] + "/control") {
    if (sub.payload_string() == "0") {
       newValue = 1; // inverted
       stat[2] = stat0;
    } else {
       newValue = 0; // inverted
       stat[2] = stat1;
    }
    digitalWrite(pin[2],newValue);
    pubStatus(sTopic[2], stat[2]);
    } else if (sub.topic() == sTopic[0] + "/control") {
   // ADC : nothing, display only
    } else if (sub.topic() == sTopic[1] + "/control") {
   // ADC : nothing, display only
    } else if (sub.topic() == sTopic[2] + "/control") {
    if (sub.payload_string() == "0") {
       newValue = 1; // inverted
       stat[2] = stat0;
    } else {
       newValue = 0; // inverted
       stat[2] = stat1;
    }
    datarelays[0]= newValue;
    set_status_relays();
    pubStatus(sTopic[2], stat[2]);
    } else if (sub.topic() == sTopic[3] + "/control") {
    if (sub.payload_string() == "0") {
       newValue = 1; // inverted
       stat[3] = stat0;
    } else {
       newValue = 0; // inverted
       stat[3] = stat1;
    }
    datarelays[1]= newValue;
    set_status_relays();
    pubStatus(sTopic[3], stat[3]);
    } else if (sub.topic() == sTopic[4] + "/control") {
    if (sub.payload_string() == "0") {
       newValue = 1; // inverted
       stat[4] = stat0;
    } else {
       newValue = 0; // inverted
       stat[4] = stat1;
    }
    datarelays[2]= newValue;
    set_status_relays();
    pubStatus(sTopic[4], stat[4]);
    } else if (sub.topic() == prefix) {
    if (sub.payload_string() == "HELLO") {
      pubConfig();
    }
 }
}


Функция set_status_relays() включает/выключает исполнительные устройства:

void set_status_relays() {
  int relays=0;
  for(int i=0;i<7;i++)
     relays=relays +( datarelays[i]<<i);
  // записать данные в PORT B
  Wire.beginTransmission(0x20);
  Wire.write(0x13); // address PORT B
  Wire.write(leds);    // PORT B
  Wire.endTransmission();
  delay(100); // пауза
}


Скачиваем полный скетч на сайте www.arduino-kit.ru по ссылке. Загружаем его на плату NodeMCU, открываем монитор последовательного порта и видим отправку данных с датчиков (рис. 9.15).
 


Рис. 9.15. Лог отправки в мониторе последовательного порта Arduino IDE.

И смотрим данные на смартфоне в приложении IoT Manager (рис. 9.16). Виджеты получения данных и управления исполнительными устройствами расположены в разных вкладках (рис. 9.17).
 


Рис. 9.16. Отображение виджетов на смартфоне в приложении IoT Manager (вкладка Все).
 


Рис. 9.17. Вкладка виджетов управления исполнительными устройствами.

Изменение состояния toggle к публикации измененных данных в тему /IoTmanager/SmarhouseNodemcu/xxx и плата NodeMCU, получая эти данные(см. рис. 9.18), изменяет состояние соответствующего исполнительного устройства.
 


Рис. 9.18. Получение данных платой NodeMCU.

Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке.


 

Вверх