#include <WiFi.h>
#include "PubSubClient.h"
#include <ArduinoJson.h>
#include "DHTesp.h"
#define DHT_PIN 15
#define PIR_SENSOR 25
#define LED_PIN 32
DHTesp dhtSensor;
const char* mqttServer = "broker.hivemq.com";
int port = 1883;
char clientId[50];
WiFiClient espClient;
PubSubClient client(espClient);
const char* name = "DHT11";
void setup() {
Serial.begin(9600);
delay(10);
Serial.println();
// connect to wifi
Serial.print("Connecting to ");
Serial.println("Wokwi-GUEST");
wifiConnect();
Serial.println("");
Serial.println("WiFi connected");
// set up pubsubclient
client.setServer(mqttServer, port);
client.setCallback(callback);
// set up DHT22 sensor
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// set up PIR sensor
pinMode(PIR_SENSOR, INPUT);
// set up LED
pinMode(LED_PIN, OUTPUT);
// set up Serial
Serial.print("ESP32 collecting sensors data");
delay(100);
Serial.println();
}
void wifiConnect() {
WiFi.mode(WIFI_STA);
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
void mqttReconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (client.connect(clientId)) {
Serial.print(clientId);
Serial.println(" connected");
client.subscribe("team_tung_bien_manh_duc_from_device");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length) {
// read message
StaticJsonDocument<256> jsonmsg;
deserializeJson(jsonmsg, message, length);
float temp = jsonmsg["temperature"];
float humid = jsonmsg["humidity"];
int pir = jsonmsg["pir"];
// output to LED if message from pir sensor
if(pir > 1e-5){
if(pir==2){
// motion detected
digitalWrite(LED_PIN, HIGH);
Serial.println("Motion detected");
}
else if(pir==1){
// motion stoped
digitalWrite(LED_PIN, LOW);
Serial.println("Motion stopped");
}
}
}
void loop() {
if (!client.connected()) {
mqttReconnect();
}
client.loop();
static uint32_t timer_for_dht = millis();
uint32_t cur_time = millis();
if (cur_time - timer_for_dht > 2000) {
// read value from DHT sensor, every 2s
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float temp = data.temperature;
float humid = data.humidity;
// update timer
timer_for_dht = cur_time;
// prepare message for mqtt
DynamicJsonDocument jsonmsg(1024);
jsonmsg["name"] = name;
jsonmsg["information"]["temperature"] = temp;
jsonmsg["information"]["humidity"] = humid;
char msg[100];
serializeJson(jsonmsg, msg);
// send message, check error
if (client.publish("team_tung_bien_manh_duc_from_device", msg) != true)
Serial.println("Error sending message");
}
}