#include <LiquidCrystal_I2C.h>
#include <DHTesp.h>
#include <HTTPClient.h>
#include <WiFi.h>
#include <PubSubClient.h> // Include the MQTT library
#define LED_PIN 32
#define DHT_PIN 15
#define MOTION_PIN 12
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
int motion_detec = 0;
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
const char* MQTT_BROKER = "broker.emqx.io"; // MQTT broker address
const char* clientID = "ujaisldaaasdfgh;laslksdja1";
// Parameters for using non-blocking delay
unsigned long previousMillis = 0;
const long interval = 1000;
String msgStr = ""; // MQTT message buffer
float temp, humid;
DHTesp dhtSensor;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
void setup_wifi() {
delay(10);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, pass);
while(WiFi.status() != WL_CONNECTED){
delay(100);
Serial.println(".");
}
Serial.println("WiFi Connected!");
Serial.println(WiFi.localIP());
//config LED_PIN output
pinMode(LED_PIN, OUTPUT);
pinMode(DHT_PIN, INPUT);
pinMode(MOTION_PIN, INPUT);
//setup for serial communication
Serial.begin(9600);
Serial.println("ESP32 collecting sensors data");
//Setup DHT to according PIN
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(1,0);
lcd.print("ESP32 collecting data ...");
setup_wifi();
mqttClient.setServer(MQTT_BROKER, 1883); // Connect to MQTT broker
mqttClient.setCallback(mqttCallback); // Set the callback function for MQTT messages
delay(1000);
}
void loop() {
if (!mqttClient.connected()) {
reconnect();
}
mqttClient.loop();
unsigned long currentMillis = millis(); // Read current time
if (currentMillis - previousMillis >= interval) { // If current time - last time > 5 sec
previousMillis = currentMillis;
lcd.clear();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
temp = data.temperature;
humid = data.humidity;
lcd.setCursor(0,0);
lcd.print("Temp: " + String(temp));
lcd.setCursor(0,1);
lcd.print("Humidity: " + String(humid) +"%");
msgStr = String(temp) + "," + String(humid) + ",";
byte arrSize = msgStr.length() + 1;
char msg[arrSize];
Serial.print("PUBLISH DATA: ");
Serial.println(msgStr);
msgStr.toCharArray(msg, arrSize);
mqttClient.publish("sensor", msg);
msgStr = "";
delay(1);
}
//Turn on led if motion sensor return true
// motion_detec = digitalRead(MOTION_PIN);
// if(motion_detec == 1){
// digitalWrite(LED_PIN, true);
// Serial.println("Motion detected!");
// }
// else{
// digitalWrite(LED_PIN, false);
// }
}
void reconnect() {
while (!mqttClient.connected()) {
if (mqttClient.connect(clientID)) {
Serial.println("MQTT connected");
mqttClient.subscribe("led");
mqttClient.subscribe("sensor");
Serial.println("Topic Subscribed");
}
else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
delay(5000); // wait 5sec and retry
}
}
}
void mqttCallback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
if (String(topic) == "led") {
Serial.println(message);
if (message == "ON" || message == "on") {
digitalWrite(LED_PIN, true);
} else if (message == "OFF" || message == "off") {
digitalWrite(LED_PIN, false);
}
}
}