#include <NewPing.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>
// konstanta global
const int max_dist = 120; // tinggi dari sonar ke dasar tangki
const int baris = 4; // ukuran keypad
const int kolom = 4; // ukuran keypad
// pin yang digunakan
const int trig_sonar = 3; // ultrasonic
const int echo_sonar = 2; // ultrasonic
uint8_t colPins[kolom] = { 7, 6, 5, 4 }; // Pin untuk C1, C2, C3, C4
uint8_t rowPins[baris] = { 11, 10, 9, 8 }; // Pin untuk R1, R2, R3, R4
const int servo_buang = 12; // servo pin
const int servo_isi = 13; // servo pin
// variable global
char keys[baris][kolom] = { // mapping keypad
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
String Password = "6969";
double tinggi = 0;
double tinggi_tangki = 100; // tinggi dasar tangki ke sensor (cm)
// objek yang digunakan
NewPing sonar(trig_sonar, echo_sonar, max_dist);
LiquidCrystal_I2C LCD(0x27, 16, 2);
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, baris, kolom);
Servo isi;
Servo buang;
void setup() {
// mulai LCD
LCD.init();
LCD.backlight();
while (true) {
// masukan password
LCD.print(" PASSWORD: ");
LCD.setCursor(0, 1);
String pass_input = "";
while (pass_input.length() < 4){
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
LCD.print('*');
pass_input += key;
}
}
// cek password
if (pass_input.equals(Password)) { // password benar
LCD.clear();
LCD.print(" SELAMAT ");
LCD.setCursor(0, 1);
LCD.print(" DATANG! ");
delay (2000);
LCD.clear();
break;
}
else { // password salah
LCD.clear();
LCD.print(" PASSWORD ");
LCD.setCursor(0, 1);
LCD.print(" SALAH ");
delay (2000);
LCD.clear();
}
}
// print menu utama
LCD.print("TEKAN A UNTUK");
LCD.setCursor(0, 1);
LCD.print("MENGUBAH NILAI");
// inisiasi servo
isi.attach(servo_isi);
buang.attach(servo_buang);
isi.write(0);
buang.write(0);
// inisiasi tinggi tangki
tinggi = tinggi_tangki - (double)sonar.ping_cm();
// debugging
Serial.begin(9600);
}
void isiTangki() {
LCD.print(" PENGISIAN ");
LCD.setCursor(0, 1);
}
void buangTangki() {
LCD.print(" PEMBUANGAN ");
LCD.setCursor(0, 1);
}
void loop() {
char key = keypad.getKey();
String input_val = "";
double tinggi_air = tinggi_tangki - (double)sonar.ping_cm();
delay(50);
if (key == 'A') {
LCD.clear();
LCD.print("Tinggi: ");
LCD.print(tinggi_air);
LCD.setCursor(0, 1);
LCD.print("Nilai: ");
while (input_val.length() < 5){ // masukkan nilai
char val = keypad.getKey();
if (val >= '0' && val <= '9' || val == '.') {
LCD.print(val);
input_val += val;
}
else if (val == 'B') { // selesai
tinggi = input_val.toDouble();
LCD.clear();
LCD.print(" NILAI BARU: ");
LCD.setCursor(6, 1);
LCD.print(tinggi);
delay(2000);
LCD.clear();
LCD.print(" MEMPROSES... ");
// proses data baru
if (tinggi_air == tinggi) {
break;
}
while (fabs(tinggi_air - tinggi) > 1) {
tinggi_air = tinggi_tangki - (double)sonar.ping_cm();
delay(50);
if (tinggi > tinggi_air) { // air di tangki perlu ditambah
buang.write(0);
isi.write(45);
}
else if (tinggi < tinggi_air) { // air di tangki perlu dibuang
isi.write(0);
buang.write(45);
}
}
isi.write(0); // tutup keran isi
buang.write(0); // tutup keran buang
LCD.clear();
LCD.print("TEKAN A UNTUK");
LCD.setCursor(0, 1);
LCD.print("MENGUBAH NILAI");
break;
}
else if (val == 'C') { // cancel
LCD.clear();
LCD.print("TEKAN A UNTUK");
LCD.setCursor(0, 1);
LCD.print("MENGUBAH NILAI");
break;
}
else if (val != NO_KEY) { // nilai gagal
LCD.clear();
LCD.print(" INVALID ");
LCD.setCursor(0, 1);
LCD.print(" INPUT ");
delay(2000);
LCD.clear();
LCD.print("TEKAN A UNTUK");
LCD.setCursor(0, 1);
LCD.print("MENGUBAH NILAI");
break;
}
}
}
}