9.3. Публикация данных датчиков в темы брокера на примере NodeMCU
9.3. Публикация данных датчиков в темы брокера на примере NodeMCU
Рассмотрим подоробнее отправку данных с датчиков нашего умного дома брокеру. Будем отправлять брокеру данные с двух датчиков DHT22 и DS18B20. Правки осуществляем в скетче из предыдущей главы. Устанавливаем количество виджетов для отображения по количеству датчиков:

const int nWidgets = 2;
String stat        [nWidgets];
String sTopic      [nWidgets];
String color       [nWidgets];
String style       [nWidgets];
String badge       [nWidgets];
String widget      [nWidgets];
String descr       [nWidgets];
String page        [nWidgets];
String thing_config[nWidgets];
String id          [nWidgets];
int    pin         [nWidgets];
float    defaultVal  [nWidgets];
bool   inverted    [nWidgets];


В процедуре initVar() прописываем настройки для виджетов, параметр page[] (вкладка(страница) в Iot Manager для отображения виджетов) устанавливаем SensorsNodemcu, параметр pin[] нам не нужен, т.к. данные датчиков мы будем получать программно, а не с пинов, тип для defaultVal[] назначаем float.

    id    [0] = "0";
  page  [0] = "SensorsNodemcu";
  descr  [0] = "DHT22";
  widget[0] = "small-badge";
  //pin   [0] = A0; 
  sTopic[0] = prefix + "/" + deviceID + "/DHT22";
  badge [0] = "\"badge\":\"badge-calm\"";                  
  style [0]   = "\"style\":\"font-size:150%;\"";

  id    [1] = "1";
  page  [1] = " SensorsNodemcu ";
  descr  [1] = "DS18b20";
  widget[1] = "small-badge";
  //pin   [1] = A0;                                          
  sTopic[1] = prefix + "/" + deviceID + "/DS18b20";
  badge [1] = "\"badge\":\"badge-calm\"";                  
  style [1]   = "\"style\":\"font-size:150%;\"";


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

  thing_config[0] = "{\"id\":\"" + id[0] + "\",\"page\":\"" + page[0]+"\",\"descr\":\"" + descr[0] + "\",\"widget\":\"" + widget[0] + "\",\"topic\":\"" + sTopic[0] + "\"," + badge[0] + "," + style[0] + "}";  // DHT11
  thing_config[1] = "{\"id\":\"" + id[1] + "\",\"page\":\"" + page[1]+"\",\"descr\":\"" + descr[1] + "\",\"widget\":\"" + widget[1] + "\",\"topic\":\"" + sTopic[1] + "\"," + badge[1] + "," + style[1] + "}";  // ds18b20

Вносим изменения в функцию 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[0] + "/control") {
   // DHT22
    } else if (sub.topic() == sTopic[1] + "/control") {
   // DS18B20 display only
    } else if (sub.topic() == prefix) {
      if (sub.payload_string() == "HELLO") {
        pubConfig();
      }
    }
}


Данные отправляем каждые 10 сек:

   if (client.connected()) {
      newtime = millis();
      if (newtime - oldtime > 10000) { // 10 sec
        float x = get_data_humidity();
        val = "{\"status\":\"" + String(x)+ "\"}";
        client.publish(sTopic[0] + "/status", val ); // widget 0
        x = get_data_ds18b20();
        val = "{\"status\":\"" + String(x)+ "\"}";
        client.publish(sTopic[1] + "/status", val ); // widget 1
        oldtime = newtime;
      }
      client.loop();
    }


Функции получения данных с датчиков DHT22 – get_data_humidity():

float get_data_humidity() {
   float h = dht.readHumidity();
   return h;
}

И датчика температуры DS18B20 – get_data_ds18b20():



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


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

И смотрим данные на смартфоне в приложении IoT Manager (рис. 9.14).
 


Рис. 9.14. Отображение даных на смартфоне в приложении IoT Manager.

Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке. Вы можете самостоятельно добавить отправку данных с датчиков  увлажненности почвы, уровня воды, огня, с датчиков газа.


Вверх