/*
add : Rahmat Fanshuri
link : https://wokwi.com/projects/344066377058878036
led biru = pompa (pin 8)
led hijau = motor (pin9)
posisi tombol :
- tombol menu
- tombol set time
- tombol stop
- tombol star
progres 90%
kekurangan :
- simpan nilai ke eprom
- rumus persentase air dalam wadah (volume tabung)
*/
///////////////////////////////////////////////////////////////////////////////////////////
#include <LiquidCrystal.h>
#define motor 9
#define pump 8
///////////////////////////////////////////////////////////////////////////////////////////
const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
bool trig_lcd;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
///////////////////////////////////////////////////////////////////////////////////////////
const int TRIG_PIN = A5;
const int ECHO_PIN = A4;
unsigned long t1, t2, pulse_width;
///////////////////////////////////////////////////////////////////////////////////////////
byte remotpins [4] = {14, 15, 16, 17};
byte satuan;
bool t_star, t_stop, t_set;
bool trig_kp1, trig_kp2, trig_kp3, trig_durasi;
int durasi_pompa, ra, rb, rc, rd;
///////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); lcd.clear();
for (int i = 0; i < 4; i++) {
pinMode(remotpins[i], INPUT_PULLUP);
}
pinMode(motor, OUTPUT); pinMode(pump, OUTPUT);
pinMode(10, INPUT); pinMode(11, INPUT);
digitalWrite(motor, 0); digitalWrite(pump, 0);
pinMode(TRIG_PIN, OUTPUT);
digitalWrite(TRIG_PIN, LOW);
pinMode(ECHO_PIN, INPUT);
t_set = 1; trig_lcd = 1;
t_star = 0; t_stop = 1;
trig_durasi = trig_kp1 = trig_kp2 = trig_kp3 = 0;
ra = 5; // set default 5 detik durasi pompa
hitung_durasi();
}
///////////////////////////////////////////////////////////////////////////////////////////
void loop() {
/* Menu Utama--------------------------------------------------------------- */
if ( baca_tombol_menu() == 1) {
// kondisi motor bergerak -----------------------------------------
while (baca_tombol_star() == 1 ) {
digitalWrite(motor, 1); clear_lcd();
lcd.setCursor(1, 0); lcd.print("Conveyor Jalan");
lcd.setCursor(2, 1); lcd.print("Tunggu Gelas");
while (ir_start() == 1 && ir_stop() == 0) {
if (trig_kp1 == 0) {
kendali_pompa(); trig_kp2 = trig_kp1 = 1;
} break;
}
while (ir_start() == 0 && ir_stop() == 1) {
if (trig_kp2 == 1) {
digitalWrite(motor, 0);
trig_kp1 = 0; trig_kp3 = 1;
}
if (baca_tombol_star() == 0) {
break;
}
}
while (ir_start() == 0 && ir_stop() == 0) {
if (trig_kp3 == 1) {
trig_kp2 = trig_kp3 = 0; lcd.clear();
} break;
}
}
// kondisi motor berhenti--------------------------------------------
clear_lcd();
lcd.setCursor(0, 0); lcd.print("Tank Level :");
lcd.print(baca_jarak());
lcd.setCursor(0, 1); lcd.print("Time : ");
lcd.print(durasi_pompa);
digitalWrite(motor, 0);
trig_durasi = trig_kp1 = trig_kp2 = trig_kp3 = 0;
}
/*set time ----------------------- ------------------------------------------ */
else {
satuan = trig_durasi = 1;
while (trig_durasi == 1) {
digitalWrite(motor, 0); digitalWrite(pump, 0);
clear_lcd();
lcd.setCursor(0, 0);
lcd.print("Set Time : ");
lcd.print(durasi_pompa);
lcd.setCursor(15 - satuan, 1);
lcd.print("-");
baca_tombol_set();
baca_tombol_menu();
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////
void kendali_pompa() {
lcd.clear();
lcd.setCursor(6, 0); lcd.print("Wait");
lcd.setCursor(0, 1); lcd.print("Proses Pengisian");
digitalWrite(motor, 0); delay(1000);
digitalWrite(pump, 1);
delay(durasi_pompa);
digitalWrite(pump, 0);
digitalWrite(motor, 1);
lcd.clear();
}
void hitung_durasi() {
durasi_pompa = (ra * 1000) + (rb * 100) + (rc * 10) + rd;
}
/* Pembacaan tombol set ----------------------------------------- */
void baca_tombol_set() {
delay(500);
if (digitalRead(remotpins[1]) == 0) {
lcd.clear();
if (satuan == 1) { // satuan
rd = rd + 1;
if (rd > 9) {
rd = 0;
}
}
else if (satuan == 2) { // puluhan
rc = rc + 1;
if (rc > 9) {
rc = 0;
}
}
else if (satuan == 3) { // ratusan
rb = rb + 1;
if (rb > 9) {
rb = 0;
}
}
else if (satuan == 4) { // ribuan
ra = ra + 1;
}
}
hitung_durasi();
}
/* Pembacaan tombol menu ---------------------------------------- */
bool baca_tombol_menu() {
delay(500);
if (digitalRead(remotpins[0]) == 0) {
t_set = !t_set;
trig_lcd = 1;
if (trig_durasi == 1) {
satuan = satuan + 1;
}
}
if (satuan > 4) {
t_set = !t_set;
trig_lcd = 1;
trig_durasi = satuan = 0;
lcd.clear(); delay(500);
lcd.setCursor(0, 0); lcd.print("Time Disimpan");
/*
* Bagian save data to eproom
*/
delay(2000);
}
return t_set;
}
/* triger clear untuk lcd -------------------------------------- */
void clear_lcd() {
if (trig_lcd == 1) {
lcd.clear(); delay(500);
trig_lcd = 0;
}
}
///////////////////////////////////////////////////////////////////////////////////////////
/* Pembacaan tombol star dan stop conveyor ---------------------- */
bool baca_tombol_star() {
if (digitalRead(remotpins[3]) == 0) {
t_star = 1; trig_lcd = 1; return 1;
}
if (digitalRead(remotpins[2]) == 0) {
t_star = 0; trig_lcd = 1; return 0;
}
return t_star;
}
/* Pembacaan IR START ------------------------------------------- */
bool ir_start() {
if (digitalRead(10) == 1) {
return 1;
} return 0;
}
/* Pembacaan IR STOP -------------------------------------------------------------------- */
bool ir_stop() {
if (digitalRead(11) == 1) {
return 1;
} return 0;
}
/* Pembacaan sensor ultrasonic dalam cm ------------------------------------------------- */
long baca_jarak() {
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
while ( digitalRead(ECHO_PIN) == 0 ); t1 = micros();
while ( digitalRead(ECHO_PIN) == 1); t2 = micros();
pulse_width = t2 - t1;
return (pulse_width / 58.0);
}