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

ESP32 + MQTT(SSL) + Relay

Тема в разделе "Раздел для начинающих", создана пользователем emaus, 7 ноя 2019.

Метки:
  1. emaus

    emaus Новичок

    Сообщения:
    11
    Симпатии:
    0
    Всем привет.
    Есть ESP32-Wroom-32 и скетч в котором реализовано сбор данных с датчиков и переключение реле по протоколу MQTT с использованием SSL сертификатов. Сбор данных с датчиков происходит хорошо(проблем нет), но вот не получается дергать реле, скорей всего что-то не так с callback.
    Скетч прилагаю, может кто знает что в нем не так.
    ЗЫ: Скет собран из нескольких :)
    Код (Text):
    1. #include <WiFi.h>
    2. #include "src/dependencies/WiFiClientSecure/WiFiClientSecure.h" //using older WiFiClientSecure
    3. #include <PubSubClient.h>
    4. #include "uptime_formatter.h"
    5. #include "DHT.h"
    6. //#include <time.h>
    7. //#include "secrets.h"
    8.  
    9. #ifndef SECRET
    10. const char ssid[] = "ssid";
    11. const char pass[] = "pass";
    12.  
    13. #define HOSTNAME "mqtt_test"
    14.  
    15. const char *MQTT_HOST = "host";
    16. const int   MQTT_PORT = port;
    17. const char *MQTT_USER = "user"; // leave blank if no credentials used
    18. const char *MQTT_PASS = "pass"; // leave blank if no credentials used
    19.  
    20. const char* local_root_ca = \
    21. "-----BEGIN CERTIFICATE-----\n" \
    22.  
    23. "-----END CERTIFICATE-----\n";
    24.  
    25. #endif
    26.  
    27. void callback(char* topic, byte* payload, unsigned int length);
    28. //void callback(const char* topic, byte* payload, unsigned int length);
    29.  
    30. //Relay
    31. const int switchPin0 = 0;
    32. const int switchPin1 = 2;
    33. const int switchPin2 = 4;
    34. const int switchPin3 = 15;
    35.  
    36. //Sensors
    37. #define DHTPIN1 27    // Pin sur lequel est branché le DHT In sensor
    38. #define DHTPIN2 26    // Pin sur lequel est branché le DHT Out sensor
    39.  
    40. // Dé-commentez la ligne qui correspond à votre capteur
    41. //#define DHTTYPE DHT11       // DHT 11
    42. #define DHTTYPE1 DHT22         // DHT 22  (AM2302)
    43. #define DHTTYPE2 DHT22         // DHT 22  (AM2302)
    44.  
    45. //Création des objets
    46. DHT dht1(DHTPIN1, DHTTYPE1);
    47. DHT dht2(DHTPIN2, DHTTYPE1);
    48.  
    49. //Topic ralay
    50. char const* switchTopic1 = "/greenhouse/in/relay1/linmoto1/";
    51. char const* switchTopic2 = "/greenhouse/in/relay1/linmoto2/";
    52. char const* switchTopic3 = "/greenhouse/in/relay1/pump1/";
    53. char const* switchTopic4 = "/greenhouse/in/relay1/pump2/";
    54.  
    55. //Topic sensors
    56. #define temperature_sensor1_topic "/greenhouse/in/sensor1/temp/"  //Topic température
    57. #define humidity_sensor1_topic "/greenhouse/in/sensor1/hum/"        //Topic humidité
    58. #define temperature_sensor2_topic "/greenhouse/out/sensor2/temp/"  //Topic température
    59. #define humidity_sensor2_topic "/greenhouse/out/sensor2/hum/"        //Topic humidité
    60.  
    61. //Topic ESP32 sys RSSI and uptime
    62. #define esp32_rssi "/greenhouse/sys/rssi/"
    63. #define esp32_uptime "/greenhouse/sys/uptime/"
    64.  
    65. WiFiClientSecure net;
    66. PubSubClient client(net);
    67.  
    68. time_t now;
    69. unsigned long lastMillis = 0;
    70.  
    71. void mqtt_connect(){
    72.     while (!client.connected()) {
    73.     //Serial.print("Time:");
    74.     //Serial.print(ctime(&now));
    75.     Serial.print("MQTT connecting");
    76.     if (client.connect(HOSTNAME, MQTT_USER, MQTT_PASS)) {
    77.       Serial.println("connected");
    78.     } else {
    79.       Serial.print("failed, status code =");
    80.       Serial.print(client.state());
    81.       Serial.println("try again in 5 seconds");
    82.       /* Wait 5 seconds before retrying */
    83.       delay(5000);
    84.     }
    85.   }
    86.  
    87. }
    88.  
    89. void receivedCallback(char* topic, byte* payload, unsigned int length) {
    90. Serial.print("Received [");
    91. Serial.print(topic);
    92. Serial.print("]: ");
    93. for (int i = 0; i < length; i++) {
    94.     Serial.print((char)payload[i]);
    95.   }
    96. }
    97.  
    98. void setup(){
    99.   Serial.begin(115200);
    100.  
    101.   //initialize the switch as an output and set to LOW (off)
    102.   pinMode(switchPin0, OUTPUT); // Relay Switch 1
    103.   digitalWrite(switchPin0, LOW);
    104.  
    105.   pinMode(switchPin1, OUTPUT); // Relay Switch 2
    106.   digitalWrite(switchPin1, LOW);
    107.  
    108.   pinMode(switchPin2, OUTPUT); // Relay Switch 3
    109.   digitalWrite(switchPin2, LOW);
    110.  
    111.   pinMode(switchPin3, OUTPUT); // Relay Switch 4
    112.   digitalWrite(switchPin3, LOW);
    113.  
    114.   //Sensors
    115.   dht1.begin();
    116.   dht2.begin();
    117.  
    118.   Serial.print("Attempting to connect to SSID: ");
    119.   Serial.println(ssid);
    120.   WiFi.setHostname(HOSTNAME);
    121.   WiFi.mode(WIFI_AP_STA);
    122.   WiFi.begin(ssid, pass);
    123.   while (WiFi.status() != WL_CONNECTED){
    124.     Serial.print(".");
    125.     delay(1000);
    126.   }
    127.   Serial.println();
    128.   Serial.print("Connected to ");
    129.   Serial.println(ssid);
    130.  
    131.   /*
    132.   Serial.print("Setting time using SNTP");
    133.   configTime(+3 * 3600, 0, "0.ru.pool.ntp.org", "1.ru.pool.ntp.org");
    134.   now = time(nullptr);
    135.   while (now < 1510592825) {
    136.     delay(500);
    137.     Serial.print(".");
    138.     now = time(nullptr);
    139.   }
    140.   Serial.println("");
    141.   struct tm timeinfo;
    142.   gmtime_r(&now, &timeinfo);
    143.   Serial.print("Current time: ");
    144.   Serial.print(asctime(&timeinfo));
    145. */
    146.   net.setCACert(local_root_ca);
    147.   client.setServer(MQTT_HOST, MQTT_PORT);
    148.   client.setCallback(receivedCallback);
    149.   mqtt_connect();
    150. }
    151.  
    152. // Relay 4
    153. void callback(char* topic, byte* payload, unsigned int length) {
    154.   //convert topic to string to make it easier to work with
    155.   String topicStr = topic;
    156.   //EJ: Note:  the "topic" value gets overwritten everytime it receives confirmation (callback) message from MQTT
    157.  
    158.   //Print out some debugging info
    159.   Serial.println("Callback update.");
    160.   Serial.print("Topic: ");
    161.   Serial.println(topicStr);
    162.  
    163.    if (topicStr == "/greenhouse/in/relay1/linmoto1/")
    164.     {
    165.  
    166.      //turn the switch on if the payload is '1' and publish to the MQTT server a confirmation message
    167.      if(payload[0] == '1'){
    168.        digitalWrite(switchPin0, HIGH);
    169.        client.publish("/greenhouse/in/relay1/linmoto1/confirm/", "1");
    170.        }
    171.  
    172.       //turn the switch off if the payload is '0' and publish to the MQTT server a confirmation message
    173.      else if (payload[0] == '0'){
    174.        digitalWrite(switchPin0, LOW);
    175.        client.publish("/greenhouse/in/relay1/linmoto1/confirm/", "0");
    176.        }
    177.      }
    178.  
    179.      // EJ: copy and paste this whole else-if block, should you need to control more switches
    180.      else if (topicStr == "/greenhouse/in/relay1/linmoto2/")
    181.      {
    182.      //turn the switch on if the payload is '1' and publish to the MQTT server a confirmation message
    183.      if(payload[0] == '1'){
    184.        digitalWrite(switchPin1, HIGH);
    185.        client.publish("/greenhouse/in/relay1/linmoto2/confirm/", "1");
    186.        }
    187.  
    188.       //turn the switch off if the payload is '0' and publish to the MQTT server a confirmation message
    189.      else if (payload[0] == '0'){
    190.        digitalWrite(switchPin1, LOW);
    191.        client.publish("/greenhouse/in/relay1/linmoto2/confirm/", "0");
    192.        }
    193.      }
    194.      else if (topicStr == "/greenhouse/in/relay1/pump1/")
    195.      {
    196.      //turn the switch on if the payload is '1' and publish to the MQTT server a confirmation message
    197.      if(payload[0] == '1'){
    198.        digitalWrite(switchPin2, HIGH);
    199.        client.publish("/greenhouse/in/relay1/pump1/confirm/", "1");
    200.        }
    201.  
    202.       //turn the switch off if the payload is '0' and publish to the MQTT server a confirmation message
    203.      else if (payload[0] == '0'){
    204.        digitalWrite(switchPin2, LOW);
    205.        client.publish("/greenhouse/in/relay1/pump1/confirm/", "0");
    206.        }
    207.      }
    208.      else if (topicStr == "/greenhouse/in/relay1/pump2/")
    209.      {
    210.      //turn the switch on if the payload is '1' and publish to the MQTT server a confirmation message
    211.      if(payload[0] == '1'){
    212.        digitalWrite(switchPin3, HIGH);
    213.        client.publish("/greenhouse/in/relay1/pump2/confirm/", "1");
    214.        }
    215.  
    216.       //turn the switch off if the payload is '0' and publish to the MQTT server a confirmation message
    217.      else if (payload[0] == '0'){
    218.        digitalWrite(switchPin3, LOW);
    219.        client.publish("/greenhouse/in/relay1/pump2/confirm/", "0");
    220.        }
    221.      }
    222. }
    223.  
    224. void loop(){
    225.   now = time(nullptr);
    226.   //Lecture de l'humidité ambiante
    227.    float h1 = dht1.readHumidity();
    228.    float h2 = dht2.readHumidity();
    229.    // Lecture de la température en Celcius
    230.    float t1 = dht1.readTemperature();
    231.    float t2 = dht2.readTemperature();
    232.    
    233.   if (WiFi.status() != WL_CONNECTED){
    234.     Serial.print("Checking wifi");
    235.     while (WiFi.waitForConnectResult() != WL_CONNECTED)
    236.     {
    237.       WiFi.begin(ssid, pass);
    238.       Serial.print(".");
    239.       delay(10);
    240.     }
    241.     Serial.println("connected");
    242.   }
    243.   else{
    244.     if (!client.connected())
    245.     {
    246.       mqtt_connect();
    247.     }
    248.     else
    249.     {
    250.       client.loop();
    251.     }
    252.   }
    253.  
    254.   if (millis() - lastMillis > 5000) {
    255.     lastMillis = millis();
    256.     client.publish(temperature_sensor1_topic, String(t1).c_str(), true);   //Publie la température sur le topic temperature_topic
    257.     client.publish(humidity_sensor1_topic, String(h1).c_str(), true);      //Et l'humidité
    258.     client.publish(temperature_sensor2_topic, String(t2).c_str(), true);   //Publie la température sur le topic temperature_topic
    259.     client.publish(humidity_sensor2_topic, String(h2).c_str(), true);      //Et l'humidité
    260.     client.publish(esp32_uptime, String("up " + uptime_formatter::getUptime()).c_str(), true); //systeam uptime
    261.     client.publish(esp32_rssi, String(WiFi.RSSI()).c_str(), true); //systeam rssi
    262.   }
    263. }
     
  2. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    625
    Симпатии:
    73
    Вы сообщаете клиенту какую функцию вызывать client.setCallback(receivedCallback); при поручении сообщения,
    а подписку на сообщения не выполняете, client.subscribe("inTopic");
    клиент, соединившись с брокером не сообщает на какие топики он подписан.
     
    emaus нравится это.
  3. emaus

    emaus Новичок

    Сообщения:
    11
    Симпатии:
    0
    Спасибо, все заработало :)
     
  4. kamfur

    kamfur Новичок

    Сообщения:
    1
    Симпатии:
    0
    Спасибо мне тоже очень помогло, 2 недели бился, но не знаю как работать с классами библиотек. СПС
     

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