#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);
}
}