#include <WiFi.h>
#include <WiFiClient.h>
#include <ThingSpeak.h>
#include <DHT.h>
// --- KONFIGURASI WIFI & THINKSPEAK ---
const char* WIFI_SSID = "Wokwi-GUEST"; // Ganti dengan nama WiFi Anda
const char* WIFI_PASSWORD = ""; // Ganti dengan password WiFi Anda
unsigned long myChannelNumber = 3004166; // Ganti dengan Channel ID ThingSpeak Anda
const char* myWriteAPIKey = "RR30R84A3N2LFLKW"; // Ganti dengan Write API Key ThingSpeak Anda
WiFiClient client;
// --- KONFIGURASI SENSOR & AKTUATOR ---
#define DHTPIN 4 // Pin GPIO ESP32 yang terhubung ke pin data DHT22 (misal GPIO 4)
#define DHTTYPE DHT22 // Tipe sensor DHT yang digunakan (DHT11 atau DHT22)
DHT dht(DHTPIN, DHTTYPE);
#define BUZZER_PIN 16 // Pin GPIO ESP32 untuk Buzzer (misal GPIO 16)
#define LED_PIN 17 // Pin GPIO ESP32 untuk LED (misal GPIO 17)
// --- BATAS AMAN SUHU & KELEMBABAN ---
const float MIN_SUHU = 20.0; // Suhu minimum yang diinginkan (Celcius)
const float MAX_SUHU = 30.0; // Suhu maksimum yang diinginkan (Celcius)
const float MIN_KELEMBABAN = 40.0; // Kelembaban minimum yang diinginkan (%)
const float MAX_KELEMBABAN = 70.0; // Kelembaban maksimum yang diinginkan (%)
// --- INTERVAL PENGIRIMAN DATA KE THINKSPEAK ---
unsigned long lastSendTime = 0;
const long SEND_INTERVAL = 20000; // Kirim data setiap 20 detik (ThingSpeak biasanya 15-20 detik minimal)
void setup() {
Serial.begin(115200); // Inisialisasi Serial Monitor untuk debugging
delay(100);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW); // Pastikan buzzer mati di awal
digitalWrite(LED_PIN, LOW); // Pastikan LED mati di awal
dht.begin(); // Inisialisasi sensor DHT
Serial.print("Menghubungkan ke WiFi: ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi Terhubung!");
Serial.print("Alamat IP: ");
Serial.println(WiFi.localIP());
ThingSpeak.begin(client); // Inisialisasi ThingSpeak
}
void loop() {
// Pembacaan sensor DHT22
float h = dht.readHumidity();
float t = dht.readTemperature(); // Membaca suhu dalam Celcius
// Cek jika pembacaan gagal
if (isnan(h) || isnan(t)) {
Serial.println("Gagal membaca dari sensor DHT!");
digitalWrite(LED_PIN, HIGH); // Nyalakan LED untuk indikasi error
digitalWrite(BUZZER_PIN, HIGH); // Aktifkan buzzer untuk indikasi error
delay(500); // Biarkan menyala sebentar
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
delay(500);
return; // Keluar dari loop dan coba lagi
} else {
// Normal, matikan buzzer/LED jika sebelumnya menyala karena error
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
Serial.print("Suhu: ");
Serial.print(t);
Serial.print(" *C, Kelembaban: ");
Serial.print(h);
Serial.println(" %");
// Logika untuk Buzzer dan LED berdasarkan kondisi suhu/kelembaban
if (t < MIN_SUHU || t > MAX_SUHU || h < MIN_KELEMBABAN || h > MAX_KELEMBABAN) {
Serial.println("Kondisi tidak ideal! Mengaktifkan Buzzer & LED...");
digitalWrite(BUZZER_PIN, HIGH); // Aktifkan buzzer
digitalWrite(LED_PIN, HIGH); // Nyalakan LED (misal merah untuk peringatan)
} else {
Serial.println("Kondisi tanaman ideal.");
digitalWrite(BUZZER_PIN, LOW); // Matikan buzzer
digitalWrite(LED_PIN, LOW); // Matikan LED (atau nyalakan hijau jika ingin)
}
// Kirim data ke ThingSpeak setiap SEND_INTERVAL
if (millis() - lastSendTime > SEND_INTERVAL) {
Serial.print("Mengirim data ke ThingSpeak...");
// Set field untuk ThingSpeak
ThingSpeak.setField(1, t); // Field 1 untuk Suhu
ThingSpeak.setField(2, h); // Field 2 untuk Kelembaban
// Kirim data
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (x == 200) {
Serial.println(" Berhasil.");
} else {
Serial.println(" Gagal, HTTP error code " + String(x));
}
lastSendTime = millis();
}
delay(2000); // Jeda kecil sebelum pembacaan selanjutnya
}