#include <DHTesp.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h> // Make sure to include the ArduinoJson library
#define WIFI_AP_NAME "Wokwi-GUEST" // Define WiFi SSID
#define WIFI_PASSWORD "" // Define WiFi password, empty if open
#define TOKEN "zyo4pzjnobkeaxz7bniu" // ThingsBoard Device Token
#define THINGSBOARD_SERVER "thingsboard.cloud" // ThingsBoard Server URL
#define SERIAL_DEBUG_BAUD 115200 // Serial connection speed for debug
#define DHT_PIN 16 // Pin connected to the DHT sensor
#define LED_PIN 12 // Define the LED pin (change as needed)
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
DHTesp dht;
void setup() {
pinMode(LED_PIN, OUTPUT); // Set the LED pin as an output
digitalWrite(LED_PIN, LOW); // Start with the LED off
Serial.begin(SERIAL_DEBUG_BAUD); // Start the serial communication
WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD); // Connect to WiFi network
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
mqttClient.setServer(THINGSBOARD_SERVER, 1883); // Set the MQTT server
mqttClient.setCallback(mqttCallback); // Set the MQTT callback function
connectToMQTT(); // Connect to MQTT Broker
dht.setup(DHT_PIN, DHTesp::DHT22); // Initialize the DHT sensor
}
void loop() {
if (!mqttClient.connected()) {
connectToMQTT();
}
mqttClient.loop();
// Handle Serial command input to control the LED
if (Serial.available() > 0) {
String command = Serial.readStringUntil('\n');
handleSerialCommand(command);
}
static unsigned long lastSendTime = 0;
if (millis() - lastSendTime > 100) { // Send data every 2 seconds
sendDHTData();
lastSendTime = millis();
}
}
void connectToMQTT() {
while (!mqttClient.connected()) {
Serial.println("Connecting to MQTT...");
if (mqttClient.connect("ESP32Client", TOKEN, NULL)) {
Serial.println("Connected to MQTT");
mqttClient.subscribe("v1/devices/me/rpc/request/+"); // Subscribe to RPC requests
} else {
Serial.print("Failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void sendDHTData() {
TempAndHumidity lastValues = dht.getTempAndHumidity();
if (!isnan(lastValues.humidity) && !isnan(lastValues.temperature)) {
String payload = String("{\"temperature\":") + lastValues.temperature +
", \"humidity\":" + lastValues.humidity + "}";
mqttClient.publish("v1/devices/me/telemetry", payload.c_str());
Serial.println("Data sent: " + payload);
} else {
Serial.println("Failed to read from DHT sensor!");
}
}
void mqttCallback(char* topic, byte* payload, unsigned int length) {
String message;
for (unsigned int i = 0; i < length; i++) {
message += (char)payload[i];
}
message.trim();
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, message);
if (!error) {
String method = doc["method"];
bool params = doc["params"];
if (method == "setState") {
digitalWrite(LED_PIN, params ? HIGH : LOW); // Set LED state based on params
Serial.println(params ? "LED turned ON via ThingsBoard" : "LED turned OFF via ThingsBoard");
// Report the change back to ThingsBoard
String telemetry = String("{\"LED State\":") + (params ? "\"ON\"" : "\"OFF\"") + "}";
mqttClient.publish("v1/devices/me/telemetry", telemetry.c_str());
} else if (method == "getState") {
// Report current state
bool currentState = digitalRead(LED_PIN) == HIGH;
String telemetry = String("{\"LED State\":") + (currentState ? "\"ON\"" : "\"OFF\"") + "}";
mqttClient.publish("v1/devices/me/telemetry", telemetry.c_str());
}
}
}
void handleSerialCommand(String command) {
command.trim();
if (command.equalsIgnoreCase("ON")) {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED turned ON via Serial");
mqttClient.publish("v1/devices/me/telemetry", "{\"LED\":\"ON\"}");
} else if (command.equalsIgnoreCase("OFF")) {
digitalWrite(LED_PIN, LOW);
Serial.println("LED turned OFF via Serial");
mqttClient.publish("v1/devices/me/telemetry", "{\"LED\":\"OFF\"}");
}
}