Inti dari sistem IoT yang cerdas adalah kemampuannya untuk mengambil keputusan sendiri berdasarkan data yang diterima. Logika ini sering disebut sebagai "aturan pemicu" atau trigger rules. Pada dasarnya, ini adalah serangkaian kondisi "JIKA-MAKA" (IF-THEN) yang telah kita program ke dalam perangkat ESP32.
Konsep Sederhana: Bayangkan Anda memberi instruksi pada sistem: "JIKA kelembaban tanah terdeteksi kering, MAKA nyalakan pompa air." Logika pada ESP32 bekerja persis seperti itu.
Berikut adalah tiga aturan utama yang digunakan untuk mengaktifkan pompa air secara otomatis:
Untuk mencegah pompa menyala terus-menerus, ada jeda waktu yang disebut cooldown period (misalnya 5 menit). Setelah pompa aktif, ia tidak akan bisa diaktifkan lagi oleh aturan otomatis sampai periode cooldown ini selesai, meskipun kondisinya masih terpenuhi. Ini penting untuk menjaga keawetan pompa dan menghindari penyiraman berlebih.
// Contoh kode C++ di ESP32 untuk logika pemicu
void checkEmergencyConditions(const SensorData& data) {
// Cek jika pompa sedang dalam masa cooldown
if (millis() - lastPumpActivation < PUMP_COOLDOWN) {
return; // Keluar dari fungsi jika masih cooldown
}
// Aturan 1: Suhu terlalu tinggi
if (data.temperature > MAX_TEMP) {
activatePump("High Temperature", PUMP_COOLING_TIME);
}
// Aturan 2: Tanah terlalu kering
else if (data.soilMoisture < MIN_SOIL_MOISTURE) {
activatePump("Low Soil Moisture", PUMP_WATERING_TIME);
}
}
Sebagai pengembangan di masa depan, sistem ini direncanakan untuk dapat mengirim notifikasi langsung ke perangkat mobile pengguna.
Perangkat ESP32 berinteraksi dengan dunia luar melalui pin Input/Output (I/O). Sensor memberikan sinyal **Input** ke ESP32. Berdasarkan input tersebut, ESP32 bisa mengirim sinyal **Output** ke aktuator (seperti relay pompa). Cara ESP32 "memahami" sinyal dari sensor berbeda-beda tergantung jenis sensornya.
Sensor digital itu seperti berbicara dalam bahasa yang sudah jelas. Mereka mengirimkan data dalam format digital yang sudah jadi (misalnya, angka suhu 28.5). Kita tidak perlu melakukan perhitungan rumit, cukup menggunakan "penerjemah" yang disebut library.
Analogi: Meminta teman untuk memberitahu suhu. Dia langsung menjawab, "Suhunya 28 derajat." Anda langsung mendapatkan informasi yang sudah jadi.
// Membaca suhu dari sensor DHT22
float temperature = dht.readTemperature();
// Membaca suhu dari sensor DS18B20
soilTempSensor.requestTemperatures();
float soilTemperature = soilTempSensor.getTempCByIndex(0);
Pada kode di atas, fungsi `dht.readTemperature()` dan `soilTempSensor.getTempCByIndex(0)` adalah tugas dari library. Mereka yang melakukan semua pekerjaan rumit di belakang layar.
Sensor analog berkomunikasi dengan cara yang berbeda. Ia tidak memberikan angka pasti, melainkan sebuah sinyal listrik dengan tegangan tertentu. ESP32 membaca tegangan ini dan mengubahnya menjadi sebuah nilai mentah (raw value), biasanya dalam rentang 0 hingga 4095.
Tugas kita adalah menerjemahkan nilai mentah ini menjadi sesuatu yang berarti (dalam kasus ini, persentase kelembaban 0-100%). Proses ini memerlukan kalibrasi dan perhitungan.
// Definisikan nilai kalibrasi
#define SOIL_MOISTURE_DRY 3100 // Nilai saat kering
#define SOIL_MOISTURE_WET 1200 // Nilai saat basah
float readSoilMoisture() {
// 1. Baca nilai mentah dari pin analog
int rawValue = analogRead(SOIL_MOISTURE_PIN);
// 2. Gunakan fungsi map() untuk konversi ke persen
// map(value, fromLow, fromHigh, toLow, toHigh)
float moisture = map(rawValue, SOIL_MOISTURE_DRY, SOIL_MOISTURE_WET, 0, 100);
// 3. Batasi hasilnya agar tidak di luar 0-100%
moisture = constrain(moisture, 0, 100);
return moisture;
}
Penjelasan Fungsi `map()`: Fungsi ini adalah alat bantu yang sangat berguna. Ia mengambil sebuah nilai dari satu rentang (misal, 1200-3100) dan mengubahnya secara proporsional ke rentang lain (misal, 100-0). Karena nilai mentah lebih rendah saat basah, kita memetakan `SOIL_MOISTURE_WET` ke 100% dan `SOIL_MOISTURE_DRY` ke 0%.