#include <Wire.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>
RTC_DS3231 rtc;
bool rtcAvailable = true;
// --- SD Card ---
#define SD_CS_PIN 5
File logFile;
bool sdAvailable = false;
// --- Daftar Menu dan Pin Tombol ---
const int NUM_BUTTONS = 11;
const int buttonPins[NUM_BUTTONS] = {
13, 12, 14, 27, 26, 25, 35, 34,
15, 2, 4
};
const char* itemNames[NUM_BUTTONS] = {
"GULA", "TEPUNG GULA", "PEDAS", "SUSU PUTIH", "SUSU COKLAT",
"KEJU SUSU", "KACANG SUSU", "CHOCOLATE", "MESES SUSU", "OREO SUSU",
"COKELAT KACANG SUSU"
};
bool lastState[NUM_BUTTONS];
unsigned long lastDebounce[NUM_BUTTONS];
const unsigned long debounceDelay = 200;
// --- Tombol kontrol ---
const int cancelButtonPin = 33;
bool lastCancelState = HIGH;
unsigned long lastCancelDebounce = 0;
const int finishButtonPin = 32;
bool lastFinishState = HIGH;
unsigned long lastFinishDebounce = 0;
// --- Penyimpanan pesanan ---
const int MAX_ORDERS = 100;
String orderHistory[MAX_ORDERS];
int orderCount = 0;
void setup() {
Serial.begin(115200);
Wire.begin();
// RTC
if (!rtc.begin()) {
Serial.println("⚠️ RTC tidak ditemukan. Melanjutkan tanpa RTC.");
rtcAvailable = false;
} else if (rtc.lostPower()) {
Serial.println("RTC kehilangan daya. Mengatur ulang waktu.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// SD
if (SD.begin(SD_CS_PIN)) {
sdAvailable = true;
Serial.println("✅ SD Card siap.");
} else {
Serial.println("⚠️ SD Card gagal dibaca.");
}
// Tombol menu
for (int i = 0; i < NUM_BUTTONS; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
lastState[i] = digitalRead(buttonPins[i]);
lastDebounce[i] = 0;
}
// Tombol kontrol
pinMode(cancelButtonPin, INPUT_PULLUP);
lastCancelState = digitalRead(cancelButtonPin);
pinMode(finishButtonPin, INPUT_PULLUP);
lastFinishState = digitalRead(finishButtonPin);
Serial.println("✅ Sistem pencatatan topping siap!");
}
void loop() {
// Cek tombol topping
for (int i = 0; i < NUM_BUTTONS; i++) {
int currentState = digitalRead(buttonPins[i]);
if (lastState[i] == HIGH && currentState == LOW) {
if (millis() - lastDebounce[i] > debounceDelay) {
logOrder(itemNames[i]);
lastDebounce[i] = millis();
}
}
lastState[i] = currentState;
}
// Cancel
int cancelState = digitalRead(cancelButtonPin);
if (lastCancelState == HIGH && cancelState == LOW) {
if (millis() - lastCancelDebounce > debounceDelay) {
cancelLastOrder();
lastCancelDebounce = millis();
}
}
lastCancelState = cancelState;
// Selesai
int finishState = digitalRead(finishButtonPin);
if (lastFinishState == HIGH && finishState == LOW) {
if (millis() - lastFinishDebounce > debounceDelay) {
showFinalOrder();
lastFinishDebounce = millis();
}
}
lastFinishState = finishState;
}
void logOrder(const char* item) {
if (orderCount < MAX_ORDERS) {
orderHistory[orderCount] = item;
orderCount++;
Serial.print("Pesanan dicatat: ");
Serial.println(item);
} else {
Serial.println("❌ Memori penuh.");
}
}
void cancelLastOrder() {
if (orderCount > 0) {
orderCount--;
Serial.print("Pesanan dibatalkan: ");
Serial.println(orderHistory[orderCount]);
orderHistory[orderCount] = "";
} else {
Serial.println("Tidak ada pesanan.");
}
}
void showFinalOrder() {
Serial.println("\n=== PESANAN SELESAI ===");
String timeStamp = "";
if (rtcAvailable) {
DateTime now = rtc.now();
char buffer[30];
sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d",
now.year(), now.month(), now.day(),
now.hour(), now.minute(), now.second());
timeStamp = String(buffer);
Serial.print("Waktu: ");
Serial.println(timeStamp);
} else {
timeStamp = "[Waktu tidak tersedia]";
}
if (orderCount == 0) {
Serial.println("Tidak ada pesanan.");
return;
}
int itemCounts[NUM_BUTTONS] = {0};
for (int i = 0; i < orderCount; i++) {
for (int j = 0; j < NUM_BUTTONS; j++) {
if (orderHistory[i] == itemNames[j]) {
itemCounts[j]++;
}
}
}
int total = 0;
String output = timeStamp + ", Pesanan: ";
for (int j = 0; j < NUM_BUTTONS; j++) {
if (itemCounts[j] > 0) {
Serial.print(itemNames[j]);
Serial.print(": ");
Serial.println(itemCounts[j]);
output += String(itemCounts[j]) + "x " + itemNames[j] + ", ";
total += itemCounts[j];
}
}
Serial.print("TOTAL ITEM: ");
Serial.println(total);
output += "TOTAL: " + String(total);
// Simpan ke SD Card
if (sdAvailable) {
logFile = SD.open("pesanan.txt", FILE_APPEND);
if (logFile) {
logFile.println(output);
logFile.close();
Serial.println("✅ Pesanan disimpan di SD Card.");
} else {
Serial.println("❌ Gagal menulis ke SD Card.");
}
}
Serial.println("========================\n");
// Reset
for (int i = 0; i < orderCount; i++) orderHistory[i] = "";
orderCount = 0;
}