Mini Smart Water Tank Controller Berbasis IoT (MQTT)
Di tengah perkembangan teknologi Internet of Things (IoT), sistem pengelolaan air kini dapat dibuat lebih cerdas, efisien, dan mudah dipantau. Salah satu inovasi yang dapat diterapkan dalam kehidupan sehari-hari adalah Mini Smart Water Tank Controller berbasis IoT dengan protokol MQTT. Sistem ini memungkinkan pengguna untuk memantau ketinggian air dan mengendalikan pompa air secara real-time melalui internet.
KONSEP DAN CARA KERJA SISTEM
Sistem Mini Smart Water Tank Controller berbasis IoT (MQTT) dirancang menggunakan mikrokontroler NodeMCU (ESP8266) yang terhubung dengan sensor ultrasonik sebagai pendeteksi ketinggian air di dalam tangki. Sensor ini berfungsi untuk membaca jarak antara permukaan air dan sensor secara real-time, kemudian data tersebut diolah menjadi nilai level air dalam bentuk persentase.
Ketika level air berada di bawah batas yang telah ditentukan, yaitu 80 persen, sistem akan secara otomatis mengaktifkan pompa air melalui modul relay untuk mengisi tangki. Sebaliknya, apabila level air telah mencapai atau melebihi batas tersebut, pompa air akan berhenti bekerja secara otomatis tanpa memerlukan intervensi dari pengguna. Mekanisme ini bertujuan untuk mencegah tangki air kosong maupun meluap.
Untuk memudahkan pemantauan, sistem ini memanfaatkan teknologi Internet of Things (IoT) dengan protokol MQTT, sehingga data level air dan status pompa dapat dikirimkan ke broker MQTT dan ditampilkan pada dashboard aplikasi secara real-time. Dengan demikian, pengguna dapat memantau kondisi tangki air dari jarak jauh melalui perangkat yang terhubung ke internet. Selain itu, penggunaan relay sebagai saklar elektronik serta sistem kontrol otomatis menjadikan pengoperasian alat lebih praktis, efisien, dan aman.
Adapun cara kerja Mini Smart Water Tank Controller berbasis IoT (MQTT) dapat dijelaskan sebagai berikut:
1. Inisialisasi Siste
NodeMCU dihubungkan ke jaringan WiFi dan broker MQTT. Setelah koneksi berhasil, sistem siap untuk melakukan pembacaan sensor dan pengiriman data.
2. Pembacaan Ketinggian Air
Sensor ultrasonik yang dipasang di bagian atas tangki akan mengukur jarak antara sensor dan permukaan air. Nilai jarak ini digunakan untuk menentukan tinggi air di dalam tangki.
3. Perhitungan Level Air
Data jarak yang diperoleh kemudian dikonversi menjadi level air dalam bentuk persentase. Persentase ini merepresentasikan kondisi air di dalam tangki, mulai dari kosong hingga penuh.
4. Logika Otomatisasi Pompa
Sistem menerapkan logika otomatis sebagai berikut:
• Jika level air < 80%, maka NodeMCU akan mengaktifkan relay sehingga pompa air menyala. • Jika level air ≥ 80%, maka relay akan dinonaktifkan dan pompa air mati.
5. Pengiriman Data ke MQTT
Nilai level air dan status pompa (ON/OFF) dikirimkan ke topic MQTT tertentu. Data ini dapat diakses oleh pengguna melalui aplikasi dashboard.
6. Monitoring dan Kontrol Jarak Jauh
Pengguna dapat memantau level air dan status pompa secara real-time melalui dashboard MQTT (seperti MQTT Dash atau Node-RED). Sistem juga dapat dikembangkan untuk kontrol manual jarak jauh.
CODING SISTEM
#include <ESP8266WiFi.h> #include <PubSubClient.h> // Koneksi WiFi & MQTT const char* ssid = "OPPO_A77s"; const char* password = "abangjal65"; const char* mqtt_server = "test.mosquitto.org"; // Konfigurasi Pin #define TRIG_PIN D5 #define ECHO_PIN D6 #define RELAY_PIN D1 // Threshold Level Air (%) #define HIGH_LEVEL 80 #define TANK_HEIGHT 17 // cm tinggi tangki WiFiClient espClient; PubSubClient client(espClient); long duration; float distance, level; bool pumpStatus = false; bool autoMode = true; // mode otomatis default unsigned long lastMsg = 0; // Koneksi WiFi void setup_wifi() { delay(10); Serial.println(); Serial.println("Menghubungkan WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println("\nWiFi Terhubung"); Serial.print("IP: "); Serial.println(WiFi.localIP()); } // Baca Sensor Ultrasonik float getWaterLevel() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); duration = pulseIn(ECHO_PIN, HIGH); distance = duration * 0.034 / 2; level = ((TANK_HEIGHT - distance) / TANK_HEIGHT) * 100.0; if (level < 0) level = 0; if (level > 100) level = 100; return level; } // Reconnect MQTT void reconnect() { while (!client.connected()) { Serial.print("Menghubungkan MQTT..."); String clientId = "ESP8266-" + String(random(0xffff), HEX); if (client.connect(clientId.c_str())) { Serial.println("Terhubung"); client.subscribe("tank/control"); client.subscribe("tank/mode"); } else { Serial.print("Gagal, rc="); Serial.println(client.state()); delay(1000); } } } // Callback MQTT void callback(char* topic, byte* payload, unsigned int length) { String message; for (int i = 0; i < length; i++) { message += (char)payload[i]; } // Mode Auto / Manual if (String(topic) == "tank/mode") { if (message == "AUTO") { autoMode = true; client.publish("tank/status", "MODE AUTO"); } else if (message == "MANUAL") { autoMode = false; client.publish("tank/status", "MODE MANUAL"); } } // Kontrol Pompa Manual if (String(topic) == "tank/control" && !autoMode) { if (message == "ON") { digitalWrite(RELAY_PIN, LOW); pumpStatus = true; } else if (message == "OFF") { digitalWrite(RELAY_PIN, HIGH); pumpStatus = false; } } } // Setup void setup() { Serial.begin(115200); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, HIGH); // pompa OFF awal setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); } // Loop Utama void loop() { if (!client.connected()) reconnect(); client.loop(); unsigned long now = millis(); if (now - lastMsg > 1000) { lastMsg = now; float level = getWaterLevel(); // LOGIKA OTOMATIS (versi yang kamu minta) if (autoMode) { // Pompa menyala sampai 80% if (level < HIGH_LEVEL) { digitalWrite(RELAY_PIN, LOW); pumpStatus = true; } // Pompa mati jika >=80% else { digitalWrite(RELAY_PIN, HIGH); pumpStatus = false; } } // Publish MQTT char buf[10]; dtostrf(level, 4, 2, buf); client.publish("tank/level", buf); client.publish("tank/pump", pumpStatus ? "ON" : "OFF"); client.publish("tank/mode/state", autoMode ? "AUTO" : "MANUAL"); // Status teks level air if (level < 20) { client.publish("tank/info", "AIR HABIS - MENGISI"); } else if (level >= 20 && level < 80) { client.publish("tank/info", "MENGISI..."); } else if (level >= 80) { client.publish("tank/info", "TANGKI PENUH"); } // Debug Serial Serial.print("Level: "); Serial.print(level); Serial.print("% | Pompa: "); Serial.print(pumpStatus ? "ON" : "OFF"); Serial.print(" | Mode: "); Serial.println(autoMode ? "AUTO" : "MANUAL"); } } |
VIDEO DEMO DAN HASIL PENGUJIAN
https://drive.google.com/drive/folders/1FMgENr8Sg0nJH6wTRdDQvJwvMp7Eg7Mu
Disusun oleh:
Jalaludin Achmad Akbar (24091387021)
Desga Yusnia Evaryani (24091387068)
M Rafy Pramuji Putra (24091387015)