1

Ringkasan & Bill of Materials

Tiap node membaca sensornya secara berkala lalu mempublikasikan nilainya ke broker MQTT. Di lapangan, sistem ini dipasang sebagai 3 pasang node (3 sensor kelembaban tanah + 3 sensor ketinggian air) di titik-titik sawah yang berbeda, dan datanya ditampilkan ke petani lewat mobile app Irigasi Pintar (Irpin Solok) β€” lihat bagian Konteks Program dan Integrasi Mobile App. Source code yang didokumentasikan di bagian 5 adalah sketch representatif untuk satu node (soil moisture); node ketinggian air memakai pola yang sama dengan sensor & topic MQTT yang berbeda.

KomponenKeterangan
NodeMCU ESP8266 (Lolin)Mikrokontroler dengan WiFi bawaan, menjalankan sketch di bawah
Sensor Soil Moisture (analog)Terhubung ke pin A0, dibaca sebagai nilai analog 0–1024
Sensor Ketinggian AirNode terpisah dengan pola kode yang sama, satuan output CM (lihat bagian Design Hardware)
LED indikatorTerhubung ke pin D5, berkedip tiap siklus loop() sebagai heartbeat
Panel surya + baterai 18650Sumber daya mandiri per node di lapangan (lihat diagram wiring di bagian 3)
ModemMenghubungkan node-node di sawah ke internet/server saat tidak ada WiFi tetap
Kabel USB CH340GUntuk flashing sketch & power dari komputer (butuh driver CH340G, lihat bagian 3)
Broker MQTT β€” HiveMQ CloudMenampung data yang dipublish dari device (koneksi TLS port 8883)
Mobile App β€” Irigasi Pintar (Irpin Solok)Menampilkan data realtime dari server ke petani, lihat bagian Integrasi Mobile App
Catatan sumber

Bill of materials inti, tabel wiring, dan contoh output diturunkan langsung dari pin/variabel di source code node soil moisture β€” bukan asumsi tambahan. Baris panel surya, baterai, modem, node ketinggian air, dan mobile app diturunkan dari dokumentasi presentasi project (IRIGASI PINTAR.pptx) dan artikel resmi PoltekSSN, dicatat sebagai konteks sistem lengkap di luar sketch yang ditampilkan.

2

Konteks Program

Project ini dibangun pada Latsitarda Nusantara XLIII/2023 (latihan integratif taruna/taruni gabungan Poltek SSN, Akmil, AAL, AAU, Akpol, dan Praja IPDN) di Kota Solok, Sumatera Barat β€” daerah sentra produksi padi ("Beras Solok") yang jadi pemasok utama beras ke Sumatera Barat hingga Jambi dan Riau, dengan sentra produksi di Kecamatan Gunung Talang, Bukit Sundi, Kubung, Lembang Jaya, dan X Koto Singkarak.

Smart Irrigation adalah salah satu implementasi dari program Desa Digital: memanfaatkan teknologi IoT dan digitalisasi kegiatan pertanian agar petani bisa memantau kondisi sawah tanpa harus datang langsung ke lokasi.

Prasyarat programKeterangan
Jaringan internet di desaDipenuhi lewat modem di tiap titik node (lihat bagian Bill of Materials)
SDM pengelola desa digitalPetani/perangkat desa yang memantau data lewat mobile app
Dukungan aktif Pemerintah DesaPemasangan & pemeliharaan perangkat di lahan sawah warga
Manfaat bagi petani

Petani bisa melihat kondisi ketinggian air dan kelembaban tanah dari rumah tanpa perlu selalu sehat/mampu ke sawah, membantu menentukan waktu & jumlah air irigasi yang tepat, menghindari kelebihan/kekurangan air, mendeteksi masalah drainase lebih awal, hingga jadi peringatan dini risiko banjir/erosi dan penyakit tanaman (mis. Blast) akibat genangan yang tidak sesuai fase pertumbuhan padi.

3

Setting Instalasi

2.1 Install Driver CH340G

NodeMCU Lolin memakai chip USB-to-serial CH340G. Install driver-nya dulu agar komputer bisa mengenali board saat dicolok lewat USB.

