Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Esp8266 и mqtt

Тема в разделе "Общие вопросы по esp8266", создана пользователем YDen, 22 июн 2018.

  1. YDen

    YDen Новичок

    Сообщения:
    33
    Симпатии:
    0
    Добрый всем.
    Подскажите пожалуйста. Есп 8266 в исполнении NodeMcu, с подключенным дисплеем на MAX7219 и датчиком освещенности. Есп разговаривает по mqtt с другими девайсами, в частности сервером УД majordomo. Подписок на топики - 7. Шлет сообщения на 4 топика - настроены таймеры отправки. Так же настроена удаленная прошивка по веб.
    С неясной периодичностью есп теряет связь с mqtt - перестает слать\получать сообщения. Но пинг идет, прошивка "залетает". После перезагрузки модуль начинает работать нормально.
    Ниже прикладываю код (строки управляющие дисплеем выпилил), может что не так закодил:
    Код (Text):
    1.  
    2.  
    3. #include <WiFiUdp.h>
    4. #include <PubSubClient.h>
    5. #include <ESP8266WiFi.h>
    6. #include <ESP8266WebServer.h>
    7. #include <Adafruit_GFX.h>
    8. #include <ESP8266mDNS.h>
    9.  
    10. // =======================================================================
    11. // Конфигурация устройства:
    12. // =======================================================================
    13. const char* host = "informer_in";
    14. const char* ssid     = "***";                      // SSID
    15. const char* password = "***";                    // пароль
    16. // =======================================================================
    17.  
    18. const char *mqtt_server = "192.168.1.70"; // Имя сервера MQTT
    19. const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
    20. const char *mqtt_user = "****"; // Логи от сервер
    21. const char *mqtt_pass = "****"; // Пароль от сервера
    22.  
    23. WiFiClient wclient;
    24. PubSubClient client(wclient);
    25.  
    26. int clouds;
    27. float windSpeed;
    28. float temp = 0;
    29. String date;
    30. String line;
    31. String currencyRates;
    32. String scroll_String;
    33. String text1;
    34.  
    35. //датчик света
    36. const int inRaw = A0; //вход датчик света
    37. int raw = 0; //сила света
    38. int raw_mean = 0; //сила света среднее
    39. int raw_old = 0; //сила света
    40.  
    41. String t_out;
    42. String t_out_delta;
    43. String t_out_delta_sym;
    44. String t_banya;
    45. String t_banya_delta;
    46. String t_banya_delta_sym;
    47. String p_atm;
    48. String p_atm_delta;
    49. String p_atm_delta_sym;
    50.  
    51. boolean mqtt_light_banya = false; //флаг включения света баня
    52.  
    53. //подсчет времени
    54. long previousMillis_time = 0;  // храним время последнего подключения
    55. long interval_time = 3600000;     //интервал 1 час
    56.  
    57. //raw
    58. long previousMillis_raw = 0;  // храним время последнего подключения
    59. long interval_raw = 300000;     //интервал
    60.  
    61. //mqtt
    62. long previousMillis_mqtt = 0;  // храним время последнего подключения
    63. long interval_mqtt = 10000;     //интервал
    64.  
    65. //mqtt raw
    66. long previousMillis_mqtt_raw = 0;  // храним время последнего подключения
    67. long interval_mqtt_raw = 300000;     //интервал
    68.  
    69. //wifi
    70. long previousMillis_wifi = 0;  // храним время последнего подключения
    71. long interval_wifi = 10000;     //интервал
    72. unsigned long currentMillis_wifi = 0;
    73.  
    74. // =======================================================================
    75. // Функция получения данных от сервера
    76. void callback(char* topic, byte* payload, unsigned int length)
    77. {
    78.   //--------------------------------------------------------------------------------------
    79.   //температура баня
    80.   if (String(topic) == "ihouse/climat/banya/temp")
    81.   {
    82.     t_banya = "";
    83.     for (int i = 0; i < length; i++)
    84.     {
    85.       t_banya = t_banya +(char)payload[i];
    86.     }
    87.   }
    88.   if (String(topic) == "ihouse/climat/banya/tempDelta")
    89.   {
    90.     t_banya_delta = "";
    91.     for (int i = 0; i < length; i++)
    92.     {
    93.       t_banya_delta = t_banya_delta +(char)payload[i];
    94.     }
    95.   }
    96.  
    97.   //--------------------------------------------------------------------------------------
    98.   //температура улица
    99.   if (String(topic) == "ihouse/climat/out/temp")
    100.   {
    101.     t_out = "";
    102.     for (int i = 0; i < length; i++)
    103.     {
    104.       t_out = t_out +(char)payload[i];
    105.     }
    106.   }
    107.   if (String(topic) == "ihouse/climat/out/tempDelta")
    108.   {
    109.     t_out_delta = "";
    110.     for (int i = 0; i < length; i++)
    111.     {
    112.       t_out_delta = t_out_delta +(char)payload[i];
    113.     }
    114.   }
    115.  
    116.   //--------------------------------------------------------------------------------------
    117.   //давление
    118.   if (String(topic) == "ihouse/climat/out/pressAtm")
    119.   {
    120.     p_atm = "";
    121.     for (int i = 0; i < length; i++)
    122.     {
    123.       p_atm = p_atm +(char)payload[i];
    124.     }
    125.   }
    126.   if (String(topic) == "ihouse/climat/out/pressAtmDelta")
    127.   {
    128.     p_atm_delta = "";
    129.     for (int i = 0; i < length; i++)
    130.     {
    131.       p_atm_delta = p_atm_delta +(char)payload[i];
    132.     }
    133.   }
    134.  
    135.   //--------------------------------------------------------------------------------------
    136.   //свет баня
    137.   if (String(topic) == "ihouse/svet/banya/in")
    138.   {
    139.     if ((char)payload[0] == '1') mqtt_light_banya = true;
    140.     if ((char)payload[0] == '0') mqtt_light_banya = false;
    141.   }
    142. }
    143.  
    144. // =======================================================================
    145. void reconnect()
    146. {
    147.   // подключаемся к MQTT серверу
    148.   if (WiFi.status() == WL_CONNECTED)
    149.   {
    150.     if (!client.connected())
    151.     {
    152.       Serial.print("Attempting MQTT connection...");
    153.       if (client.connect("informer_in",mqtt_user, mqtt_pass))
    154.       {
    155.         //подписываемся по топики
    156.         client.subscribe("ihouse/climat/out/temp");
    157.         client.loop();
    158.         client.subscribe("ihouse/climat/out/tempDelta");
    159.         client.loop();
    160.         client.subscribe("ihouse/climat/banya/temp");
    161.         client.loop();
    162.         client.subscribe("ihouse/climat/banya/tempDelta");
    163.         client.loop();
    164.         client.subscribe("ihouse/svet/banya/in");
    165.         client.loop();
    166.         client.subscribe("ihouse/climat/out/pressAtm");
    167.         client.loop();
    168.         client.subscribe("ihouse/climat/out/pressAtmDelta");
    169.         client.loop();
    170.       }
    171.     }    
    172.   }
    173. }
    174.  
    175. // =======================================================================
    176. void setup_wifi()
    177. {
    178.     if (currentMillis_wifi - previousMillis_wifi > interval_wifi)
    179.     {
    180.       WiFi.begin(ssid, password); //конектимся
    181.       previousMillis_wifi = currentMillis_wifi;
    182.     }
    183. }
    184.  
    185. // =======================================================================
    186. void setup()
    187. {
    188.   // Удаляем предыдущие конфигурации WIFI сети
    189.   WiFi.disconnect(); // обрываем WIFI соединения
    190.   WiFi.softAPdisconnect(); // отключаем отчку доступа(если она была
    191.   WiFi.mode(WIFI_OFF); // отключаем WIFI
    192.   delay(500);
    193.  
    194.   // присваиваем статичесий IP адрес
    195.   WiFi.mode(WIFI_STA); // режим клиента
    196.   WiFi.config(IPAddress(192, 168, 1, 71), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 1));
    197.  
    198.   WiFi.begin(ssid, password);
    199.   delay(10);
    200.  
    201.   client.setServer(mqtt_server, mqtt_port);
    202.   client.setCallback(callback);
    203.  
    204.   pinMode(inRaw,  INPUT);
    205.  
    206.   Serial.begin(115200);                           // Дебаг
    207.  
    208. }
    209.  
    210. // =======================================================================
    211. // Функция отправки в mqtt
    212. void TempSend()
    213. {
    214.   unsigned long currentMillis_mqtt = millis();
    215.   unsigned long currentMillis_mqtt_raw = millis();
    216.  
    217.   if (currentMillis_mqtt - previousMillis_mqtt >= interval_mqtt)
    218.   {
    219.     previousMillis_mqtt = currentMillis_mqtt;
    220.     client.publish("ihouse/work/informerIn", String(random(1000)).c_str());
    221.   }
    222.  
    223.   if (h != h_old)
    224.   {
    225.     client.publish("ihouse/clock/h", String(h).c_str());
    226.     h_old = h;
    227.   }
    228.  
    229.   if (m != m_old)
    230.   {
    231.     client.publish("ihouse/clock/m", String(m).c_str());
    232.     m_old = m;
    233.   }
    234.  
    235.   if (currentMillis_mqtt_raw - previousMillis_mqtt_raw >= interval_mqtt_raw)
    236.   {
    237.     previousMillis_mqtt_raw = currentMillis_mqtt_raw;
    238.     client.publish("ihouse/raw", String(raw).c_str()); // отправляем в топик значение освещенности
    239.   }
    240.   delay(10);
    241. }
    242.  
    243. // =======================================================================
    244. void loop()
    245. {
    246.  
    247.   unsigned long currentMillis_time = millis();
    248.   unsigned long currentMillis_raw = millis();
    249.   unsigned long currentMillis_wifi = millis();
    250.  
    251.   //--------------------------------------------------------------------------------------
    252.   if (WiFi.status() != WL_CONNECTED) //если нет подключения к вифи
    253.   {
    254.     setup_wifi();
    255.   }
    256.  
    257.   //--------------------------------------------------------------------------------------
    258.   if (!client.connected())
    259.   {
    260.     reconnect();                                          
    261.   }
    262.  
    263.   //--------------------------------------------------------------------------------------
    264.   raw = analogRead(inRaw);
    265.  
    266.   //запуск синхронизации времени
    267.   if (currentMillis_time - previousMillis_time >= interval_time)
    268.   {
    269.     previousMillis_time = currentMillis_time;
    270.     getTime();
    271.   }
    272.    
    273.   client.loop();
    274.   TempSend();
    275.  
    276. }
    277.  
    благодарю
     

Поделиться этой страницей