#include <EEWrap.h>
#include <LiquidCrystal_I2C.h>
#define BUZZER 7
#define LED_NOTIF 9
#define LED_HAZARD 8
#define PIN_BUTTON_R 2
#define PIN_BUTTON_L 3
#define PIN_BUTTON_U 4
#define PIN_BUTTON_D 5
#define PIN_BUTTON_CENTER 6
#define SENSOR_AIR A0
#define PRESS_U digitalRead(PIN_BUTTON_U) == LOW
#define PRESS_R digitalRead(PIN_BUTTON_R) == LOW
#define PRESS_L digitalRead(PIN_BUTTON_L) == LOW
#define PRESS_D digitalRead(PIN_BUTTON_D) == LOW
#define PRESS_CENTER digitalRead(PIN_BUTTON_CENTER) == LOW
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ==================================================================================================================
// ==================================================================================================================
int levelAman = 50;
int levelSiaga = 100;
int beepBahaya = 7;
int beepSiaga = 10;
bool alarmSiaga = true;
bool alarmBahaya = true;
int waterLevel;
char buffer[16];
EEWrap<int> eLevelAman;
EEWrap<int> eLevelSiaga;
EEWrap<int> eBeepBahaya;
EEWrap<int> eBeepSiaga;
String alarmHazard(int x, int y, uint8_t led){
for (int i = 0; i < x; i ++) {
digitalWrite(led, HIGH);
tone(BUZZER, 1000, 200);
delay(y);
digitalWrite(led, LOW);
noTone(BUZZER);
delay(y);
}
}
void resetAll() {
eLevelAman = 50;
eLevelSiaga = 100;
eBeepBahaya = 10;
eBeepSiaga = 5;
levelAman = eLevelAman;
levelSiaga = eLevelSiaga;
beepBahaya = eBeepBahaya;
beepSiaga = eBeepSiaga;
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Saving...");
}
void factoryReset() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Factory Reset");
alarmHazard(1, 800, LED_NOTIF);
lcd.clear();
int frMenu = 0;
int reset = 1;
while (reset == 1) {
if (frMenu == 0) {
lcd.setCursor(0, 0);
lcd.print(">No");
lcd.setCursor(0, 1);
lcd.print(" Yes");
if (PRESS_CENTER) {
while (true){
delay(1000);
break;
}
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Canceled");
delay(200);
lcd.clear();
reset = 0;
}
} else if (frMenu == 1) {
lcd.setCursor(0, 0);
lcd.print(" No");
lcd.setCursor(0, 1);
lcd.print(">Yes");
if (PRESS_CENTER) {
resetAll();
delay(1000);
lcd.clear();
reset = 0;
}
}
if (PRESS_L) {
delay(200);
lcd.clear();
break;
}
if (PRESS_U) {
frMenu --;
if (frMenu > 1) {
frMenu = 1;
}
delay(200);
}
if (PRESS_D) {
frMenu ++;
if (frMenu < 0) {
frMenu = 0;
}
delay(200);
}
}
}
// String statusAir() {
// String status;
// if (waterLevel <= levelAman) {
// status = "Aman";
// } else if (waterLevel <= levelSiaga) {
// status = "Siaga";
// if (alarmSiaga == true){
// alarmHazard(beepSiaga, 700, LED_HAZARD);
// alarmSiaga = false;
// }
// } else {
// status = "Bahaya";
// if (alarmBahaya == true){
// alarmHazard(beepBahaya, 250, LED_HAZARD);
// alarmBahaya = false;
// }
// }
// return status;
// }
void menuDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Control Panel ");
lcd.setCursor(0, 1);
lcd.print("Loading...");
delay(500);
lcd.clear();
int menu = 0;
while (true) {
switch (menu) {
case 0:
lcd.setCursor(0, 0);
lcd.print(">Lvl Aman:");
lcd.print(levelAman);
lcd.print("Cm");
lcd.setCursor(0, 1);
lcd.print(" Lvl Siaga:");
lcd.print(levelSiaga);
lcd.print("Cm");
if (PRESS_R) {
levelAman ++;
delay(200);
}
if (PRESS_L) {
levelAman --;
delay(200);
}
break;
case 1:
lcd.setCursor(0, 0);
lcd.print(" Lvl Aman:");
lcd.print(levelAman);
lcd.print("Cm");
lcd.setCursor(0, 1);
lcd.print(">Lvl Siaga:");
lcd.print(levelSiaga);
lcd.print("Cm");
if (PRESS_R) {
levelSiaga = levelSiaga + 5;
delay(200);
}
if (PRESS_L) {
levelSiaga = levelSiaga - 5;
}
break;
case 2:
lcd.setCursor(0, 0);
lcd.setCursor(0, 0);
sprintf(buffer, ">Bip Bahaya:%3d%s", beepBahaya, "x");
lcd.print(buffer);
lcd.setCursor(0, 1);
sprintf(buffer, " Bip Siaga:%4d%s", beepSiaga, "x");
lcd.print(buffer);
if (PRESS_R) {
beepBahaya ++;
delay(200);
}
if (PRESS_L) {
beepBahaya --;
delay(200);
}
break;
case 3:
lcd.setCursor(0, 0);
sprintf(buffer, " Bip Bahaya:%3d%s", beepBahaya, "x");
lcd.print(buffer);
lcd.setCursor(0, 1);
sprintf(buffer, ">Bip Siaga:%4d%s", beepSiaga, "x");
lcd.print(buffer);
if (PRESS_R) {
beepSiaga ++;
delay(200);
}
if (PRESS_L) {
beepSiaga --;
delay(200);
}
break;
}
if (PRESS_U) {
menu -- ;
if (menu < 0) {
menu = 0;
}
delay(200);
}
if (PRESS_D) {
menu ++ ;
if (menu > 3) {
menu = 3;
}
delay(200);
}
if (PRESS_CENTER) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Saving...");
delay(500);
menu = 0;
break;
}
eLevelAman = levelAman;
eLevelSiaga = levelSiaga;
eBeepBahaya = beepBahaya;
eBeepSiaga = beepSiaga;
}
}
// ==================================================================================================================
// ==================================================================================================================
void setup() {
pinMode(PIN_BUTTON_R, INPUT_PULLUP);
pinMode(PIN_BUTTON_L, INPUT_PULLUP);
pinMode(PIN_BUTTON_U, INPUT_PULLUP);
pinMode(PIN_BUTTON_D, INPUT_PULLUP);
pinMode(PIN_BUTTON_CENTER, INPUT_PULLUP);
pinMode(SENSOR_AIR, INPUT);
pinMode(LED_NOTIF, OUTPUT);
levelAman = eLevelAman;
levelSiaga = eLevelSiaga;
beepBahaya = eBeepBahaya;
beepSiaga = eBeepSiaga;
//Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(4, 0);
lcd.print("WaterLev");
lcd.setCursor(3, 1);
lcd.print("By PT Bima");
alarmHazard(1, 100, LED_NOTIF);
delay(2000);
lcd.clear();
if (PRESS_CENTER) {
factoryReset();
lcd.clear();
}
lcd.setCursor(2, 0);
lcd.print("Version 1.0 ");
lcd.setCursor(3, 1);
lcd.print("Loading...");
alarmHazard(2, 100, LED_NOTIF);
lcd.clear();
}
// ==================================================================================================================
// ==================================================================================================================
void loop() {
int waterLevel = map(analogRead(SENSOR_AIR), 0, 1023, 0, 300);
String status;
if (waterLevel <= levelAman) {
status = "Aman";
} else if (waterLevel <= levelSiaga) {
status = "Siaga";
if (alarmSiaga == true){
alarmHazard(beepSiaga, 700, LED_HAZARD);
alarmSiaga = false;
}
} else {
status = "Bahaya";
if (alarmBahaya == true){
alarmHazard(beepBahaya, 250, LED_HAZARD);
alarmBahaya = false;
}
}
sprintf(buffer, "Lvl Air: %3d%s", waterLevel, "cm");
lcd.setCursor(1, 0);
lcd.print(buffer);
lcd.setCursor(1, 1);
sprintf(buffer, "Status: %6s", status.c_str());
lcd.print(buffer);
if (PRESS_R && PRESS_L){
alarmSiaga = true;
alarmBahaya = true;
}
if (PRESS_CENTER) {
menuDisplay();
lcd.clear();
}
// delay(500);
//
// lcd.clear();
// lcd.setCursor(6, 0);
// lcd.print("TIME");
// lcd.setCursor(4, 1);
// lcd.print("17: 15: 10");
// delay(5000);
//alarm(waterLevel);
}