#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Leitura do pino de sinal do moedeiro na entrada 12
#define moedeiro 12
// Variáveis para a contagem de milissegundos
unsigned long millisTarefa1 = millis();
unsigned long millisTarefa2 = millis();
// LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4 , 5 , 6, 7, 3, POSITIVE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variáveis globais
float credito = 0;
int contador[4] = {4, 4, 4, 4}; // Contadores para cada bomba
int botao_start[4] = {2, 5, 6, 7}; // Botões de start para cada bomba
int flag[4] = {0, 0, 0, 0}; // Flags para cada bomba
int fita_de_leds = 3;
int saida[4] = {4, 8, 9, 10}; // Saídas para cada bomba
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.backlight(); // Liga a luz de fundo do LCD
lcd.setCursor(0, 0);
lcd.print("Coloque moeda");
delay(2000);
pinMode(moedeiro, INPUT_PULLUP);
pinMode(fita_de_leds, OUTPUT);
for (int i = 0; i < 4; i++) {
pinMode(botao_start[i], INPUT_PULLUP);
pinMode(saida[i], OUTPUT);
}
Serial.println("Inicializado!");
}
void loop() {
// Executa tarefa 1
tarefa1();
// Executa tarefa 2
tarefa2();
}
void tarefa1() {
if ((millis() - millisTarefa1) < 200) {
// Acende o fita_de_leds
if (credito == 0) {
digitalWrite(fita_de_leds, LOW);
}
} else {
// Apaga o fita_de_leds
digitalWrite(fita_de_leds, HIGH);
}
// Verifica se já passou 400 milisegundos
if ((millis() - millisTarefa1) > 400) {
millisTarefa1 = millis();
}
}
void tarefa2() {
// Verifica se já passou 50 milisegundos
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.print("Credito R$: ");
lcd.print(credito);
Serial.print("Moedas = ");
Serial.println(credito);
delay(500);
}
// Verifica cada botão de start
for (int i = 0; i < 4; i++) {
if (digitalRead(botao_start[i]) == LOW && credito > 0.99) {
credito = credito - 1.00;
contador[i] = 4;
flag[i] = 1;
while (flag[i] == 1) {
contagem(i);
}
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 milisegundos
if ((millis() - millisTarefa2) > 100) {
millisTarefa2 = millis();
}
}
void contagem(int bomba) {
// Ativa a saída da bomba
digitalWrite(saida[bomba], HIGH);
// Inicia a contagem decrescente
contador[bomba]--;
lcd.setCursor(0, 1);
lcd.print("tempo: ");
lcd.print("00:");
// Adiciona "0" se o número for menor que 10
if (contador[bomba] < 10) {
lcd.print("0");
}
lcd.print(contador[bomba]);
delay(1000);
// Quando o contador zerar, muda a flag, zera contador e desliga saída
if (contador[bomba] <= 0) {
flag[bomba] = 0;
contador[bomba] = 0;
digitalWrite(saida[bomba], LOW);
delay(1000);
lcd.clear();
}
}