#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define coinSlot 6
#define coinSlotRGBFrame 2
#define buzzer 13
#define incrementButton 9
#define decrementButton 10
// Relay pins array
const int relayPins[10] = {3, 4, 5, 7, 11, 12, A0, A1, A2, A3};
int coinSlotStatus;
int pulse;
int selectedRelay = 1; // Initial selected relay
boolean userBalance = false;
boolean noCoin = false;
char lcdBuffer[16];
int incrementButtonState, decrementButtonState;
void setup() {
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(buzzer, OUTPUT);
pinMode(coinSlot, INPUT_PULLUP);
pinMode(coinSlotRGBFrame, OUTPUT);
pinMode(incrementButton, INPUT_PULLUP);
pinMode(decrementButton, INPUT_PULLUP);
for (int i = 0; i < 10; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], HIGH); // Ensure all relays are off initially
}
// Startup sound sequence
tone(buzzer, 262);
delay(150);
tone(buzzer, 294);
delay(150);
tone(buzzer, 330);
delay(150);
tone(buzzer, 349);
delay(150);
tone(buzzer, 440);
delay(150);
tone(buzzer, 494);
delay(150);
tone(buzzer, 563);
delay(500);
noTone(buzzer);
delay(1000);
}
void loop() {
// Display message for coin insertion if no coin has been inserted
if (!noCoin) {
noCoin = true;
lcd.setCursor(0, 0);
lcd.print(" INSERT COINS");
digitalWrite(coinSlotRGBFrame, HIGH);
}
// Read button states
incrementButtonState = digitalRead(incrementButton);
decrementButtonState = digitalRead(decrementButton);
// Increment selected relay if increment button is pressed
if (incrementButtonState == LOW) {
if (selectedRelay < 10) {
selectedRelay++;
updateRelaySelection();
delay(200); // Debounce delay
}
}
// Decrement selected relay if decrement button is pressed
if (decrementButtonState == LOW) {
if (selectedRelay > 1) {
selectedRelay--;
updateRelaySelection();
delay(200); // Debounce delay
}
}
// Activate selected relay if balance is available
if (pulse > 0 && userBalance) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" ACTIVATING...");
digitalWrite(relayPins[selectedRelay - 1], LOW); // Activate the selected relay
for (int i = pulse; i > 0; i--) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(i);
tone(buzzer, 523);
delay(500);
noTone(buzzer);
delay(500);
}
digitalWrite(relayPins[selectedRelay - 1], HIGH); // Deactivate the relay
pulse = 0;
noCoin = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Thank You Bye!");
delay(2000);
tone(buzzer, 3000);
delay(200);
noTone(buzzer);
delay(50);
tone(buzzer, 3000);
delay(50);
noTone(buzzer);
}
// Handle coin insertion
coinSlotStatus = digitalRead(coinSlot);
delay(30);
if (coinSlotStatus == 0) {
digitalWrite(coinSlotRGBFrame, LOW);
tone(buzzer, 2000);
userBalance = true;
pulse += 1;
lcd.setCursor(0, 0);
lcd.print("Press a Button");
sprintf(lcdBuffer, "Bal. Php %d.00", pulse);
lcd.setCursor(0, 1);
lcd.print(lcdBuffer);
delay(30);
}
noTone(buzzer);
}
void updateRelaySelection() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Select Relay: ");
lcd.print(selectedRelay);
}