#include<TFT_eSPI.h>
#include<lvgl.h>
// #include <Adafruit_FT6206.h>
// Adafruit_FT6206 ctp = Adafruit_FT6206();
// The display also uses hardware SPI,
#define TFT_MISO 13
#define TFT_MOSI 11
#define TFT_SCLK 12
#define TFT_CS 10
#define TFT_DC 14
TFT_eSPI tft = TFT_eSPI();
bool levelMinuman1[3] = {0,0,0};
bool levelMinuman2[3] = {0,0,0};
// Pin GPIO yang dipakai
const int pinlevelMinuman1[3] = {19,20,21};
const int pinlevelMinuman2[3] = {47,48,45};
const int pinValveMinuman[6] = {16, 15, 7, 6, 5, 4};
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Program Dispenser 6 Galon Berjalan !");
pinMode(42, INPUT_PULLUP); // tombol minuman2
pinMode(41, INPUT_PULLUP); // tombol minuman1
pinMode(40, INPUT_PULLUP); // flow minuman1
pinMode(39, INPUT_PULLUP); // flow minuman1
pinMode(38, INPUT_PULLUP); // flow minuman2
pinMode(37, INPUT_PULLUP); // flow minuman2
pinMode(35, OUTPUT); // valve dan pompa minuman 1
pinMode(36, OUTPUT); // valve dan pompa minuman 2
for(int i=0;i<3;i++){
pinMode(pinlevelMinuman1[i], INPUT_PULLUP);
pinMode(pinlevelMinuman2[i], INPUT_PULLUP);
}
for(int i=0;i<6;i++){
pinMode(pinValveMinuman[i],OUTPUT);
digitalWrite(pinValveMinuman[i], LOW);
}
tft.init();
tft.setRotation(0);
tft.drawString("Selamat Datang", 0, 0, 2);
}
int galondibuka;
bool lastclk1=1, clk1now=1, lastclk2=1, clk2now=1;
bool button1Old=1, button1Now=1, button2Old=1, button2Now=1;
bool lastdt1=1, dt1now=1, lastdt2=1, dt2now=1;
bool inTransaction1, inTransaction2, startTransaction1, startTransaction2;
const float maxMinuman1 = 8.5, maxMinuman2=7.5;
const float increment=0.5; //perubahan tiap terbaca encoder sebanyak 0.5ml (masih asumsi)
float volume1,volume2;
void loop() {
if(Serial.available()>0){
String dt=Serial.readStringUntil('\n');
dt.trim();
if(dt == "minuman1"){
startTransaction1=true;
Serial.println("Mulai transaksi 1, tekan tombol minuman1 untuk memulai");
}else if (dt == "minuman2"){
startTransaction2=true;
Serial.println("Mulai transaksi 2, tekan tombol minuman2 untuk memulai");
}
}
if(startTransaction1){
button1Now = digitalRead(41);
if(button1Now != button1Old){
if(button1Now==LOW){
inTransaction1=true;
Serial.println("masuk transaksi 1");
galondibuka = cekgalonkosong(true);
if(galondibuka!=9){
digitalWrite(pinValveMinuman[galondibuka], HIGH);
}else{
Serial.println("Semua galon minuman 1 sudah kosong, silahkan isi kembali");
}
Serial.println("Galon no :"+String(galondibuka)+" dibuka");
delay(5000);
startTransaction1=false;
}
button1Old=button1Now;
}
}
if(startTransaction2){
button2Now = digitalRead(42);
if(button2Now != button2Old){
if(button2Now==LOW){
inTransaction2=true;
Serial.println("masuk transaksi 2");
galondibuka = cekgalonkosong(true);
if(galondibuka!=99){
digitalWrite(pinValveMinuman[galondibuka], HIGH);
}else{
Serial.println("Semua galon minuman 2 sudah kosong, silahkan isi kembali");
}
Serial.println("Galon no :"+String(galondibuka)+" dibuka");
delay(5000);
startTransaction2=false;
}
button2Old=button2Now;
}
}
if(inTransaction1){
digitalWrite(35, HIGH);
clk1now=digitalRead(39);
dt1now=digitalRead(40);
if(clk1now!=lastclk1){
if(clk1now == LOW){
if (clk1now != dt1now){
// Serial.println("arah Clock Wise - KANAN");
volume1+=increment;
}else{
// Serial.println("arah Counter Clock Wise - KIRI");
volume1-=increment;
}
}
}
lastdt1 = dt1now;
lastclk1=clk1now;
Serial.println("volume1 : "+String(volume1));
if(volume1 >= maxMinuman1){
inTransaction1=false;
digitalWrite(35, LOW);
volume1=0;
Serial.println("Transaksi Selesai");
}
}
if(inTransaction2){
digitalWrite(36, HIGH);
clk2now=digitalRead(37);
dt2now=digitalRead(38);
if(clk2now!=lastclk2){
if(clk2now == LOW){
if (clk2now != dt2now){
// Serial.println("arah Clock Wise - KANAN");
volume2+=increment;
}else{
// Serial.println("arah Counter Clock Wise - KIRI");
volume2-=increment;
}
}
}
lastdt2 = dt2now;
lastclk2=clk2now;
Serial.println("volume2 : "+String(volume2));
if(volume2 >= maxMinuman2){
inTransaction2=false;
digitalWrite(36, LOW);
volume2=0;
Serial.println("Transaksi Selesai");
}
}
if(inTransaction1==false && inTransaction2 == false){
for(int i=0;i<6;i++){
digitalWrite(pinValveMinuman[i],LOW);
}
}
delay(1); // this speeds up the simulation
}
int cekgalonkosong(bool galonminuman1){
if(galonminuman1 == true){
for(int i=0;i<3;i++){
levelMinuman1[i] = digitalRead(pinlevelMinuman1[i]);
}
if(levelMinuman1[0] && levelMinuman1[1] && levelMinuman1[2]){
return 0;
}else if(!levelMinuman1[0] && levelMinuman1[1] && levelMinuman1[2]){
return 1;
}else if(!levelMinuman1[0] && !levelMinuman1[1] && levelMinuman1[2]){
return 2;
}else if(!levelMinuman1[0] && levelMinuman1[1] && levelMinuman1[2]){
return 9;
}
}else {
for(int i=0;i<3;i++){
levelMinuman2[i] = digitalRead(pinlevelMinuman2[i]);
}
if(levelMinuman2[0] && levelMinuman2[1] && levelMinuman2[2]){
return 3;
}else if(!levelMinuman2[0] && levelMinuman2[1] && levelMinuman2[2]){
return 4;
}else if(!levelMinuman2[0] && !levelMinuman2[1] && levelMinuman2[2]){
return 5;
}else if(!levelMinuman2[0] && levelMinuman2[1] && levelMinuman2[2]){
return 99;
}
}
}Pompa Minuman2
Pompa Minuman1
Level Sensor :
Galon Minuman1 (1,2,3)
Galon Minuman2 (6,7,8)
Valve Galon Minuman 1
Valve Galon Minuman 2
Flow Sensor Minuman1
Flow Sensor Minuman2
Langkah-langkah Simulasi:
1. Masukkan string "minuman1" atau "minuman2" di terminal/serial monitor.
2. Tekan tombol sesuai perintah jenis minuman yang dimasukkan.
2. Klik tanda panah atas di salah satu flow sensor minuman (sesuai string perintah masukan awal).
3. Klik switch Level Sensor untuk simulasi galon yang sudah kosong (ON berarti kosong).