#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h> // Inclui a biblioteca do servo motor
#define moedeiroPin 2
#define botao_start1Pin 11
#define botao_start2Pin 10
#define botao_servoPin 12 // Pino para o botão do servo motor
#define fita_de_leds1Pin 9
#define fita_de_leds2Pin 8
#define led_terceiroPin 7 // Novo pino para o terceiro LED
#define servoPin 6 // Pino do servo motor
#define saida1Pin 5
#define saida2Pin 4
#define menuButton A1 // Novo pino para acessar o menu
#define upButton A2 // Novo pino para incrementar valor no menu
#define downButton A3 // Novo pino para decrementar valor no menu
#define selectButton A0 // Pino para selecionar opção no menu
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myservo; // Cria um objeto servo para controlar o servo motor
int contador_pulsos = 0;
int contador = 15;
int valor_pulso = 25; // Representação em centavos
float valor_moeda_atual = 0.0; // Valor da última moeda inserida
int bomba1Tempo = 10; // Tempo da bomba 1 em segundos
int bomba2Tempo = 20; // Tempo da bomba 2 em segundos
int pulsoMoedeiro = 25; // Valor do pulso do moedeiro em centavos
bool inMenu = false;
int menuIndex = 0;
unsigned long millisTarefa1;
unsigned long millisTarefa2;
unsigned long millisTarefa3;
unsigned long menuLastActivity; // Para rastrear a última atividade no menu
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Coloque moedas");
pinMode(botao_start1Pin, INPUT_PULLUP);
pinMode(botao_start2Pin, INPUT_PULLUP);
pinMode(botao_servoPin, INPUT_PULLUP); // Configura o pino do botão do servo motor como entrada
pinMode(moedeiroPin, INPUT_PULLUP);
pinMode(fita_de_leds1Pin, OUTPUT);
pinMode(fita_de_leds2Pin, OUTPUT);
pinMode(led_terceiroPin, OUTPUT); // Configura o pino do terceiro LED como saída
pinMode(saida1Pin, OUTPUT);
pinMode(saida2Pin, OUTPUT);
pinMode(menuButton, INPUT_PULLUP);
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
myservo.attach(servoPin); // Anexa o servo motor ao pino definido
myservo.write(0); // Inicializa o servo na posição 0 graus
Serial.println("Inicializado!");
}
void loop() {
if (digitalRead(menuButton) == LOW) {
inMenu = !inMenu;
lcd.clear();
menuIndex = 0;
menuLastActivity = millis(); // Atualiza a última atividade
delay(300); // Debounce
}
if (inMenu) {
showMenu();
// Verifica se 30 segundos se passaram desde a última atividade no menu
if (millis() - menuLastActivity > 30000) {
inMenu = false;
lcd.clear();
lcd.print("Coloque moedas");
}
} else {
tarefa1();
tarefa2();
tarefa3();
}
}
void tarefa1() {
if ((millis() - millisTarefa1) > 1000) {
// Lógica para fita de LEDs 1 e 2
if (contador_pulsos >= 4) {
digitalWrite(fita_de_leds1Pin, HIGH);
digitalWrite(fita_de_leds2Pin, HIGH);
} else {
digitalWrite(fita_de_leds1Pin, LOW);
digitalWrite(fita_de_leds2Pin, LOW);
}
millisTarefa1 = millis();
}
}
void tarefa2() {
if ((millis() - millisTarefa2) > 50) {
millisTarefa2 = millis();
if (!digitalRead(moedeiroPin)) {
contador_pulsos++; // Incrementa o contador de pulsos
valor_moeda_atual = contador_pulsos * valor_pulso / 100.0; // Calcula o valor atual com base no número de pulsos e no valor de cada pulso
lcd.clear();
lcd.print("VALOR: R$ ");
lcd.print(valor_moeda_atual, 2); // Exibe o valor atual no LCD com 2 casas decimais
Serial.print("Moedas = ");
Serial.println(valor_moeda_atual);
delay(200);
}
// Acende o LED do servo motor se houver 50 centavos ou mais de crédito
if (contador_pulsos >= 2) {
digitalWrite(led_terceiroPin, HIGH);
}
lcd.setCursor(0, 1);
lcd.print("CREDITO: ");
lcd.print(contador_pulsos);
lcd.print(" ");
}
}
void tarefa3() {
// Verifica se o botão start1 foi pressionado e há crédito suficiente
if (digitalRead(botao_start1Pin) == LOW && contador_pulsos >= 8) {
contador_pulsos -= 8; // Reduz os pulsos do valor
contador = bomba1Tempo;
contagem1(saida1Pin);
}
// Verifica se o botão start2 foi pressionado e há crédito suficiente
if (digitalRead(botao_start2Pin) == LOW && contador_pulsos >= 6) {
contador_pulsos -= 6; // Reduz os pulsos do valor
contador = bomba2Tempo;
contagem2(saida2Pin);
}
// Verifica se o botão do servo motor foi pressionado e há crédito suficiente
if (digitalRead(botao_servoPin) == LOW && contador_pulsos >= 2) {
contador_pulsos -= 2; // Reduz os pulsos do valor (50 centavos)
contagemServo();
}
}
void contagem1(int saida) {
digitalWrite(saida, HIGH);
for (int i = 0; i < contador; i++) {
lcd.setCursor(0, 1);
lcd.print("SERVIR: ");
lcd.print("00:");
if (contador - i < 10) {
lcd.print("0");
}
lcd.print(contador - i);
delay(1000);
}
digitalWrite(saida, LOW);
lcd.clear();
lcd.print("COLOQUE MOEDAS");
delay(1000);
}
void contagem2(int saida) {
digitalWrite(saida, HIGH);
for (int i = 0; i < contador; i++) {
lcd.setCursor(0, 1);
lcd.print("SERVIR: ");
lcd.print("00:");
if (contador - i < 10) {
lcd.print("0");
}
lcd.print(contador - i);
delay(1000);
}
digitalWrite(saida, LOW);
lcd.clear();
lcd.print("COLOQUE MOEDAS");
delay(1000);
}
void contagemServo() {
digitalWrite(led_terceiroPin, LOW); // Apaga o terceiro LED
myservo.write(90); // Move o servo motor para a posição de 90 graus
delay(1000); // Mantém a posição por 1 segundo
myservo.write(0); // Retorna o servo motor para a posição 0 graus
lcd.clear();
lcd.print("COLOQUE MOEDAS");
delay(1000);
}
void showMenu() {
lcd.setCursor(0, 0);
switch (menuIndex) {
case 0:
lcd.print("Bomba 1 Tempo:");
lcd.setCursor(0, 1);
lcd.print(bomba1Tempo);
break;
case 1:
lcd.print("Bomba 2 Tempo:");
lcd.setCursor(0, 1);
lcd.print(bomba2Tempo);
break;
case 2:
lcd.print("Pulso Moedeiro:");
lcd.setCursor(0, 1);
lcd.print(pulsoMoedeiro);
break;
}
if (digitalRead(upButton) == LOW) {
menuLastActivity = millis(); // Atualiza a última atividade
switch (menuIndex) {
case 0:
bomba1Tempo++;
break;
case 1:
bomba2Tempo++;
break;
case 2:
pulsoMoedeiro++;
break;
}
delay(300); // Debounce
}
if (digitalRead(downButton) == LOW) {
menuLastActivity = millis(); // Atualiza a última atividade
switch (menuIndex) {
case 0:
if (bomba1Tempo > 0) bomba1Tempo--; // Assegura que o tempo não seja negativo
break;
case 1:
if (bomba2Tempo > 0) bomba2Tempo--; // Assegura que o tempo não seja negativo
break;
case 2:
if (pulsoMoedeiro > 0) pulsoMoedeiro--; // Assegura que o valor não seja negativo
break;
}
delay(300); // Debounce
}
if (digitalRead(selectButton) == LOW) {
menuLastActivity = millis(); // Atualiza a última atividade
menuIndex++;
if (menuIndex > 2) menuIndex = 0;
delay(300); // Debounce
}
}