#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int press = 0 ;
#define coinSlotPin 2
const int mDrivePin = 4;
const int pauseStartPin = 5;
const int potPin = A0;
unsigned long startTime = 0;
float coinTime = 0;
bool motorRunning = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
bool lastButtonState = HIGH; // Previous button state
volatile float coinTimeTotal = 0;
volatile float TimeTotal = 0;
volatile bool inserted = false;
bool startPause = false;
bool settings = false;
void setup() {
pinMode(coinSlotPin, INPUT_PULLUP);
pinMode(pauseStartPin, INPUT_PULLUP);
pinMode(mDrivePin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(coinSlotPin), coinSlotISR, FALLING);
lcd.init();
lcd.backlight();
Serial.begin(9600);
// lcd.setCursor(0, 0);
// lcd.print(" Alkasaur");
// lcd.setCursor(0, 1);
// lcd.print(" Water System");
// delay(3000);
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print(" 09959100730");
// lcd.setCursor(0, 1);
// lcd.print(" 09531333303");
// delay(3000);
lcd.clear();
int counter = 3;
while (1) {
lcd.setCursor(0, 0);
lcd.print("Set Time ??");
lcd.setCursor(0, 1);
lcd.print("Press in " + String(counter));
press = digitalRead(pauseStartPin);
Serial.println(press);
delay(1000);
counter -= 1;
if (!press || counter == 0) {
lcd.clear();
if (!press) {
lcd.setCursor(0, 0);
lcd.print("Going To Setting");
settings = true;
} else {
lcd.setCursor(0, 0);
lcd.print("Exit Settings");
}
break;
}
}
delay(1000);
if (settings) {
lcd.setCursor(0, 0);
lcd.print("Release Button !!");
delay(2000);
lcd.clear();
while (1) {
int potValue = analogRead(potPin);
//coinTime = map(potValue, 0, 1023, 0.01, 20.0);
coinTime = map(potValue, 0, 1023, 1, 60); // 1000.0; //
lcd.setCursor(0, 0);
lcd.print("Value: " + String(coinTime) + " Sec");
press = digitalRead(pauseStartPin);
if (!press) {
EEPROM.put(1, coinTime);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Valus saved as ");
lcd.setCursor(0, 1);
lcd.print(String(coinTime) + " Sec" + " /Peso");
break;
}
}
}
EEPROM.get(1, coinTime);
Serial.println("Setting Done ");
Serial.print("Time Value ");
Serial.println(coinTime);
delay(2000);
lcd.clear();
}
void loop() {
if (!coinTimeTotal) {
lcd.setCursor(0, 0);
lcd.print("PLS. INSERT COIN");
lcd.setCursor(0, 1);
lcd.print(" P1 P5 P10 P20");
} else {
if (inserted) {
lcd.clear();
}
if (inserted) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(" CREDIT BALANCE");
lcd.setCursor(0, 1);
lcd.print("PHP: " + String(coinTimeTotal / coinTime) + " ");
inserted = false;
startPause = true;
delay(200);
}
if (startPause) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(" PRESS START");
lcd.setCursor(0, 1);
lcd.print("PHP: " + String(coinTimeTotal / coinTime) + " ");
startPause = false;
}
lcd.setCursor(0, 1);
lcd.print("PHP: " + String(coinTimeTotal / coinTime) + " ");
}
// Serial.println(coinTimeTotal);
// Serial.println(coinTime);
// Check pause/start button state and debounce
int buttonState = digitalRead(pauseStartPin);
if (buttonState != lastButtonState) { // Button state changed
if (buttonState == HIGH && (millis() - lastDebounceTime) > debounceDelay) {
// Button released, toggle timer and motor
motorRunning = !motorRunning;
Serial.print("Button Released ");
Serial.println(motorRunning);
lastDebounceTime = millis();
}
lastButtonState = buttonState;
}
starStoptMotor();
}
void coinSlotISR() {
coinTimeTotal += coinTime;
inserted = true;
Serial.print("Inserted: ");
Serial.println(coinTimeTotal);
}
void starStoptMotor() {
if (motorRunning && coinTimeTotal > 0) {
Serial.println(motorRunning);
coinTimeTotal -= .1;
}
if (coinTimeTotal < 0) {
motorRunning = false;
coinTimeTotal = 0;
}
digitalWrite(mDrivePin, motorRunning);
// delay(78);
delay(100);
}