#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#include <PubSubClient.h>
#include <WiFi.h>
#include <ArduinoJson.h>
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
const char* mqtt_server = "mqtt.thingsboard.cloud";
const int mqtt_port = 1883;
const char* mqtt_user = "percobaan123";
const char* mqtt_password = "";
const char* mqtt_topic = "v1/devices/me/telemetry";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
LiquidCrystal_I2C lcd(0x27,20,4);
#define DHTPIN 13
#define DHTPIN2 9
#define DHTTYPE DHT22
#define RELAY_PIN 4
#define GPIO0 0
#define GPIO2 2
#define GPIO0_PIN 3
#define GPIO2_PIN 5
// We assume that all GPIOs are LOW
boolean gpioState[] = {false, false};
DHT dht(DHTPIN, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
// Millis untuk pembacaan suhu dan kelembaban
unsigned long lastDHTRead = 0;
const long DHT_INTERVAL = 1000; // Interval pembacaan DHT22 (ms)
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(GPIO0, OUTPUT);
pinMode(GPIO2, OUTPUT);
dht.begin();
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
InitWifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
// Connect to MQTT
connectToMQTT();
}
void loop() {
if (!client.connected()) {
connectToMQTT();
}
if (millis() - lastDHTRead >= DHT_INTERVAL) {
readDHT();
lastDHTRead = millis();
}
// Handle MQTT messages
client.loop();
delay(100); // this speeds up the simulation
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("On message");
char json[length + 1];
strncpy (json, (char*)payload, length);
json[length] = '\0';
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Message: ");
Serial.println(json);
// Decode JSON request
StaticJsonDocument<200> data;
//JsonObject& data = jsonBuffer.parseObject((char*)json);
DeserializationError error = deserializeJson(data, json);
// // Check for parsing errors
// if (error) {
// Serial.print("deserializeJson() failed: ");
// Serial.println(error.c_str());
// return;
// }
// Check request method
String methodName = String((const char*)data["method"]);
if (methodName.equals("getGpioStatus")) {
// Reply with GPIO status
String responseTopic = String(topic);
responseTopic.replace("request", "response");
client.publish(responseTopic.c_str(), get_gpio_status().c_str());
} else if (methodName.equals("setGpioStatus")) {
// Update GPIO status and reply
set_gpio_status(data["params"]["pin"], data["params"]["enabled"]);
String responseTopic = String(topic);
responseTopic.replace("request", "response");
client.publish(responseTopic.c_str(), get_gpio_status().c_str());
client.publish("v1/devices/me/attributes", get_gpio_status().c_str());
}
}
String get_gpio_status() {
// Prepare gpios JSON payload string
StaticJsonDocument<200> data;
data[String(GPIO0_PIN)] = gpioState[0] ? true : false;
data[String(GPIO2_PIN)] = gpioState[1] ? true : false;
char payload[256];
String strPayload = String(payload);
serializeJson(data, strPayload);
Serial.print("Get gpio status: ");
Serial.println(strPayload);
return strPayload;
}
void set_gpio_status(int pin, boolean enabled) {
if (pin == GPIO0_PIN) {
digitalWrite(GPIO0, enabled ? HIGH : LOW);
gpioState[0] = enabled;
} else if (pin == GPIO2_PIN) {
digitalWrite(GPIO2, enabled ? HIGH : LOW);
gpioState[1] = enabled;
}
}
void connectToMQTT() {
while (!client.connected()) {
Serial.println("Connecting to AP ...");
WiFi.begin(ssid, pass, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
Serial.println("Connecting to MQTT...");
if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
Serial.println("Connected to MQTT");
client.subscribe("v1/devices/me/rpc/request/+");
// Sending current GPIO status
Serial.println("Sending current GPIO status ...");
client.publish("v1/devices/me/attributes", get_gpio_status().c_str());
} else {
Serial.print("Failed to connect to MQTT, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}
void InitWifi(){
Serial.println("Connecting to AP ...");
WiFi.begin(ssid, pass, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
}
void readDHT(){
float h = dht.readHumidity();
float t = dht.readTemperature();
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(F("Humidity: "));
Serial.print(h2);
Serial.print(F("% Temperature: "));
Serial.print(t2);
Serial.println(F("°C "));
lcd.backlight();
lcd.setCursor(6,0);
lcd.print("Shed 46");
lcd.setCursor(0,1);
lcd.print("H1:");
lcd.print(h);
lcd.setCursor(9,1);
lcd.print("H2:");
lcd.print(h2);
lcd.setCursor(0,2);
lcd.print("T1:");
lcd.print(t);
lcd.setCursor(9,2);
lcd.print("T2:");
lcd.print(t2);
if (!isnan(h) && !isnan(t)) {
// Create JSON payload
String payload = "{\"temp1\": " + String(t) + ", \"hum1\": " + String(h) + ", \"temp2\": " + String(t2) +", \"hum2\": " + String(h2) +"}";
// Publish to MQTT topic
client.publish(mqtt_topic, payload.c_str());
Serial.println("Data published to MQTT");
delay(500); // Adjust delay as needed
} else {
Serial.println("Failed to read from DHT sensor!");
}
}