#include "WiFi.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Keypad.h>
#include <SPI.h>
#include <Wire.h>
#include <vector>
#define SDA_PIN 25
#define SCL_PIN 33
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3c
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define LEDpin1 26
#define LEDpin2 27
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte colPins[COLS] = { 18, 5, 17, 16 };
byte rowPins[ROWS] = { 23, 22, 21, 19 };
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
struct Pesanan {
int id;
bool aktif;
int durasiMenit;
unsigned long mulai;
};
std::vector<Pesanan> daftarPesanan;
String inputWaktu = "";
bool inputMode = true;
bool menungguPesananBaru = false;
int indexPesananInput = 0;
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
display.begin(SSD1306_SWITCHCAPVCC, 0x3c);
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
pinMode(LEDpin1, OUTPUT);
pinMode(LEDpin2, OUTPUT);
Serial.println("Pesanan pertama masuk!");
indexPesananInput = daftarPesanan.size();
tampilkanInput();
}
void loop() {
char key = keypad.getKey();
if (inputMode) {
if (key) {
if (key >= '0' && key <= '9') {
inputWaktu += key;
tampilkanInput();
} else if (key == 'A' && inputWaktu.length() > 0) {
inputWaktu.remove(inputWaktu.length() - 1);
tampilkanInput();
} else if (key == '#') { // enter
if (inputWaktu.length() > 0) {
int waktuMenit = inputWaktu.toInt();
mulaiPesanan(waktuMenit);
inputMode = false;
menungguPesananBaru = true;
}
}
}
}
else {
if (key == 'B') {
indexPesananInput = daftarPesanan.size();
inputWaktu = "";
inputMode = true;
menungguPesananBaru = false;
Serial.print("Pesanan ");
Serial.print(indexPesananInput + 1);
Serial.println(" masuk!");
tampilkanInput();
digitalWrite(LEDpin1, HIGH);
delay(2000);
digitalWrite(LEDpin1, LOW);
}
}
if (!inputMode) updateDisplay();
}
void mulaiPesanan(int waktuMenit) {
Pesanan p;
p.id = daftarPesanan.size() + 1;
p.aktif = true;
p.durasiMenit = waktuMenit;
if (daftarPesanan.size() > 0) {
int sisaSebelum = hitungSisaDetik(daftarPesanan.size() - 1) / 60;
p.durasiMenit += sisaSebelum;
}
p.mulai = millis();
daftarPesanan.push_back(p);
Serial.print("Pesanan ");
Serial.print(p.id);
Serial.print(" dimulai dengan waktu ");
Serial.print(p.durasiMenit);
Serial.println(" menit.");
}
int hitungSisaDetik(int index) {
if (index >= daftarPesanan.size()) return 0;
Pesanan &p = daftarPesanan[index];
unsigned long elapsed = (millis() - p.mulai) / 1000;
int sisa = p.durasiMenit * 60 - elapsed;
return sisa > 0 ? sisa : 0;
}
void updateDisplay() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
display.println("Daftar Pesanan:");
display.drawLine(0, 10, 128, 10, SSD1306_WHITE);
int y = 15;
for (int i = 0; i < daftarPesanan.size(); i++) {
int sisa = hitungSisaDetik(i);
int m = sisa / 60;
int s = sisa % 60;
display.setCursor(0, y);
display.print("P");
display.print(i+1);
display.print(": ");
if (m < 10) display.print("0");
display.print(m);
display.print(":");
if (s < 10) display.print("0");
display.print(s);
if (sisa <= 0) {
display.setCursor(80, y);
display.print("Done");
}
y += 10;
if (y > 55) break;
}
display.display();
}
void tampilkanInput() {
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.print("Pesanan ");
display.print(indexPesananInput + 1);
display.println(" masuk!");
display.println("Masukkan waktu tunggu:");
display.setTextSize(2);
display.setCursor(0, 40);
display.print(inputWaktu);
display.display();
}