docs

a slatepencil documentail site

View on GitHub

ESP32 MQTT

prerequirments

hardware

wires

DHT11 ESP32
0 3.3v
1 - 220ohm GPIO(4)
2  
3 GND
BMP180 ESP32
3.3v 3.3v
GND GND
SCL D22
SDA D21

code

#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <DHT.h>
#include <AsyncMqttClient.h>
#include <WiFi.h>

#define WIFI_SSID "ChinaNet-Utng"
#define WIFI_PASSWORD "password"
#define MQTT_HOST IPAddress(192, 168, 1, 5)
#define MQTT_PORT 1883
#define MQTT_USERNAME "username"
#define MQTT_PASSWORD "password"
#define MQTT_PUB_TEMP "monitor/temperature"
#define MQTT_PUB_HUM "monitor/humidity"
#define MQTT_PUB_TEMP2 "monitor/temperature2"
#define MQTT_PUB_PRESSURE "monitor/pressure"
#define MQTT_PUB_ALTITUDE "monitor/altitude"
#define MQTT_PUB_SEALEVEL "monitor/sealevel"
// Digital pin connected to the DHT sensor
#define DHTPIN 4

#define DHTTYPE DHT11  // DHT 11
int btnGPIO = 0;
int btnState = false;

// Initialize DHT sensor
DHT dht(DHTPIN, DHTTYPE);

// Variables to hold DHT11 sensor readings
float temp;
float hum;
// Variables tp hold BMP180 sensor readings
float temperature2;
float pressure;
float altitude;
float sealevel;

AsyncMqttClient mqttClient;
TimerHandle_t mqttReconnectTimer;
TimerHandle_t wifiReconnectTimer;

unsigned long previousMillis = 0;  // Stores last time temperature was published
const long interval = 10000;       // Interval at which to publish sensor readings

Adafruit_BMP085 bmp;

void connectToWifi() {
  Serial.println("Connecting to Wi-Fi...");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}

void connectToMqtt() {
  Serial.println("Connecting to MQTT...");
  mqttClient.connect();
}

void WiFiEvent(WiFiEvent_t event) {
  Serial.printf("[WiFi-event] event: %d\n", event);
  switch (event) {
    case SYSTEM_EVENT_STA_GOT_IP:
      Serial.println("WiFi connected>>>");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      connectToMqtt();
      break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
      Serial.println("WiFi lost connection<<<");
      xTimerStop(mqttReconnectTimer, 0);  // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
      xTimerStart(wifiReconnectTimer, 0);
      break;
  }
  // switch (WiFi.status()) {
  //   case WL_NO_SSID_AVAIL:
  //     Serial.println("[WiFi] SSID not found");
  //     break;
  //   case WL_CONNECT_FAILED:
  //     Serial.print("[WiFi] Failed - WiFi not connected! Reason: ");
  //     return;
  //     break;
  //   case WL_CONNECTION_LOST:
  //     Serial.println("[WiFi] Connection was lost");
  //     break;
  //   case WL_SCAN_COMPLETED:
  //     Serial.println("[WiFi] Scan is completed");
  //     break;
  //   case WL_DISCONNECTED:
  //     Serial.println("[WiFi] WiFi is disconnected");
  //     break;
  //   case WL_CONNECTED:
  //     Serial.println("[WiFi] WiFi is connected!");
  //     Serial.print("[WiFi] IP address: ");
  //     Serial.println(WiFi.localIP());
  //     return;
  //     break;
  //   default:
  //     Serial.print("[WiFi] WiFi Status: ");
  //     Serial.println(WiFi.status());
  //     break;
  // }
}

void onMqttConnect(bool sessionPresent) {
  Serial.println("Connected to MQTT.");
  Serial.print("Session present: ");
  Serial.println(sessionPresent);

  uint16_t packetIdSub = mqttClient.subscribe("control/relay_1", 2);
  Serial.print("Subscribing at QoS 2, packetId: ");
  Serial.println(packetIdSub);
}

