Detail Aturan & Perhitungan Modul IoT

Logika Pemicu (Trigger) Otomatis pada Perangkat IoT

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.

Contoh Aturan Pemicu di Proyek Ini:

Berikut adalah tiga aturan utama yang digunakan untuk mengaktifkan pompa air secara otomatis:

1. Aturan Suhu Tinggi (Mendinginkan)

2. Aturan Tanah Kering (Menyiram)

3. Aturan Kondisi Gabungan (Kritis)

Penting: Periode "Cooldown"

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);
    }
}

Rencana Pengembangan: Notifikasi Mobile

Sebagai pengembangan di masa depan, sistem ini direncanakan untuk dapat mengirim notifikasi langsung ke perangkat mobile pengguna.

Cara Kerja & Perhitungan Modul Sensor (I/O)

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.

1. Sensor Digital (DHT22 & DS18B20)

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.

2. Sensor Analog (Sensor Kelembaban Tanah)

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.

Langkah 1: Kalibrasi
Kita tentukan nilai mentah untuk kondisi paling kering dan paling basah.
Contoh: Nilai saat sensor di udara (kering) = 3100. Nilai saat di air (basah) = 1200.
Langkah 2: Pembacaan Nilai Mentah
ESP32 membaca nilai saat ini dari sensor. Misal, nilainya 2500.
Langkah 3: Perhitungan (Mapping)
Kita memetakan rentang nilai mentah (3100-1200) ke rentang persentase (0-100%). Nilai 2500 berada di mana dalam rentang tersebut?
// 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%.