#include <WiFi.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <DHTesp.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
#define IO_USERNAME "afid"
#define IO_KEY "aio_ZlBS66gRX97ZfUAQeOisN5DHhCVe"
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, "io.adafruit.com", 1883, IO_USERNAME, IO_KEY);
// Feeds Adafruit IO
Adafruit_MQTT_Subscribe lamp_switch = Adafruit_MQTT_Subscribe(&mqtt, IO_USERNAME "/feeds/lamp-switch");
Adafruit_MQTT_Subscribe lamp_relay = Adafruit_MQTT_Subscribe(&mqtt, IO_USERNAME "/feeds/lamp_relay");
Adafruit_MQTT_Subscribe pump_switch = Adafruit_MQTT_Subscribe(&mqtt, IO_USERNAME "/feeds/pump-switch");
Adafruit_MQTT_Subscribe pump_relay = Adafruit_MQTT_Subscribe(&mqtt, IO_USERNAME "/feeds/pump_relay");
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/suhu");
Adafruit_MQTT_Publish humidity_air = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/kelembaban-ruang");
Adafruit_MQTT_Publish humidity_soil = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/kelembaban-tanah");
// Sensor DHT
#define DHT_PIN 14 // Ubah sesuai dengan pin yang terhubung ke sensor DHT
#define DHT_TYPE DHTesp::DHT22 // Jenis sensor DHT yang digunakan (DHT11, DHT22, DHT21)
DHTesp dht;
// Sensor Kelembaban Tanah
#define SOIL_MOISTURE_PIN A0 // Ubah sesuai dengan pin yang terhubung ke sensor kelembaban tanah
// Relay
#define RELAY_LAMP_PIN 12 // Ubah sesuai dengan pin yang terhubung ke relay lampu
#define RELAY_PUMP_PIN 13 // Ubah sesuai dengan pin yang terhubung ke relay pompa
#define RELAY_ON LOW // Status relay aktif (LOW atau HIGH)
void MQTT_connect() {
Serial.print("Connecting to MQTT... ");
int8_t ret;
if ((ret = mqtt.connect()) != 0) {
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(1000);
}
Serial.println("MQTT Connected!");
mqtt.subscribe(&lamp_switch);
mqtt.subscribe(&lamp_relay);
mqtt.subscribe(&pump_switch);
mqtt.subscribe(&pump_relay);
}
void connectWiFi() {
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nConnected to Wi-Fi!");
}
void sendTemperature(float temp) {
if (!isnan(temp)) {
Serial.print("Sending Temperature: ");
Serial.println(temp);
temperature.publish(temp);
}
}
void sendHumidityAir(float humidity) {
if (!isnan(humidity)) {
Serial.print("Sending Air Humidity: ");
Serial.println(humidity);
humidity_air.publish(humidity);
}
}
void sendSoilMoisture(int moisture) {
Serial.print("Sending Soil Moisture: ");
Serial.println(moisture);
humidity_soil.publish(moisture);
}
void controlRelay(int pin, int status) {
digitalWrite(pin, status);
}
void setup() {
Serial.begin(115200);
// Inisialisasi sensor DHT
dht.setup(DHT_PIN, DHT_TYPE);
// Inisialisasi koneksi ke Wi-Fi
connectWiFi();
// Inisialisasi koneksi ke MQTT
MQTT_connect();
}
void loop() {
MQTT_connect();
// Tanggapan terhadap pesan dari feed
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
if (subscription == &lamp_switch || subscription == &lamp_relay) {
// Kontrol relay lampu berdasarkan saklar
if (strcmp((char *)lamp_switch.lastread, "ON") == 1) {
controlRelay(RELAY_LAMP_PIN, RELAY_ON); // Nyalakan relay lampu
Serial.println("Lampu ON");
} else {
controlRelay(RELAY_LAMP_PIN, !RELAY_ON); // Matikan relay lampu
Serial.println("Lampu OFF");
}
// Tampilkan data yang diterima dari saklar lampu
Serial.print("Receive Lamp Switch Data: ");
Serial.println((char *)lamp_switch.lastread);
} else if (subscription == &pump_switch || subscription == &pump_relay) {
// Kontrol relay pompa berdasarkan saklar
if (strcmp((char *)pump_switch.lastread, "ON") == 1) {
controlRelay(RELAY_PUMP_PIN, RELAY_ON); // Nyalakan relay pompa
Serial.println("Pompa ON");
} else {
controlRelay(RELAY_PUMP_PIN, !RELAY_ON); // Matikan relay pompa
Serial.println("Pompa OFF");
}
// Tampilkan data yang diterima dari saklar pompa
Serial.print("Receive Pump Switch Data: ");
Serial.println((char *)pump_switch.lastread);
}
}
// Baca data dari sensor DHT
float temp = dht.getTemperature();
float humidity = dht.getHumidity();
// Baca data dari sensor kelembaban tanah
int soilMoisture = analogRead(SOIL_MOISTURE_PIN);
// Kirim data suhu dan kelembaban
sendTemperature(temp);
sendHumidityAir(humidity);
sendSoilMoisture(soilMoisture);
// Kontrol relay berdasarkan kelembaban tanah
if (soilMoisture < 30) {
controlRelay(RELAY_PUMP_PIN, RELAY_ON); // Nyalakan relay pompa
} else if (soilMoisture > 50) {
controlRelay(RELAY_PUMP_PIN, !RELAY_ON); // Matikan relay pompa
}
// Delay sebentar
delay(1000);
}