Guest User

Untitled

a guest
Sep 9th, 2024
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.46 KB | None | 0 0
  1. /*********
  2.   Rui Santos
  3.   Complete instructions at https://RandomNerdTutorials.com/smart-home-ebook/
  4.  
  5.   Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  6.   The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
  7. *********/
  8.  
  9. #include <Arduino.h>
  10.  
  11. #include <ESP8266WiFi.h>
  12. #include <Ticker.h>
  13. #include <AsyncMqttClient.h>
  14.  
  15. #define WIFI_SSID "REDACTED"
  16. #define WIFI_PASSWORD "REDACTED"
  17.  
  18. #define MQTT_HOST IPAddress(192, 168, 1, REDACTED)
  19. #define MQTT_PORT 1883
  20. #define BROKER_USER "REDACTED"
  21. #define BROKER_PASS "REDACTED"
  22.  
  23. AsyncMqttClient mqttClient;
  24. Ticker mqttReconnectTimer;
  25.  
  26. WiFiEventHandler wifiConnectHandler;
  27. WiFiEventHandler wifiDisconnectHandler;
  28. Ticker wifiReconnectTimer;
  29.  
  30.  
  31. unsigned long previousMillis = 0;   // Stores last time a message was published
  32. const long interval = 10000;        // Interval at which to publish values
  33.  
  34. void connectToWifi() {
  35.   Serial.println("Connecting to Wi-Fi...");
  36.   WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  37. }
  38.  
  39. void connectToMqtt() {
  40.   Serial.println("Connecting to MQTT...");
  41.   mqttClient.connect();
  42. }
  43.  
  44. void onWifiConnect(const WiFiEventStationModeGotIP& event) {
  45.   Serial.println("Connected to Wi-Fi.");
  46.   connectToMqtt();
  47. }
  48.  
  49. void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
  50.   Serial.println("Disconnected from Wi-Fi.");
  51.   mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
  52.   wifiReconnectTimer.once(2, connectToWifi);
  53. }
  54.  
  55. void onMqttConnect(bool sessionPresent) {
  56.   Serial.println("Connected to MQTT.");
  57.   Serial.print("Session present: ");
  58.   Serial.println(sessionPresent);
  59.  
  60.   // Subscribe to topic "led" when it connects to the broker
  61.   uint16_t packetIdSub = mqttClient.subscribe("led", 2);
  62.   Serial.print("Subscribing at QoS 2, packetId: ");
  63.   Serial.println(packetIdSub);
  64.  
  65.   // Publish on the "test" topic with qos 0
  66.   mqttClient.publish("test", 0, true, "test 1");
  67.   Serial.println("Publishing at QoS 0");
  68.  // Publish on the "test" topic with qos 1
  69.   uint16_t packetIdPub1 = mqttClient.publish("test", 1, true, "test 2");
  70.   Serial.print("Publishing at QoS 1, packetId: ");
  71.   Serial.println(packetIdPub1);
  72.   // Publish on the "test" topic with qos 2
  73.   uint16_t packetIdPub2 = mqttClient.publish("test", 2, true, "test 3");
  74.   Serial.print("Publishing at QoS 2, packetId: ");
  75.   Serial.println(packetIdPub2);
  76. }
  77.  
  78. void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
  79.   Serial.println("Disconnected from MQTT.");
  80.  
  81.   if (WiFi.isConnected()) {
  82.     mqttReconnectTimer.once(2, connectToMqtt);
  83.   }
  84. }
  85.  
  86. void onMqttSubscribe(uint16_t packetId, uint8_t qos) {
  87.   Serial.println("Subscribe acknowledged.");
  88.   Serial.print("  packetId: ");
  89.   Serial.println(packetId);
  90.   Serial.print("  qos: ");
  91.   Serial.println(qos);
  92. }
  93.  
  94. void onMqttUnsubscribe(uint16_t packetId) {
  95.   Serial.println("Unsubscribe acknowledged.");
  96.   Serial.print("  packetId: ");
  97.   Serial.println(packetId);
  98. }
  99.  
  100. void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) {
  101.   // Do whatever you want when you receive a message
  102.  
  103.   // Save the message in a variable
  104.   String receivedMessage;
  105.   for (int i = 0; i < len; i++) {
  106.     Serial.println((char)payload[i]);
  107.     receivedMessage += (char)payload[i];
  108.   }
  109.   // Turn the LED on or off accordingly to the message content
  110.   if (strcmp(topic, "led") == 0) {
  111.     if (receivedMessage == "true"){
  112.       digitalWrite(LED_BUILTIN, HIGH);
  113.     }
  114.     if (receivedMessage == "false"){
  115.       digitalWrite(LED_BUILTIN, LOW);
  116.     }
  117.   }
  118.   Serial.println("Publish received.");
  119.   Serial.print("  topic: ");
  120.   Serial.println(topic);
  121.   Serial.print("  qos: ");
  122.   Serial.println(properties.qos);
  123.   Serial.print("  dup: ");
  124.   Serial.println(properties.dup);
  125.   Serial.print("  retain: ");
  126.   Serial.println(properties.retain);
  127.   Serial.print("  len: ");
  128.   Serial.println(len);
  129.   Serial.print("  index: ");
  130.   Serial.println(index);
  131.   Serial.print("  total: ");
  132.   Serial.println(total);
  133. }
  134.  
  135. void onMqttPublish(uint16_t packetId) {
  136.   Serial.println("Publish acknowledged.");
  137.   Serial.print("  packetId: ");
  138.   Serial.println(packetId);
  139. }
  140.  
  141. void setup() {
  142.   Serial.begin(115200);
  143.   Serial.println();
  144.   Serial.println();
  145.   pinMode (LED_BUILTIN, OUTPUT);
  146.  
  147.   wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
  148.   wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
  149.  
  150.   mqttClient.onConnect(onMqttConnect);
  151.   mqttClient.onDisconnect(onMqttDisconnect);
  152.   mqttClient.onSubscribe(onMqttSubscribe);
  153.   mqttClient.onUnsubscribe(onMqttUnsubscribe);
  154.   mqttClient.onMessage(onMqttMessage);
  155.   mqttClient.onPublish(onMqttPublish);
  156.   mqttClient.setServer(MQTT_HOST, MQTT_PORT);
  157.   mqttClient.setCredentials(BROKER_USER, BROKER_PASS);
  158.  
  159.  
  160.   connectToWifi();
  161. }
  162.  
  163. void loop() {
  164.  
  165.   unsigned long currentMillis = millis();
  166.   // Every X number of seconds (interval = 10 seconds)
  167.   // it publishes a new MQTT message
  168.   if (currentMillis - previousMillis >= interval) {
  169.     // Save the last time a new reading was published
  170.     previousMillis = currentMillis;
  171.  
  172.   // Publish an MQTT message on topic counter
  173.   uint16_t packetIdPub1 = mqttClient.publish("counter", 1, true, String(random(0,20)).c_str());
  174.   Serial.printf("Publishing on topic %s at QoS 1, packetId: %i", "counter", packetIdPub1);
  175.   }
  176. }
Advertisement
Add Comment
Please, Sign In to add comment