void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
  Serial.println("Disconnected from MQTT...");
  if (WiFi.isConnected()) {
    xTimerStart(mqttReconnectTimer, 0);
  }
}
void onMqttSubscribe(uint16_t packetId, uint8_t qos) {
  Serial.println("Subscribe acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
  Serial.print("  qos: ");
  Serial.println(qos);
}
void onMqttUnsubscribe(uint16_t packetId) {
  Serial.println("Unsubscribe acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
}
void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) {
  Serial.println("Publish received.");
  Serial.print(" topic: ");
  Serial.println(topic);
  Serial.print(" qos: ");
  Serial.println(properties.qos);
  Serial.print(" dup: ");
  Serial.println(properties.dup);
  Serial.print(" retain: ");
  Serial.println(properties.retain);
  Serial.print(" len ");
  Serial.println(len);
  Serial.print(" index: ");
  Serial.println(index);
  Serial.print(" total: ");
  Serial.println(total);
  Serial.print(" payload ");
  Serial.println(payload);
}
void onMqttPublish(uint16_t packetId) {
  Serial.print("Publish acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
}
void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP085/BMP180 sensor, check wiring!");
    while (1)
      ;
  }

  dht.begin();
  // Set GPIO0 Boot button as input
  pinMode(btnGPIO, INPUT);

  // We start by connecting to a WiFi network
  // To debug, please enable Core Debug Level to Verbose

  Serial.println();
  Serial.print("[WiFi] Connecting to ");
  Serial.println(WIFI_SSID);

  mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
  wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi));

  WiFi.onEvent(WiFiEvent);
  mqttClient.onConnect(onMqttConnect);
  mqttClient.onDisconnect(onMqttDisconnect);
  mqttClient.onSubscribe(onMqttSubscribe);
  mqttClient.onUnsubscribe(onMqttUnsubscribe);
  mqttClient.onMessage(onMqttMessage);
  mqttClient.onPublish(onMqttPublish);
  mqttClient.setServer(MQTT_HOST, MQTT_PORT);
  // If your broker requires authentication (username and password), set them below
  // mqttClient.setCredentials("REPlACE_WITH_YOUR_USER", "REPLACE_WITH_YOUR_PASSWORD");
  mqttClient.setCredentials(MQTT_USERNAME, MQTT_PASSWORD);
  connectToWifi();
}

void loop() {
  // Read the button state
  btnState = digitalRead(btnGPIO);

  if (btnState == LOW) {
    // Disconnect from WiFi
    Serial.println("[WiFi] Disconnecting from WiFi!");
    // This function will disconnect and turn off the WiFi (NVS WiFi data is kept)
    if (WiFi.disconnect(true, false)) {
      Serial.println("[WiFi] Disconnected from WiFi!");
    }
    delay(1000);
  }
  unsigned long currentMillis = millis();
  // Every X number of seconds (interval = 10 seconds)
  // it publishes a new MQTT message
  if (currentMillis - previousMillis >= interval) {
    // Save the last time a new reading was published
    previousMillis = currentMillis;
    // New DHT sensor readings
    hum = dht.readHumidity();
    // Read temperature as Celsius (the default)
    temp = dht.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    //temp = dht.readTemperature(true);
    temperature2 = bmp.readTemperature();
    pressure = bmp.readPressure();
    altitude = bmp.readAltitude();
    sealevel = bmp.readSealevelPressure();
    // Check if any reads failed and exit early (to try again).
    if (isnan(temp) || isnan(hum)) {
      Serial.println(F("Failed to read from DHT sensor!"));
      return;
    }
    if (isnan(temperature2) || isnan(pressure) || isnan(altitude) || isnan(sealevel)) {
      Serial.println(F("Failed to read from BMP180 sensor!"));
      return;
    }

    // Publish an MQTT message on topic esp32/dht/temperature
    uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temp).c_str());
    Serial.printf("Topic %s at QoS 1, packetId: %i", MQTT_PUB_TEMP, packetIdPub1);
    Serial.printf(" Temperature: %.2f \n", temp);

    // Publish an MQTT message on topic esp32/dht/humidity
    uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(hum).c_str());
    Serial.printf("Topic %s at QoS 1, packetId %i: ", MQTT_PUB_HUM, packetIdPub2);
    Serial.printf(" Humidity: %.2f \n", hum);

    uint16_t packetIdPub3 = mqttClient.publish(MQTT_PUB_TEMP2, 1, true, String(temperature2).c_str());
    Serial.printf("Topic %s at QoS 1, packetId %i: ", MQTT_PUB_TEMP2, packetIdPub3);
    Serial.printf(" Temperature2: %.2f \n", temperature2);
    uint16_t packetIdPub4 = mqttClient.publish(MQTT_PUB_PRESSURE, 1, true, String(pressure).c_str());
    Serial.printf("Topic %s at QoS 1, packetId %i: ", MQTT_PUB_PRESSURE, packetIdPub4);
    Serial.printf(" Pressure: %.2f \n", pressure);
    uint16_t packetIdPub5 = mqttClient.publish(MQTT_PUB_ALTITUDE, 1, true, String(altitude).c_str());
    Serial.printf("Topic %s at QoS 1, packetId %i: ", MQTT_PUB_ALTITUDE, packetIdPub5);
    Serial.printf(" Altitude: %.2f \n", altitude);
    uint16_t packetIdPub6 = mqttClient.publish(MQTT_PUB_SEALEVEL, 1, true, String(sealevel).c_str());
    Serial.printf("Topic %s at QoS 1, packetId %i: ", MQTT_PUB_SEALEVEL, packetIdPub6);
    Serial.printf(" Sealevel: %.2f \n", sealevel);
  }
}