#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
#include <ArduinoJson.h>
#define CURRENT_FIRMWARE_TITLE "DEVICE_1"
#define CURRENT_FIRMWARE_VERSION "1.0.0"
#define DHT_PIN 15
#define LDR_PIN 34
#define LED1_PIN 2
#define LED2_PIN 4
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define TOKEN "1lm1unl3djg1avo6lti9"
#define THINGSBOARD_SERVER "thingsboard.cloud"
#define SERIAL_DEBUG_BAUD 115200
DHTesp dhtSensor;
WiFiClient espClient;
PubSubClient mqttClient(espClient);
unsigned long lastMsg = 0;
unsigned long now = 0;
const float gama = 0.7;
const float rl10 = 50;
boolean gpioState[] = {false, false}; // Store the states of the GPIOs
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String messageTemp;
for (int i = 0; i < length; i++) {
messageTemp += (char)payload[i];
}
Serial.println(messageTemp);
// Parse JSON payload
DynamicJsonDocument doc(1024);
deserializeJson(doc, messageTemp);
String method = doc["method"];
JsonObject params = doc["params"];
if (method == "setGpioStatus") {
int pin = params["pin"];
bool enabled = params["enabled"];
if (pin == 3) { // Assume GPIO0_PIN equivalent is 3
digitalWrite(LED1_PIN, enabled ? HIGH : LOW);
gpioState[0] = enabled;
Serial.print("LED1 ");
Serial.println(enabled ? "ON" : "OFF");
} else if (pin == 5) { // Assume GPIO2_PIN equivalent is 5
digitalWrite(LED2_PIN, enabled ? HIGH : LOW);
gpioState[1] = enabled;
Serial.print("LED2 ");
Serial.println(enabled ? "ON" : "OFF");
}
// Send back the status after setting GPIO
String responseTopic = String(topic);
responseTopic.replace("request", "response");
mqttClient.publish(responseTopic.c_str(), get_gpio_status().c_str());
mqttClient.publish("v1/devices/me/attributes", get_gpio_status().c_str());
} else if (method == "getGpioStatus") {
String responseTopic = String(topic);
responseTopic.replace("request", "response");
mqttClient.publish(responseTopic.c_str(), get_gpio_status().c_str());
}
}
String get_gpio_status() {
DynamicJsonDocument doc(200);
doc[String(3)] = gpioState[0] ? true : false;
doc[String(5)] = gpioState[1] ? true : false;
String payload;
serializeJson(doc, payload);
Serial.print("Get GPIO status: ");
Serial.println(payload);
return payload;
}
void wifiSetup() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(WIFI_SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void mqttConnect() {
while (!mqttClient.connected()) {
Serial.println("Connecting to ThingsBoard...");
if (mqttClient.connect("ESP32Client", TOKEN, "")) {
Serial.println("Connected to ThingsBoard");
mqttClient.subscribe("v1/devices/me/rpc/request/+");
Serial.println("Sending current GPIO status...");
mqttClient.publish("v1/devices/me/attributes", get_gpio_status().c_str());
} else {
Serial.print("Failed to connect, state = ");
Serial.print(mqttClient.state());
Serial.println(". Try again in 5 seconds...");
delay(5000);
}
}
}
void setup() {
Serial.begin(SERIAL_DEBUG_BAUD);
pinMode(DHT_PIN, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
wifiSetup();
mqttClient.setServer(THINGSBOARD_SERVER, 1883);
mqttClient.setCallback(callback);
mqttConnect();
}
void loop() {
if (!mqttClient.connected()) {
mqttConnect();
}
mqttClient.loop();
now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
TempAndHumidity data = dhtSensor.getTempAndHumidity();
int nilaiLDR = analogRead(LDR_PIN);
nilaiLDR = map(nilaiLDR, 4095, 0, 1024, 0);
float voltase = nilaiLDR / 1024.0 * 5.0;
float resistansi = 2000 * voltase / (1-voltase/5);
float kecerahan = pow(rl10 * 1e3 * pow(10, gama) / resistansi, (1/gama));
if (dhtSensor.getStatus() == DHTesp::ERROR_NONE) {
Serial.printf("Temperature: %.2f°C, Humidity: %.2f%%, Lux: %.2f\n", data.temperature, data.humidity, kecerahan);
String payload = "{\"temperature\":" + String(data.temperature) + ",\"humidity\":" + String(data.humidity) + ",\"lux\":" + String(kecerahan) + "}";
mqttClient.publish("v1/devices/me/telemetry", payload.c_str());
} else {
Serial.println("Failed to read from DHT sensor");
}
}
}