// Library
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// Relay Declaration
const int relay = 26; // << ini tambahkan
// WiFi Connection
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Protocol Declaration
const char* mqtt_server = "broker.emqx.io";
const int mqtt_port = 1883;
const char* mqtt_username = "emqx";
const char* mqtt_password = "public";
// Topic Declaration for IOT MQTT Panel
const char* temperatureTopic = "emqx/suhulana";
const char* humidityTopic = "emqx/humdlana";
const char* ledTopic = "emqx/ledlana"; // << ini tambahkan
// DHT22 Declaration
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Millis declaration
long now = millis();
long lastMeasure = 0; // initial value
// WiFi & Client Publish Declaration
WiFiClient espClient;
PubSubClient client(espClient);
// Callback function (to call the topic)
void callback(char *topic, byte *payload, unsigned int length){
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print(". Message: ");
String messageTemp; // <<< ini tambahkan
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
messageTemp += (char)payload[i]; // <<< ini tambahkan
}
Serial.println();
}
// WiFI connection function
void wifiConn(){
// Connecting to a WiFi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
//delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the Wi-Fi network");
// Connecting to a mqtt server
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback); // Calling callback parameter
// Connecting Proccess
while (!client.connected()) {
String client_id = "esp32-client-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public MQTT broker\n",
client_id.c_str());
// WiFi Condition
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Public EMQX MQTT broker connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void setup(){
// Set software serial baud to 9600;
Serial.begin(9600);
pinMode(relay, OUTPUT); // << tambahkan ini
// Calling wifiConn function
wifiConn(); // Ini cara memanggil fungsi wifi Conn
// Start and initialize the dht object
dht.begin();
}
void loop() {
// Repeat sending sensor data
client.loop();
/* Fungsi Millis untuk menjalankan waktu internal setiap milli seconds
pada ESP32 secara independent
ketika millis di baca maka millis akan terus
menghitung waktu walaupun ESP32nya sedang menjalankan
program yang lain
*/
now = millis();
// Scanning Process
if(now - lastMeasure > 2000){
lastMeasure = now;
float h = dht.readHumidity();
float t = dht.readTemperature();
float hic = dht.computeHeatIndex(t, h, false);
// Check if any reads failed and exit early (to try again)
if(isnan(h) || isnan(t)){
Serial.println("Failed to read from DHT sensor!");
return;
}else{
// Client Publish
client.publish(humidityTopic, String(h).c_str());
client.publish(temperatureTopic, String(t).c_str());
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.println(" *C ");
boolean z; // << ini tambahkan
if((t > 28)&&(h <= 60)){
digitalWrite(relay, LOW);
int z = 0;
Serial.print("Relay: OFF ");
client.publish(ledTopic, String(z).c_str());
}
else if((t > 23)&&(h > 60)){
digitalWrite(relay, HIGH);
int z = 1;
Serial.print("Relay: ON ");
client.publish(ledTopic, String(z).c_str());
}
else{
digitalWrite(relay, LOW);
int z = 0;
Serial.print("Relay: OFF ");
client.publish(ledTopic, String(z).c_str());
}
}
}
}
/* Exercise:
1. if t > 28 and h <= 60, then Relay OFF, Suhu Dingin
2. if t > 23 and t <= 28, then Relay OFF, Suhu Dingin
3. if t < 23 and h > 60, then Relay ON, Suhu Panas
*/