#include <DHTesp.h>
#include <WiFi.h>
#include <PubSubClient.h>
// DHT declaration
DHTesp dhtSensor;
TempAndHumidity data;
const int dhtpin = 15;
// Ultrasonic declaration
const int echo = 4;
const int trig = 2;
float distance;
float duration;
const int ledPin = 13; // Pin to which the LED is connected
// PIR declaration
const int pirpin = 14;
// WiFi declaration
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
WiFiClient wifiClient;
// MQTT declaration
const char* mqtt_server = "mqtt.thingsboard.cloud";
const int mqtt_port = 1883;
const char* mqtt_username = "0xurcnlftr9v264nsc99";
const char* mqtt_password = "dp0vw7djl8jh1o2ot97u";
const char* mqtt_clientId = "pmwj0woi8cvxa7v3h7w8";
PubSubClient mqttClient(wifiClient);
void setup() {
Serial.begin(115200);
// Ultrasonic setup
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
// DHT setup
dhtSensor.setup(dhtpin, DHTesp::DHT22);
// PIR setup
pinMode(pirpin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT); // Set the LED pin as an output
// WiFi setup
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
// MQTT setup
mqttClient.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!mqttClient.connected()) {
reconnect();
}
mqttClient.loop();
// Clear Serial Monitor buffer
while (Serial.available()) {
Serial.read();
}
// Check PIR sensor
int motion = digitalRead(pirpin);
Serial.println(motion == HIGH ? "Motion detected!" : "Motion not detected!");
// Turn on the LED when motion is detected
digitalWrite(ledPin, motion);
// Read DHT sensor
readDHTSensor();
// Read distance
distance = getdistance();
Serial.println("Humi:" + String(data.humidity));
Serial.println("Temp:" + String(data.temperature));
Serial.println("Distance:" + String(distance));
Serial.println("<-------------------->");
// Data uploading to Thingsboard via MQTT
char payload[100];
snprintf(payload, sizeof(payload), "{\"temperature\": %.2f, \"humidity\": %.2f, \"distance\": %.2f, \"motion\": %d}",
data.temperature, data.humidity, distance, motion);
mqttClient.publish("v1/devices/me/telemetry", payload);
delay(15000);
}
void readDHTSensor() {
bool success = false;
int attempts = 0;
// Try to read DHT sensor multiple times
while (!success && attempts < 3) {
data = dhtSensor.getTempAndHumidity();
if (!isnan(data.temperature) && !isnan(data.humidity)) {
success = true;
} else {
attempts++;
delay(500); // Delay before retrying
}
}
if (!success) {
Serial.println("Error reading DHT sensor!");
}
}
void reconnect() {
while (!mqttClient.connected()) {
Serial.print("Attempting MQTT connection...");
if (mqttClient.connect(mqtt_clientId, mqtt_username, mqtt_password)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
float getdistance() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
return duration * 0.034 / 2;
}