commit 07b1637aeeb1a33135493dfc963a3fe00a1fbd80 Author: akhmadmartaadiputra Date: Wed Aug 13 19:45:16 2025 +0700 Upload files to "/" diff --git a/FINISH.ino b/FINISH.ino new file mode 100644 index 0000000..066e58b --- /dev/null +++ b/FINISH.ino @@ -0,0 +1,146 @@ +#include +#include +#include +#include +#include + +// Firebase config +#define FIREBASE_HOST "https://tdsmeter-8042a-default-rtdb.firebaseio.com/" +#define FIREBASE_AUTH "GnAvtjMBxgEqsEdPDiuCwBmo6dRxBKcr1JIEqEqz" + +// Pin +#define TDS_PIN 34 +#define BUZZER_PIN 26 + +// Ambang batas TDS (ppm) +#define TDS_THRESHOLD 500 + +// Kalibrasi TDS (atur berdasarkan hasil perbandingan) +const float VREF = 3.3; +const int ADC_RESOLUTION = 4095; +float TDS_factor = 0.399; // Ganti sesuai kalibrasi + +// LCD I2C +LiquidCrystal_I2C lcd(0x27, 16, 2); + +// Firebase +FirebaseData firebaseData; +FirebaseConfig firebaseConfig; +FirebaseAuth firebaseAuth; + +// Variabel global +float tdsValue = 0; +float voltage = 0; +String status = ""; + +// Fungsi scroll teks LCD +void scrollText(String text, int row, int delayTime) { + int len = text.length(); + if (len <= 16) { + lcd.setCursor(0, row); + lcd.print(text); + lcd.print(" "); + delay(delayTime); + return; + } + for (int i = 0; i <= len - 16; i++) { + lcd.setCursor(0, row); + lcd.print(text.substring(i, i + 16)); + delay(delayTime); + } + delay(500); +} + +void setup() { + Serial.begin(115200); + + // LCD setup + lcd.init(); + lcd.backlight(); + lcd.setCursor(0, 0); + lcd.print("TDS Monitor"); + delay(2000); + lcd.clear(); + + // Buzzer setup + pinMode(BUZZER_PIN, OUTPUT); + digitalWrite(BUZZER_PIN, HIGH); // Awalnya mati + + // WiFi Manager + WiFiManager wm; + if (!wm.autoConnect("ESP32_Config_AP")) { + Serial.println("Gagal konek WiFi"); + delay(3000); + ESP.restart(); + } + + Serial.println("WiFi Terhubung:"); + Serial.println(WiFi.localIP()); + + // Firebase + firebaseConfig.signer.tokens.legacy_token = FIREBASE_AUTH; + firebaseConfig.database_url = FIREBASE_HOST; + Firebase.begin(&firebaseConfig, &firebaseAuth); + Firebase.reconnectWiFi(true); +} + +void loop() { + // Ambil 10 sampel ADC + int total = 0; + for (int i = 0; i < 10; i++) { + total += analogRead(TDS_PIN); + delay(10); + } + int analogValue = total / 10; + + // Konversi ke tegangan + voltage = analogValue * (VREF / ADC_RESOLUTION); + + // Hitung TDS (pakai rumus polinomial + faktor kalibrasi) + tdsValue = (133.42 * voltage * voltage * voltage - 255.86 * voltage * voltage + 857.39 * voltage) * TDS_factor; + if (tdsValue < 0) tdsValue = 0; + + // Debug Serial + Serial.print("ADC: "); + Serial.print(analogValue); + Serial.print(" | V: "); + Serial.print(voltage, 4); + Serial.print(" V | TDS: "); + Serial.print(tdsValue, 2); + Serial.println(" ppm"); + + // LCD tampilan baris 1 + lcd.setCursor(0, 0); + lcd.print("TDS: "); + lcd.print(tdsValue, 1); + lcd.print(" ppm "); + + // Penilaian status air + if (tdsValue <= 50) { + status = "Status: Sangat Baik"; + digitalWrite(BUZZER_PIN, HIGH); // Buzzer mati + } else if (tdsValue <= 150) { + status = "Status: Baik"; + digitalWrite(BUZZER_PIN, HIGH); + } else if (tdsValue <= TDS_THRESHOLD) { + status = "Status: Cukup Baik"; + digitalWrite(BUZZER_PIN, HIGH); + } else { + status = "Status: Buruk"; + digitalWrite(BUZZER_PIN, LOW); // Buzzer menyala + } + + // Scroll teks status di baris 2 + scrollText(status, 1, 250); + + // Kirim data ke Firebase + if (Firebase.setFloat(firebaseData, "/TDS/value", tdsValue) && + Firebase.setString(firebaseData, "/TDS/status", status)) { + Serial.println("Data terkirim ke Firebase"); + } else { + Serial.print("Gagal kirim: "); + Serial.println(firebaseData.errorReason()); + } + + delay(1000); +}