#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define bUP 4
#define bOK 3
#define bDN 2
#define BOUNCE 50
// Inisialisasi LCD I2C (alamat default biasanya 0x27, sesuaikan jika berbeda)
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int flowSensorPin = 5; // Pin yang terhubung dengan output sensor flow meter
volatile int pulseCount = 0;
float flowRate = 0.0; // Debit air dalam liter per menit
float totalVolume = 0.0; // Total volume air dalam liter
unsigned long oldTime = 0;
// Kalibrasi sensor flow meter (contoh: 4.5 pulse per detik per liter per menit)
const float calibrationFactor = 4.5;
void setup() {
lcd.begin(20, 4);
lcd.init();
lcd.backlight();
// Inisialisasi pin sensor flow meter
pinMode(flowSensorPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(flowSensorPin), pulseCounter, FALLING);
pinMode(bUP, INPUT_PULLUP);
pinMode(bOK, INPUT_PULLUP);
pinMode(bDN, INPUT_PULLUP);
// Inisialisasi serial monitor (opsional)
Serial.begin(9600);
}
void loop() {
if(digitalRead(bOK) == LOW) {
delay(BOUNCE);
while (digitalRead(bOK) == LOW) {}
lcd.clear();
menuSetting();
}
lcd.setCursor(0, 0);
lcd.print(" FLOW WATER METER ");
lcd.setCursor(0, 1);
lcd.print(" DEMINT WATER PLANT ");
lcd.setCursor(0, 2);
lcd.print(" ************** ");
lcd.setCursor(0, 3);
lcd.print(" >>>TEKAN OK<<< ");
}
void menuSetting() {
//menu
//---------------------------------------------
setMENU1:
if(digitalRead(bOK) == LOW) {
delay(BOUNCE);
while (digitalRead(bOK) == LOW) {}
lcd.clear();
goto setSUBMENU1;
}else if(digitalRead(bUP) == LOW) {
delay(BOUNCE);
while (digitalRead(bUP) == LOW) {}
lcd.clear();
goto setEXIT;
}else if(digitalRead(bDN) == LOW) {
delay(BOUNCE);
while (digitalRead(bDN) == LOW) {}
lcd.clear();
goto setMENU2;
}
lcd.setCursor(0, 0);
lcd.print("->MENU 1 EXIT ");
lcd.setCursor(0, 1);
lcd.print(" MENU 2 ");
lcd.setCursor(0, 2);
lcd.print(" MENU 3 ");
lcd.setCursor(0, 3);
lcd.print(" MENU 4 ");
goto setMENU1;
//-------------------------------------------
setMENU2:
if(digitalRead(bOK) == LOW) {
delay(BOUNCE);
while (digitalRead(bOK) == LOW) {}
lcd.clear();
goto setSUBMENU2;
}else if(digitalRead(bUP) == LOW) {
delay(BOUNCE);
while (digitalRead(bUP) == LOW) {}
lcd.clear();
goto setMENU1;
}else if(digitalRead(bDN) == LOW) {
delay(BOUNCE);
while (digitalRead(bDN) == LOW) {}
lcd.clear();
goto setMENU3;
}
lcd.setCursor(0, 0);
lcd.print(" MENU 1 EXIT ");
lcd.setCursor(0, 1);
lcd.print("->MENU 2 ");
lcd.setCursor(0, 2);
lcd.print(" MENU 3 ");
lcd.setCursor(0, 3);
lcd.print(" MENU 4 ");
goto setMENU2;
//-------------------------------------------
setMENU3:
if(digitalRead(bOK) == LOW) {
delay(BOUNCE);
while (digitalRead(bOK) == LOW) {}
lcd.clear();
goto setSUBMENU3;
}else if(digitalRead(bUP) == LOW) {
delay(BOUNCE);
while (digitalRead(bUP) == LOW) {}
lcd.clear();
goto setMENU2;
}else if(digitalRead(bDN) == LOW) {
delay(BOUNCE);
while (digitalRead(bDN) == LOW) {}
lcd.clear();
goto setMENU4;
}
lcd.setCursor(0, 0);
lcd.print(" MENU 1 EXIT ");
lcd.setCursor(0, 1);
lcd.print(" MENU 2 ");
lcd.setCursor(0, 2);
lcd.print("->MENU 3 ");
lcd.setCursor(0, 3);
lcd.print(" MENU 4 ");
goto setMENU3;
//-------------------------------------------
setMENU4:
if(digitalRead(bOK) == LOW) {
delay(BOUNCE);
while (digitalRead(bOK) == LOW) {}
lcd.clear();
goto setSUBMENU4;
}else if(digitalRead(bUP) == LOW) {
delay(BOUNCE);
while (digitalRead(bUP) == LOW) {}
lcd.clear();
goto setMENU3;
}else if(digitalRead(bDN) == LOW) {
delay(BOUNCE);
while (digitalRead(bDN) == LOW) {}
lcd.clear();
goto setEXIT;
}
lcd.setCursor(0, 0);
lcd.print(" MENU 1 EXIT ");
lcd.setCursor(0, 1);
lcd.print(" MENU 2 ");
lcd.setCursor(0, 2);
lcd.print(" MENU 3 ");
lcd.setCursor(0, 3);
lcd.print("->MENU 4 ");
goto setMENU4;
//---------------------------------------
setEXIT:
if(digitalRead(bOK) == LOW) {
delay(BOUNCE);
while (digitalRead(bOK) == LOW) {}
lcd.clear();
goto endSET;
}else if(digitalRead(bUP) == LOW) {
delay(BOUNCE);
while (digitalRead(bUP) == LOW) {}
lcd.clear();
goto setMENU4;
}else if(digitalRead(bDN) == LOW) {
delay(BOUNCE);
while (digitalRead(bDN) == LOW) {}
lcd.clear();
goto setMENU1;
}
lcd.setCursor(0, 0);
lcd.print(" MENU 1 ->EXIT ");
lcd.setCursor(0, 1);
lcd.print(" MENU 2 ");
lcd.setCursor(0, 2);
lcd.print(" MENU 3 ");
lcd.setCursor(0, 3);
lcd.print(" MENU 4 ");
goto setEXIT;
//---------------------------------------
//SUBMENU
setSUBMENU1:
if(digitalRead(bOK) == LOW) {
delay(BOUNCE);
while (digitalRead(bOK) == LOW) {}
lcd.clear();
goto setMENU1;
}
// Hitung waktu berlalu
unsigned long currentTime = millis();
unsigned long elapsedTime = currentTime - oldTime;
// Setiap 1 detik (1000 ms)
if (elapsedTime >= 1000) {
// Hitung flow rate (liter per menit)
flowRate = ((1000.0 / elapsedTime) * pulseCount) / calibrationFactor;
// Tambahkan volume total (liter)
totalVolume += (flowRate / 60.0);
// Reset counter dan waktu
pulseCount = 0;
oldTime = currentTime;
// Update tampilan LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Flow Water Meter 1 ");
lcd.setCursor(0, 1);
lcd.print("Flow Rate: ");
lcd.print(flowRate);
lcd.print("L/min");
lcd.setCursor(0, 2);
lcd.print("Totalizer: ");
lcd.print(totalVolume);
lcd.print(" L");
}
goto setSUBMENU1;
//----------------------------------------
setSUBMENU2:
if(digitalRead(bOK) == LOW) {
delay(BOUNCE);
while (digitalRead(bOK) == LOW) {}
lcd.clear();
goto setMENU2;
}
lcd.setCursor(0, 0);
lcd.print(" sub menu2 ");
goto setSUBMENU2;
//-----------------------------------------
setSUBMENU3:
if(digitalRead(bOK) == LOW) {
delay(BOUNCE);
while (digitalRead(bOK) == LOW) {}
lcd.clear();
goto setMENU3;
}
lcd.setCursor(0, 0);
lcd.print(" sub menu3 ");
goto setSUBMENU3;
//----------------------------------------
setSUBMENU4:
if(digitalRead(bOK) == LOW) {
delay(BOUNCE);
while (digitalRead(bOK) == LOW) {}
lcd.clear();
goto setMENU4;
}
lcd.setCursor(0, 0);
lcd.print(" sub menu4 ");
goto setSUBMENU4;
//-------------------------------------------
endSET:
lcd.clear();
delay(100);
}
void pulseCounter() {
// Fungsi interrupt untuk menghitung pulse dari sensor flow meter
pulseCount++;
}