#include <EEWrap.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define PIN_BUZ 8
#define PIN_LR 9
#define PIN_LG 10
#define PIN_LB 11
#define PIN_PB_UP 7
#define PIN_PB_DOWN 6
#define PIN_PB_LEFT 5
#define PIN_PB_RIGHT 4
#define PIN_PB_OK 3
#define PB_UP digitalRead(PIN_PB_UP) == LOW
#define PB_DOWN digitalRead(PIN_PB_DOWN) == LOW
#define PB_LEFT digitalRead(PIN_PB_LEFT) == LOW
#define PB_RIGHT digitalRead(PIN_PB_RIGHT) == LOW
#define PB_OK digitalRead(PIN_PB_OK) == LOW
#define PIN_SENSOR_AIR A0
int level_aman = 50;
int level_siaga = 100;
int status_buzzer_siaga = 0;
int status_buzzer_bahaya = 0;
String status[3] = {" AMAN ", " SIAGA ", " BAHAYA "};
EEWrap<int> e_level_aman;
EEWrap<int> e_level_siaga;
void beep(int duration) {
digitalWrite(PIN_BUZ, HIGH);
delay(duration);
digitalWrite(PIN_BUZ, LOW);
delay(duration);
}
void menu_control_panel() {
lcd.setCursor(0, 0);
lcd.print("Control Panel ");
lcd.setCursor(0, 1);
lcd.print("Loading.... ");
delay(1000);
lcd.clear();
int menu = 0;
char buff[16];
while (1) {
switch (menu) {
case 0:
lcd.setCursor(0, 0);
sprintf(buff, ">Lvl Aman: %.4d", level_aman);
lcd.print(buff);
lcd.setCursor(0, 1);
sprintf(buff, " Lvl Siaga: %.4d", level_siaga);
lcd.print(buff);
if (PB_RIGHT) {
level_aman = level_aman + 1;
delay(200);
}
if (PB_LEFT) {
level_aman = level_aman - 1;
delay(200);
}
break;
case 1:
lcd.setCursor(0, 0);
sprintf(buff, " Lvl Aman: %.4d", level_aman);
lcd.print(buff);
lcd.setCursor(0, 1);
sprintf(buff, ">Lvl Siaga: %.4d", level_siaga);
lcd.print(buff);
if (PB_RIGHT) {
level_siaga = level_siaga + 1;
delay(200);
}
if (PB_LEFT) {
level_siaga = level_siaga - 1;
delay(200);
}
break;
case 2:
lcd.setCursor(0, 0);
lcd.print(">Beep Bahaya:3x ");
lcd.setCursor(0, 1);
lcd.print(" Beep Bahaya:5x ");
break;
case 3:
lcd.setCursor(0, 0);
lcd.print(" Beep Bahaya:3x ");
lcd.setCursor(0, 1);
lcd.print(">Beep Bahaya:5x ");
break;
}
if (PB_DOWN) {
menu = menu + 1;
if (menu > 3) {
menu = 3;
}
delay(200);
}
if (PB_UP) {
menu = menu - 1;
if (menu < 0) {
menu = 0;
}
delay(200);
}
if (PB_OK) {
while (PB_OK) {
delay(10);
}
break;
}
}
e_level_aman = level_aman;
e_level_siaga = level_siaga;
lcd.setCursor(0, 0);
lcd.print("Saving..... ");
lcd.setCursor(0, 1);
lcd.print(" ");
delay(1000);
lcd.clear();
}
void setup()
{
pinMode(PIN_BUZ, OUTPUT);
pinMode(PIN_LR, OUTPUT);
pinMode(PIN_LG, OUTPUT);
pinMode(PIN_LB, OUTPUT);
pinMode(PIN_PB_UP, INPUT_PULLUP);
pinMode(PIN_PB_DOWN, INPUT_PULLUP);
pinMode(PIN_PB_LEFT, INPUT_PULLUP);
pinMode(PIN_PB_RIGHT, INPUT_PULLUP);
pinMode(PIN_PB_OK, INPUT_PULLUP);
pinMode(PIN_SENSOR_AIR, INPUT);
// digitalWrite(PIN_BUZ, HIGH);
level_aman = e_level_aman;
level_siaga = e_level_siaga;
lcd.init();
lcd.backlight();
delay(2000);
if (PB_OK) {
lcd.setCursor(0, 0);
lcd.print("Factory Reset ");
lcd.setCursor(0, 1);
lcd.print("Please Wait.. ");
e_level_aman = 50;
e_level_siaga = 100;
level_aman = e_level_aman;
level_siaga = e_level_siaga;
delay(1000);
lcd.clear();
}
lcd.setCursor(0, 0);
lcd.print(" WaterLev ");
lcd.setCursor(0, 1);
lcd.print(" by PT.Bima ");
delay(1000);
lcd.setCursor(0, 0);
lcd.print("Version 1.0 ");
lcd.setCursor(0, 1);
lcd.print("Loading.... ");
for (int i = 0; i < 2; i++) {
digitalWrite(PIN_LR, HIGH);
digitalWrite(PIN_BUZ, HIGH);
delay(500);
digitalWrite(PIN_LR, LOW);
digitalWrite(PIN_BUZ, LOW);
delay(500);
}
lcd.clear();
}
void loop()
{
int level_air = analogRead(PIN_SENSOR_AIR);
char buff[16];
lcd.setCursor(0, 0);
sprintf(buff, "lvl air: %.4d %s", level_air, "Cm");
lcd.print(buff);
if (level_air < level_aman) {
lcd.setCursor(0, 1);
lcd.print("Status:");
lcd.print(status[0]);
status_buzzer_siaga = 0;
status_buzzer_bahaya = 0;
}
else if (level_air <= level_siaga ) {
lcd.setCursor(0, 1);
lcd.print("Status:");
lcd.print(status[1]);
if (status_buzzer_siaga == 0)
{
for (int i = 0; i < 3; i++)
{
beep(1000);
}
status_buzzer_siaga = 1;
}
}
else {
lcd.setCursor(0, 1);
lcd.print("Status:");
lcd.print(status[2]);
if (status_buzzer_bahaya == 0)
{
for (int i = 0; i < 5; i++)
{
beep(1000);
}
status_buzzer_bahaya = 1;
}
}
if (PB_OK) {
menu_control_panel();
}
}