Sumber driver

Driver resmi CH340G tersedia di situs pabrikan WCH: wch-ic.com/downloads/CH341SER_ZIP.html. Dokumentasi asli project ini melampirkan file DRIVER1_CH340.zip langsung di Notion β€” file tersebut tidak ikut diekstrak ke sini, silakan taruh salinannya sendiri di smart-irrigation/files/DRIVER1_CH340.zip jika ingin tetap menyertakan versi yang persis sama.

2.2 Install Board NodeMCU ESP8266 ke Arduino IDE

  1. 1Buka Arduino IDE, lalu pilih menu File → Preferences.
  2. 2Pada kolom Additional Boards Manager URLs, tempelkan URL berikut lalu klik OK:
    http://arduino.esp8266.com/stable/package_esp8266com_index.json
Menambahkan URL ke Additional Boards Manager URLs
πŸ“·Gambar belum tersedia β€” taruh file di img/01-boards-manager-url.png
  1. 3Buka Tools → Board → Boards Manager…, cari ESP8266 Community, lalu klik Install.
Instalasi board ESP8266 Community di Boards Manager
πŸ“·Gambar belum tersedia β€” taruh file di img/02-esp8266-community-install.png
  1. 4Buka Library Manager, cari library PubSubClient (repo: knolleary/pubsubclient), lalu Install.
Instalasi library PubSubClient
πŸ“·Gambar belum tersedia β€” taruh file di img/03-pubsubclient-install.png
Core ESP8266

Board manager di atas menginstall Arduino core resmi untuk ESP8266: github.com/esp8266/Arduino.

4

Design Hardware & Wiring

Skema/desain hardware Smart Irrigation
πŸ“·Gambar belum tersedia β€” taruh file di img/04-design-hardware.png

Diagram wiring: panel surya mengisi baterai 18650 (lewat modul charge/protection), yang jadi sumber daya NodeMCU, LED indikator, dan sensor soil moisture β€” sesuai desain per-node yang mandiri daya di lapangan.

Pin NodeMCUTerhubung keFungsi di kode
A0Sensor soil moisture (output analog)analogRead(sensor1), dikonversi ke persentase kelembaban
D5LED indikatordigitalWrite(led, led_state) β€” toggle tiap siklus loop()
GPIO2—digitalWrite(2, HIGH) β€” di-set HIGH terus tiap loop
BUILTIN_LEDLED bawaan boarddiinisialisasi sebagai OUTPUT di setup()
Baterai 18650 (via modul charge/protection)Jalur daya (VIN/3V3 & GND)Diisi oleh panel surya, menyalakan NodeMCU secara mandiri di lapangan
Kalibrasi sensor

Konversi ke persentase memakai ((sensor_value - 288.00) / (1024.00 - 288.00)) * 100.00. Nilai 288.00 adalah baseline kalibrasi spesifik untuk sensor yang dipakai di project ini β€” dipertahankan apa adanya dari source code asli, sesuaikan sendiri jika sensormu berbeda.

Satuan & Ambang Nilai Sensor

SensorSatuanRentang
Kelembaban tanahRH (Relative Humidity)0–40 RH β€” tanah kering
40–60 RH β€” kelembaban ideal
60–100 RH β€” tanah basah
Ketinggian airCM (dari permukaan tanah)Optimal untuk padi sawah: sekitar −2.5 s.d. 7.5 cm (lihat referensi di bawah)
Rujukan ketinggian air optimal

Arwitas (1988): penggenangan 2.5–5.0 cm. De Datta (1993): penggenangan 2.5–7.5 cm terus-menerus memberi hasil optimal. Percobaan Muammar Michael (2018): tinggi genangan optimal −2.5 cm s.d. 7.5 cm. Angka-angka ini dikutip apa adanya dari materi presentasi project, bukan hasil pengukuran independen.

5

Source Code

