#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Pino de sinal do moedeiro na entrada 12
#define moedeiro 12
// Variáveis para a contagem de milissegundos
unsigned long millisTarefa1 = 0;
unsigned long millisTarefa2 = 0;
// Configuração do LCD (endereço I2C pode variar)
LiquidCrystal_I2C lcd(0x27, 16, 2); // Endereço I2C do LCD 16x2
// Variáveis globais
float credito = 0;
int contador = 4;
int botao_start = 2;
int flag = 0;
int fita_de_leds = 3;
int saida = 4;
void setup() {
Serial.begin(9600);
// Inicializa o LCD
lcd.begin(16, 2);
lcd.backlight(); // Liga o backlight do LCD
// Mensagem inicial no LCD
lcd.setCursor(0, 0);
lcd.print("Coloque moeda");
delay(2000);
// Configuração dos pinos
pinMode(botao_start, INPUT_PULLUP);
pinMode(moedeiro, INPUT_PULLUP);
pinMode(fita_de_leds, OUTPUT);
pinMode(saida, OUTPUT);
Serial.println("Inicializado!");
}
void loop() {
// Executa tarefa 1
tarefa1();
// Executa tarefa 2
tarefa2();
}
void tarefa1() {
if ((millis() - millisTarefa1) < 200) {
// Acende a fita de LEDs se o crédito for 0
if (credito == 0) {
digitalWrite(fita_de_leds, LOW);
}
} else {
// Apaga a fita de LEDs
digitalWrite(fita_de_leds, HIGH);
}
// Verifica se já passou 400 milissegundos
if ((millis() - millisTarefa1) > 400) {
millisTarefa1 = millis();
}
}
void tarefa2() {
// Verifica se já passou 50 milissegundos
if ((millis() - millisTarefa2) < 50) {
// Se detectar pulso do moedeiro, aumenta o crédito e exibe no LCD
if (!digitalRead(moedeiro)) {
credito = credito + 0.25;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Credito R$: ");
lcd.print(credito);
Serial.print("Moedas = ");
Serial.println(credito);
delay(500);
}
// Se apertar botão start, diminui um crédito e inicia contagem
botao_start = digitalRead(2);
if (botao_start == LOW && credito > 0.99) {
credito = credito - 1.00;
contador = 4;
flag = 1;
while (flag == 1) {
contagem();
}
delay(100);
}
// Atualiza no LCD o crédito
lcd.setCursor(0, 0);
lcd.print("Credito R$: ");
lcd.print(credito);
lcd.print(" ");
}
// Verifica se já passou 100 milissegundos
if ((millis() - millisTarefa2) > 100) {
millisTarefa2 = millis();
}
}
void contagem() {
// Ativa a saída
digitalWrite(saida, HIGH);
// Inicia a contagem decrescente
contador--;
lcd.setCursor(0, 1);
lcd.print("tempo: ");
lcd.print("00:");
// Adiciona "0" se o número for menor que 10
if (contador < 10) {
lcd.print("0");
}
lcd.print(contador);
delay(1000);
// Quando o contador zerar, muda a flag, zera contador e desliga saída
if (contador <= 0) {
flag = 0;
contador = 0;
digitalWrite(saida, LOW);
delay(1000);
lcd.clear();
}
}