#include <WiFi.h>
#include <DHTesp.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
WiFiClient client;
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
#define IO_USERNAME "savetheday"
#define IO_KEY "aio_tLbV6613x1k6aO64nw9ahrlans1l"
#define DHTPIN1 17
#define DHTPIN2 16
#define RELAY1_PIN 12 // Pin untuk relay 1
#define RELAY2_PIN 14 // Pin untuk relay 2
#define BUTTON1_PIN 4 // Pin untuk push button 1
#define BUTTON2_PIN 0 // Pin untuk push button 2
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, IO_USERNAME, IO_KEY);
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/Suhu_Ruang");
Adafruit_MQTT_Publish Humidity1 = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/Kelembapan_Ruang");
Adafruit_MQTT_Publish Humidity2 = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/Kelembapan_Tanah");
Adafruit_MQTT_Subscribe relay1 = Adafruit_MQTT_Subscribe(&mqtt, IO_USERNAME "/feeds/Lampu");
Adafruit_MQTT_Subscribe relay2 = Adafruit_MQTT_Subscribe(&mqtt, IO_USERNAME "/feeds/Saklar Pompa");
DHTesp dht1;
DHTesp dht2;
void setup() {
Serial.begin(115200);
dht1.setup(DHTPIN1, DHTesp::DHT22);
dht2.setup(DHTPIN2, DHTesp::DHT22);
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
Serial.print("Wifi Connecting.");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.println("Wifi connected!");
Serial.println("Local IP: " + String(WiFi.localIP()));
// Connect to Adafruit IO
connect();
}
// Connect to Adafruit IO via MQTT
void connect() {
Serial.print(F("Connecting to Adafruit IO... "));
int8_t ret;
while ((ret = mqtt.connect()) != 0) {
switch (ret) {
case 1: Serial.println(F("Wrong protocol")); break;
case 2: Serial.println(F("ID rejected")); break;
case 3: Serial.println(F("Server unavail")); break;
case 4: Serial.println(F("Bad user/pass")); break;
case 5: Serial.println(F("Not authed")); break;
case 6: Serial.println(F("Failed to subscribe")); break;
default: Serial.println(F("Connection failed")); break;
}
if (ret >= 0)
mqtt.disconnect();
Serial.println(F("Retrying connection..."));
delay(10000);
}
Serial.println(F("Adafruit IO Connected!"));
mqtt.subscribe(&relay1);
mqtt.subscribe(&relay2);
}
void loop() {
if (!mqtt.connected()) {
connect();
}
Adafruit_MQTT_Subscribe *subscription;
TempAndHumidity data1 = dht1.getTempAndHumidity();
TempAndHumidity data2 = dht2.getTempAndHumidity();
float temp1 = data1.temperature;
float hum1 = data1.humidity;
float hum2 = data2.humidity;
Serial.println("DHT 22:");
Serial.print("Suhu: ");
Serial.print(temp1, 2);
Serial.println(" °C");
Serial.print("Kelembaban: ");
Serial.print(hum1, 2);
Serial.println(" %");
Serial.println("Soil Moisture:");
Serial.print("Kelembaban: ");
Serial.print(hum2, 2);
Serial.println(" %");
delay(5000);
while ((subscription = mqtt.readSubscription(2000))) {
if (subscription == &relay1) {
Serial.print(F("Got: "));
Serial.println((char *)relay1.lastread);
char *value = (char *)relay1.lastread;
// Uncomment Serial print sections for debugging
//Serial.print(F("Received: ")); // Display the value received from dashboard
//Serial.println(value);
// Apply message to OnOff
String message = String(value);
message.trim();
if (message == "ON") {
digitalWrite(RELAY1_PIN, HIGH);
Serial.println("Relay 1 ON");
}
if (message == "OFF") {
digitalWrite(RELAY1_PIN, LOW);
Serial.println("Relay 1 OFF");
}
}
}
while ((subscription = mqtt.readSubscription(2000))) {
if (subscription == &relay2) {
Serial.print(F("Got: "));
Serial.println((char *)relay2.lastread);
char *value = (char *)relay2.lastread;
// Uncomment Serial print sections for debugging
//Serial.print(F("Received: ")); // Display the value received from dashboard
//Serial.println(value);
// Apply message to OnOff
String message = String(value);
message.trim();
if (message == "ON") {
digitalWrite(RELAY2_PIN, HIGH);
Serial.println("Relay 1 ON");
}
if (message == "OFF") {
digitalWrite(RELAY2_PIN, LOW);
Serial.println("Relay 1 OFF");
}
}
}
if (!Temperature.publish(temp1)) {
Serial.println(F("Failed"));
}
if (!Humidity1.publish(hum1)) {
Serial.println(F("Failed"));
}
if (!Humidity2.publish(hum2)) {
Serial.println(F("Failed"));
}
else {
Serial.println(F("Sent!"));
}
// Memeriksa nilai suhu dan kelembaban untuk mengaktifkan relay
if (temp1 < 20) { // Jika suhu kurang dari 20°C
digitalWrite(RELAY1_PIN, HIGH); // Aktifkan relay 1
}
else {
digitalWrite(RELAY1_PIN, LOW); // Matikan relay 1
}
if (hum2 < 20) { // Jika kelembaban tanah kurang dari 20%
digitalWrite(RELAY2_PIN, HIGH); // Aktifkan relay 2
}
else {
digitalWrite(RELAY2_PIN, LOW); // Matikan relay 2
}
// Aktifkan relay 1 jika push button 1 ditekan
if (digitalRead(BUTTON1_PIN) == LOW) {
digitalWrite(RELAY1_PIN, HIGH);
}
else if (temp1 >= 20) {
digitalWrite(RELAY1_PIN, LOW);
}
// Aktifkan relay 2 jika push button 2 ditekan
if (digitalRead(BUTTON2_PIN) == LOW) {
digitalWrite(RELAY2_PIN, HIGH);
}
else if (hum2 >= 20) {
digitalWrite(RELAY2_PIN, LOW);
}
delay(100); // Tambahkan delay kecil untuk debounce
}