Sketch Arduino untuk NodeMCU ESP8266: membaca sensor soil moisture, konek ke WiFi & broker MQTT HiveMQ Cloud (TLS), lalu mempublikasikan pembacaan setiap 10 detik. Node sensor ketinggian air di lapangan memakai pola kode yang sama β€” bedanya cuma jenis sensor yang dibaca di analogRead()/pin input dan nama topic MQTT-nya β€” tapi sketch spesifik untuk node tersebut tidak ada di sumber dokumentasi asli, jadi tidak dicantumkan di sini supaya tidak mengarang kode yang belum pernah diverifikasi berjalan.

Kredensial di-redact

ssid, password, mqtt_server, mqtt_username, dan mqtt_password di bawah ini sudah diganti jadi placeholder. Isi dengan kredensial WiFi & broker MQTT-mu sendiri di salinan lokal β€” jangan commit nilai asli ke repository publik ini.

smart-irrigation-esp8266.ino

/* * Smart Irrigation * Latsitarda * Politeknik Siber dan Sandi Negara */ #include <ESP8266WiFi.h> // Pins for board ESP8266 Wemos-NodeMCU #include <PubSubClient.h> #include <WiFiClientSecure.h> ////////////// //---- WiFi settings // GANTI nilai di bawah ini dengan kredensial WiFi Anda sendiri. // Jangan commit kredensial asli ke repository publik. const char* ssid = "YOUR_WIFI_SSID"; const char* password = "YOUR_WIFI_PASSWORD"; //---- MQTT Broker settings // GANTI dengan detail cluster HiveMQ Cloud Anda sendiri. const char* mqtt_server = "YOUR_HIVEMQ_CLUSTER_URL"; // contoh: xxxxxxxxxxxx.s2.eu.hivemq.cloud const char* mqtt_username = "YOUR_MQTT_USERNAME"; const char* mqtt_password = "YOUR_MQTT_PASSWORD"; const int mqtt_port =8883; const char* sensor1_topic= "solok/humidity2"; // Sensor Soil Humidity int sensor1 = A0; int led = D5; //pin LED bool led_state = false; // status LED, false untuk mati dan true untuk nyala WiFiClientSecure espClient; // for no secure connection use WiFiClient instead of WiFiClientSecure //WiFiClient espClient; PubSubClient client(espClient); unsigned long lastMsg = 0; #define MSG_BUFFER_SIZE (50) char msg[MSG_BUFFER_SIZE]; static const char *root_ca PROGMEM = R"EOF( -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- )EOF"; //========================================== void setup_wifi() { delay(10); Serial.print("\nConnecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println("\nWiFi connected\nIP address: "); Serial.println(WiFi.localIP()); } //===================================== void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); String clientId = "ESP8266Client-"; // Create a random client ID clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str(), mqtt_username, mqtt_password)) { Serial.println("connected"); // subscribe the topics here //client.subscribe(command2_topic); // subscribe the topics here } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } //================================================ setup void setup() { pinMode(led, OUTPUT); pinMode(2, OUTPUT); Serial.begin(9600); while (!Serial) delay(1); setup_wifi(); pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output #ifdef ESP8266 espClient.setInsecure(); #else // for the ESP32 espClient.setCACert(root_ca); // enable this line and the the "certificate" code for secure connection #endif client.setServer(mqtt_server, mqtt_port); } //================================================ loop void loop() { digitalWrite(2, HIGH); digitalWrite(led, led_state); // mengatur output pada pin LED sesuai dengan status LED led_state = !led_state; // mengubah status LED menjadi kebalikannya if (!client.connected()) reconnect(); client.loop(); int sensor_value = analogRead(sensor1); float moisturePercent = ((sensor_value - 288.00) / (1024.00-288.00)) * 100.00; //konversi dari bacaan sensor kelembaban tanah ke Rh : Rh = ((Bacaan Sensor - Nilai Minimum)/(Nilai Maksimum - Nilai Minimum)) x 100 //float moisturePercent = ((1024 - sensor_value) / 1024.00) * 100.00; // konversi nilai sensor kelembaban tanah ke dalam persentase publishMessage(sensor1_topic,String(moisturePercent),true); delay(10000); } //======================================= publising as string void publishMessage(const char* topic, String payload , boolean retained){ if (client.publish(topic, payload.c_str(), true)) Serial.println("Message publised ["+String(topic)+"]: "+payload); }
6

