#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define COIN_SWITCH_PIN 8
#define COIN_BUTTON_PIN 2
#define RESET_BUTTON_PIN 7
LiquidCrystal_I2C lcd(0x27, 20, 4);
volatile float totalAmount = 0.0;
volatile float selectedCoin = 0.25; // Start with 0.25 Baht coin
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 200;
void setup() {
pinMode(COIN_SWITCH_PIN, INPUT_PULLUP);
pinMode(COIN_BUTTON_PIN, INPUT_PULLUP);
pinMode(RESET_BUTTON_PIN, INPUT_PULLUP);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" Digital Piggy Bank");
updateLCD();
}
void loop() {
static unsigned long lastSwitchPressTime = 0;
static unsigned long lastCoinPressTime = 0;
static unsigned long lastResetPressTime = 0;
// Check if coin selection switch is pressed
if (digitalRead(COIN_SWITCH_PIN) == LOW) {
if (millis() - lastSwitchPressTime > debounceDelay) {
changeCoin();
lastSwitchPressTime = millis();
}
}
// Check if coin insert button is pressed
if (digitalRead(COIN_BUTTON_PIN) == LOW) {
if (millis() - lastCoinPressTime > debounceDelay) {
coinInserted();
lastCoinPressTime = millis();
}
}
// Check if reset button is pressed
if (digitalRead(RESET_BUTTON_PIN) == LOW) {
if (millis() - lastResetPressTime > debounceDelay) {
resetAmount();
lastResetPressTime = millis();
}
}
}
void coinInserted() {
totalAmount += selectedCoin;
updateLCD();
}
void resetAmount() {
totalAmount = 0.0;
updateLCD();
}
void changeCoin() {
if (selectedCoin == 0.25) {
selectedCoin = 0.5;
} else if (selectedCoin == 0.5) {
selectedCoin = 1;
} else if (selectedCoin == 1) {
selectedCoin = 2;
} else if (selectedCoin == 2) {
selectedCoin = 5;
} else if (selectedCoin == 5) {
selectedCoin = 10;
} else if (selectedCoin == 10) {
selectedCoin = 0.25;
}
updateLCD();
}
void updateLCD() {
lcd.setCursor(0, 1);
lcd.print(" Coin: ");
lcd.print(selectedCoin, 2);
lcd.print(" Baht ");
lcd.setCursor(0, 2);
lcd.print(" Total: ");
lcd.print(totalAmount, 2);
lcd.print(" Baht ");
}