#include #include #include #include "GravityTDS.h" #define PIN_KURAS 32 // relay kuras #define PIN_PUMP 33 // relay pengisian #define TRIG 2 #define ECHO 4 #define PIN_PH 34 #define PIN_TDS 35 #define EEPROM_SIZE 512 // Wi-Fi credentials const char* ssid = "1234"; const char* password = "11111111"; const char* mqtt_server = "habibigarden.com"; const int mqtt_port = 1883; // MQTT topics const char* kuras_topic = "dashboard/kuras"; const char* refill_topic = "dashboard/refill"; const char* mode_topic = "dashboard/mode"; WiFiClient espClient; PubSubClient client(espClient); bool autoMode = true; // Data pH int nilai_analog_PH; float Po = 0; float PH_step; double TeganganPh; float PH4 = 3.30; float PH7 = 2.80; // Data ketinggian int duration; int jarak; int ketinggian; int tinggikolam = 7; // Data sensor TDS GravityTDS gravityTds; float temperature = 25, tdsValue = 0; void setup_wifi() { delay(10); Serial.println(); Serial.print("Menghubungkan ke "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi terhubung"); Serial.print("Alamat IP: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Pesan diterima di topic ["); Serial.print(topic); Serial.print("]: "); String message; for (int i = 0; i < length; i++) { message += (char)payload[i]; Serial.print((char)payload[i]); } Serial.println(); if (String(topic) == kuras_topic) { if (!autoMode) { if (message == "1") { digitalWrite(PIN_KURAS, LOW); Serial.println("Kuras ON"); } else if (message == "0") { digitalWrite(PIN_KURAS, HIGH); Serial.println("Kuras OFF"); } } } else if (String(topic) == refill_topic) { if (!autoMode) { if (message == "1") { digitalWrite(PIN_PUMP, LOW); Serial.println("Refill ON"); } else if (message == "0") { digitalWrite(PIN_PUMP, HIGH); Serial.println("Refill OFF"); } } } if (String(topic) == mode_topic) { if (message == "autoON") { autoMode = true; Serial.println("Auto mode ON"); } else if (message == "autoOFF") { autoMode = false; Serial.println("Manual mode ON"); } } } void reconnect() { while (!client.connected()) { Serial.print("Menghubungkan ke MQTT... "); if (client.connect("ESP32Client")) { Serial.println("terhubung"); client.subscribe(kuras_topic); client.subscribe(refill_topic); client.subscribe(mode_topic); } else { Serial.print("gagal, rc="); Serial.print(client.state()); Serial.println(" coba lagi dalam 5 detik"); delay(5000); } } } void Sensor(int trigPin, int echoPin) { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); jarak = duration * 0.034 / 2; ketinggian = tinggikolam - jarak; } void setup() { Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); pinMode(PIN_KURAS, OUTPUT); pinMode(PIN_PUMP, OUTPUT); pinMode(ECHO, INPUT); pinMode(TRIG, OUTPUT); digitalWrite(PIN_KURAS, HIGH); digitalWrite(PIN_PUMP, HIGH); EEPROM.begin(EEPROM_SIZE); // Initialize EEPROM gravityTds.setPin(PIN_TDS); gravityTds.setAref(3.3); // Reference voltage on ADC, default 5.0V on Arduino UNO gravityTds.setAdcRange(4096); // 1024 for 10bit ADC; 4096 for 12bit ADC gravityTds.begin(); } void loop() { if (!client.connected()) { Serial.println("Koneksi terputus, mencoba menghubungkan kembali..."); reconnect(); } // Debug: Cek status koneksi Serial.print("Status koneksi MQTT: "); Serial.println(client.state()); client.loop(); if (autoMode) { gravityTds.setTemperature(temperature); // Set the temperature and execute temperature compensation gravityTds.update(); // Sample and calculate tdsValue = gravityTds.getTdsValue(); // Get the value Serial.print("Nilai tds: "); Serial.print(tdsValue, 0); Serial.println("ppm"); delay(1000); nilai_analog_PH = analogRead(PIN_PH); TeganganPh = 3.3 / 4096.0 * nilai_analog_PH; PH_step = (PH4 - PH7) / 3; Po = 7.00 + ((PH7 - TeganganPh) / PH_step); Serial.print("Nilai PH cairan: "); Serial.println(Po, 2); delay(1000); Sensor(TRIG, ECHO); Serial.print("Ketinggian = "); Serial.print(ketinggian); Serial.println("cm"); // Publish data ke tiga topik String payload1 = String(Po); client.publish("dashboard/ph", payload1.c_str()); String payload2 = String(tdsValue); client.publish("dashboard/tds", payload2.c_str()); String payload3 = String(ketinggian); client.publish("dashboard/ketinggian", payload3.c_str()); if (tdsValue > 500) { Serial.println("KURAS ON"); digitalWrite(PIN_KURAS, LOW); // Nyala digitalWrite(PIN_PUMP, HIGH); // Mati } else if (tdsValue < 500 && ketinggian < 3) { Serial.println("REFILL ON"); digitalWrite(PIN_PUMP, LOW); digitalWrite(PIN_KURAS, HIGH); } else if (tdsValue < 500 && ketinggian < 5) { Serial.println("REFILL ON"); digitalWrite(PIN_PUMP, LOW); digitalWrite(PIN_KURAS, HIGH); } else { digitalWrite(PIN_PUMP, HIGH); digitalWrite(PIN_KURAS, HIGH); } } delay(1000); }