Contoh Output & Format Data

Serial Monitor (baud 9600)

Contoh log saat device menyala dan berhasil konek

Connecting to YOUR_WIFI_SSID ..... WiFi connected IP address: 192.168.1.23 Attempting MQTT connection...connected Message publised [solok/humidity2]: 42.35 Message publised [solok/humidity2]: 41.90

Payload MQTT

ItemNilai
Topicsolok/humidity2
PayloadString angka persentase kelembaban, mis. "42.35"
Retainedtrue β€” broker menyimpan pesan terakhir untuk subscriber baru
Interval publish~10 detik (delay(10000) di akhir loop())
Cara verifikasi

Subscribe ke topic solok/humidity2 lewat MQTT client (mis. MQTT Explorer atau mosquitto_sub) yang terhubung ke cluster HiveMQ Cloud yang sama. Kalau device berhasil publish, nilai persentase kelembaban akan muncul setiap ~10 detik.

7

Integrasi Mobile App

Data yang dipublish tiap node ke broker MQTT diteruskan oleh server ke mobile app Android "Irigasi Pintar" (terdaftar di Play Store dengan nama Irpin Solok, developer Pluto Lab), supaya petani bisa memantau sawah dari rumah.

Foto sensor terpasang di sawah berdampingan dengan tampilan realtime app Irigasi Pintar
πŸ“·Gambar belum tersedia β€” taruh file di img/07-mobile-app-realtime.jpg

Kiri: node sensor kelembaban & ketinggian air (dengan modem) terpasang di saluran irigasi sawah. Kanan: tampilan app "Irigasi Pintar" dengan dua tab realtime β€” Ketinggian Air (cm) dan Kelembaban Tanah (RH) β€” untuk masing-masing 3 sensor.

Alur Data ke Mobile App

  1. 1Tiap node (NodeMCU + sensor + modem) membaca nilai sensornya dan publish ke broker MQTT lewat koneksi internet dari modem β€” pola yang sama dengan sketch di bagian Source Code.
  2. 2Server men-subscribe topic-topic MQTT tersebut dan menyimpan/menyediakan nilai terbaru tiap sensor.
  3. 3Mobile app "Irigasi Pintar" mengambil data dari server tersebut dan menampilkannya sebagai daftar realtime per sensor, dipisah tab Ketinggian Air dan Kelembaban Tanah.
Detail server & app di luar cakupan dokumentasi ini

Bagaimana persisnya server meneruskan data dari broker MQTT ke app (REST API, polling, atau MQTT langsung dari app) tidak ada di materi presentasi sumber, jadi tidak didokumentasikan di sini supaya tidak mengarang detail yang belum terverifikasi. Yang bisa dipastikan dari sumber: alurnya Sensor Node → Modem/Internet → Server → Mobile App.

Status ketersediaan app

Per dokumentasi sumber (2023), app terdaftar di Play Store sebagai Irpin Solok oleh Pluto Lab. Saya tidak menemukan URL listing tersebut lewat pencarian web saat menulis halaman ini, jadi tautan langsung tidak dicantumkan di sini supaya tidak salah arah β€” statusnya (masih live, berganti nama, atau sudah di-unpublish) perlu dicek langsung ke pengelola project sebelum dicantumkan sebagai link publik.

8

Prototyping & Implementasi

Foto prototipe Smart Irrigation
πŸ“·Gambar belum tersedia β€” taruh file di img/05-prototype-1.png
Foto implementasi Smart Irrigation di lapangan
πŸ“·Gambar belum tersedia β€” taruh file di img/06-prototype-2.png
Rangkaian sensor sebelum dan sesudah dipasang dalam housing pipa PVC waterproof
πŸ“·Gambar belum tersedia β€” taruh file di img/08-sensor-assembly.jpg

Modul sensor (probe + board NodeMCU + baterai) sebelum dan sesudah dipasang dalam housing pipa PVC tahan air untuk penempatan di saluran irigasi.

9

Referensi