#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, & Wire, OLED_RESET);
const int buttonUpPin = 25; // Pin untuk tombol Up
const int buttonDownPin = 26; // Pin untuk tombol Down
const int buttonCoinPin = 27; // Pin untuk tombol Coin
const int buttonNextPin = 14; // Pin untuk tombol Next
const int buttonBackPin = 12; // Pin untuk tombol Back
int menu=0;
int flag_coffee=0, flag_milk=0, flag_tea=0;
int pay_coffee=0, pay_milk=0, pay_tea=0;
int price_coffee=0, price_milk=0, price_tea=0;
unsigned long previousMillis = 0;
const unsigned long timeoutPeriod = 80000;
void setup() {
pinMode(buttonUpPin, INPUT_PULLUP);
pinMode(buttonDownPin, INPUT_PULLUP);
pinMode(buttonCoinPin, INPUT_PULLUP);
pinMode(buttonNextPin, INPUT_PULLUP);
pinMode(buttonBackPin, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Serial.begin(19200);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(18,13);
display.println("VenDrink");
display.setCursor(18,28);
display.println("Machine");
display.display();
flag_coffee=0;
flag_milk=0;
flag_tea=0;
delay(2000);
}
void loop() {
unsigned long currentMillis = millis();
static unsigned long previousTimeoutMillis = 0;
if ((pay_coffee == 1 || pay_milk == 1 || pay_tea == 1) && ((currentMillis - previousTimeoutMillis) >= timeoutPeriod))
{
pay_coffee=0;
pay_milk=0;
pay_tea=0;
menu = 10;
previousTimeoutMillis = currentMillis;
previousMillis = currentMillis;
}
if(digitalRead(buttonDownPin)==0){
delay(200);
menu++;
if(menu>2){
menu=2;
}
}
if(digitalRead(buttonUpPin)==0){
delay(200);
menu--;
if(menu<0){
menu=0;
}
}
if(digitalRead(buttonBackPin)==0){
delay(200);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(18,13);
display.println("VenDrink");
display.setCursor(18,28);
display.println("Machine");
display.display();
flag_coffee=0;
flag_milk=0;
flag_tea=0;
pay_coffee=0;
pay_milk=0;
pay_tea=0;
price_coffee=0;
price_milk=0;
price_tea=0;
delay(2000);
menu=0;
}
/////////////// Pilih Menu ////////////////////
if(flag_coffee==1 && digitalRead(buttonNextPin)==0) delay(200), pay_coffee=1;
if(pay_coffee==1) menu=3;
if(flag_milk==1 && digitalRead(buttonNextPin)==0) delay(200), pay_milk=1;
if(pay_milk==1) menu=4;
if(flag_tea==1 && digitalRead(buttonNextPin)==0) delay(200), pay_tea=1;
if(pay_tea==1) menu=5;
/////////////// Payment ////////////////////
if(flag_coffee==1 && digitalRead(buttonCoinPin)==0) {
delay(200);
price_coffee++;
if(price_coffee>3) price_coffee=3;
pay_coffee=0;
menu=5+price_coffee;
}
if(flag_milk==1 && digitalRead(buttonCoinPin)==0) {
delay(200);
price_milk++;
if(price_milk>2) price_milk=2;
pay_milk=0;
menu=5+price_milk;
}
if(flag_tea==1 && digitalRead(buttonCoinPin)==0) {
delay(200);
price_tea++;
if(price_tea>1) price_tea=1;
pay_tea=0;
menu=5+price_tea;
}
/////////////// Double Cek ////////////////////
if(price_coffee==3){
delay(200);
menu=9;
}
if(price_milk==2){
delay(200);
menu=9;
}
if(price_tea==1){
delay(200);
menu=9;
}
switch (menu) {
case 0: //Coffee
display.clearDisplay();
display.setTextSize(1.5);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10,5);
display.println("List Menu :");
display.setCursor(10,20);
display.setTextSize(1);
display.println(">>> 1. Coffee");
display.setCursor(15,30);
display.println("2. Milk");
display.setCursor(15,40);
display.println("3. Tea");
display.setCursor(100,50);
display.println("OK");
display.setCursor(0,50);
display.println("Back");
display.display();
flag_coffee=1;
flag_milk=0;
flag_tea=0;
break;
case 1: //Milk
display.clearDisplay();
display.setTextSize(1.5);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10,5);
display.println("List Menu :");
display.setCursor(10,20);
display.setTextSize(1);
display.println("1. Coffee");
display.setCursor(15,30);
display.println(">>> 2. Milk");
display.setCursor(15,40);
display.println("3. Tea");
display.setCursor(100,50);
display.println("OK");
display.setCursor(0,50);
display.println("Back");
display.display();
flag_coffee=0;
flag_milk=1;
flag_tea=0;
break;
case 2: //Tea
display.clearDisplay();
display.setTextSize(1.5);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10,5);
display.println("List Menu :");
display.setCursor(10,20);
display.setTextSize(1);
display.println("1. Coffee");
display.setCursor(15,30);
display.println("2. Milk");
display.setCursor(15,40);
display.println(">>> 3. Tea");
display.setCursor(100,50);
display.println("OK");
display.setCursor(0,50);
display.println("Back");
display.display();
flag_coffee=0;
flag_milk=0;
flag_tea=1;
break;
case 3: // Payment Kopi
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(18,0);
display.println("PRICE");
display.setTextSize(1.5);
display.setCursor(38,22);
display.println("$3");
display.display();
if (digitalRead(buttonNextPin) == 0)
{
delay(250);
previousMillis = currentMillis;
pay_coffee = 1;
}
break;
case 4: // Payment Susu
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(18,0);
display.println("PRICE");
display.setTextSize(1.5);
display.setCursor(38,22);
display.println("$2");
display.display();
if (digitalRead(buttonNextPin) == 0)
{
delay(250);
previousMillis = currentMillis;
pay_milk = 1;
}
break;
case 5: // Payment Teh
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(18,0);
display.println("PRICE");
display.setTextSize(1.5);
display.setCursor(38,22);
display.println("$1");
display.display();
if (digitalRead(buttonNextPin) == 0)
{
delay(250);
previousMillis = currentMillis;
pay_tea = 1;
}
break;
case 6: // 3000
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Your Coin");
display.setTextSize(1.5);
display.setCursor(38,22);
display.println("$1");
display.display();
break;
case 7: // 2000
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Your Coin");
display.setTextSize(1.5);
display.setCursor(38,22);
display.println("$2");
display.display();
break;
case 8: // 1000
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Your Coin");
display.setTextSize(1.5);
display.setCursor(38,22);
display.println("$3");
display.display();
break;
case 9: // Diterima
display.clearDisplay();
display.setTextSize(1.5);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10,0);
display.println("Your Payment");
display.setCursor(12,15);
display.println("Accepted");
display.display();
delay(2000);
flag_coffee = 0;
flag_milk = 0;
flag_tea = 0;
pay_coffee = 0;
pay_milk = 0;
pay_tea = 0;
price_coffee = 0;
price_milk = 0;
price_tea = 0;
menu = 0;
break;
case 10: // Timeout
display.clearDisplay();
display.setTextSize(1.5);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10,0);
display.println("TIMEOUT");
display.setCursor(12,15);
display.println("Try Again");
display.display();
delay(2000);
menu = 0;
// previousMillis = 0;
// currentMillis = 0;
// previousTimeoutMillis = 0;
break;
}
}