#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Endereço do display I2C
Servo servoMotor;
const int coinSignalPin = 2; // Pino onde o botão do moedeiro envia o sinal
const int ledPins[] = {3, 4, 5}; // Pinos dos LEDs
const int pump1Pin = 6; // Pino da Bomba 1
const int pump2Pin = 7; // Pino da Bomba 2
const int servoPin = 8; // Pino do Servo
const int buttonPump1Pin = 9; // Pino do Botão para acionar Bomba 1
const int buttonPump2Pin = 10; // Pino do Botão para acionar Bomba 2
const int buttonServoPin = 11; // Pino do Botão para acionar o Servo
volatile int pulseCount = 0;
volatile int credit = 0;
unsigned long lastDebounceTime = 0; // Tempo da última mudança de estado do botão
unsigned long debounceDelay = 50; // Tempo de debounce
unsigned long lastLedToggleTime = 0; // Tempo da última mudança de estado dos LEDs
unsigned long ledToggleDelay = 500; // Intervalo de tempo para piscar os LEDs
bool lastCoinSignalState = HIGH; // Estado anterior do botão do moedeiro
bool ledsOn = false; // Estado dos LEDs (ligados/desligados)
void setup() {
pinMode(coinSignalPin, INPUT_PULLUP); // Botão de simulação do moedeiro com pull-up interno
for (int i = 0; i < 3; i++) {
pinMode(ledPins[i], OUTPUT);
}
pinMode(pump1Pin, OUTPUT);
pinMode(pump2Pin, OUTPUT);
pinMode(buttonPump1Pin, INPUT_PULLUP);
pinMode(buttonPump2Pin, INPUT_PULLUP);
pinMode(buttonServoPin, INPUT_PULLUP);
servoMotor.attach(servoPin);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Insert Coin");
lcd.setCursor(0, 1);
lcd.print("Credit: 0 BRL");
}
void loop() {
// Verifica o estado do botão do moedeiro
bool coinSignalState = digitalRead(coinSignalPin);
if (coinSignalState == LOW && lastCoinSignalState == HIGH) {
unsigned long currentTime = millis();
if ((currentTime - lastDebounceTime) > debounceDelay) {
lastDebounceTime = currentTime;
pulseCount++;
if (pulseCount == 4) {
credit++;
pulseCount = 0;
updateLCD();
}
}
}
lastCoinSignalState = coinSignalState;
// Pisca os LEDs enquanto houver crédito disponível
if (credit > 0) {
unsigned long currentTime = millis();
if ((currentTime - lastLedToggleTime) > ledToggleDelay) {
lastLedToggleTime = currentTime;
ledsOn = !ledsOn; // Inverte o estado dos LEDs
for (int i = 0; i < 3; i++) {
digitalWrite(ledPins[i], ledsOn ? HIGH : LOW);
}
}
} else {
// Desliga os LEDs se não houver crédito
for (int i = 0; i < 3; i++) {
digitalWrite(ledPins[i], LOW);
}
}
// Verifica se algum botão foi pressionado e há créditos disponíveis
if (digitalRead(buttonPump1Pin) == LOW && credit > 0) {
activatePump(pump1Pin);
} else if (digitalRead(buttonPump2Pin) == LOW && credit > 0) {
activatePump(pump2Pin);
} else if (digitalRead(buttonServoPin) == LOW && credit > 0) {
activateServo();
}
}
void activatePump(int pumpPin) {
digitalWrite(pumpPin, HIGH);
delay(2000); // Liga a bomba por 2 segundos
digitalWrite(pumpPin, LOW);
credit--;
updateLCD();
}
void activateServo() {
servoMotor.write(180);
delay(1000); // Mantém o servo na posição 180 graus por 1 segundo
servoMotor.write(0);
delay(1000); // Mantém o servo na posição 0 graus por 1 segundo
credit--;
updateLCD();
}
void updateLCD() {
lcd.setCursor(0, 1);
lcd.print("Credit: ");
lcd.print(credit);
lcd.print(" BRL ");
}