/*
Wokwi | questions
help
joyce — 11/1/24 at 12:31 PM
Hello, could someone please check for me to see if the way
it works is correct?
https://wokwi.com/projects/413035250437614593
*/
#include <Wire.h>
#include <LiquidCrystal.h>
//Leitura do pino de sinal do moedeiro na entrada 12
#define moedeiro 6
//Variáveis para a contagem de milissegundos
unsigned long millisTarefa1 = millis();
unsigned long millisTarefa2 = millis();
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
const int buttonPins[8] = {5}; // Pinos dos botões
const int ledPin = 7; // Pino do LED
const int buzzerPin = 4; // Pino do Buzzer
// Preço de cada item (em centavos)
const int itemPrices[8] = {100, 150, 200, 250, 300, 350, 400, 450}; // Preços em centavos
//Variáveis globais
int credito = 0;
int contador = 20;
int botao_start = 2;
int flag;
int fita_de_leds = 3;
int saida = 4;
void setup() {
Serial.begin (9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Coloque moeda");
delay(2000);
pinMode(botao_start, INPUT_PULLUP);
pinMode(moedeiro, INPUT_PULLUP);
pinMode(fita_de_leds, OUTPUT);
pinMode(saida, OUTPUT);
Serial.println ("Inicializado!");
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
lcd.begin(16, 2);
// Agora você pode interagir com o LCD, por exemplo:
lcd.print("Ola, bem vindo!");
//pinMode(8, OUTPUT);
}
void loop() {
// Executa tarefa 1
tarefa1();
// Executa tarefa 2
tarefa2();
// Verifica cada botão
for (int i = 0; i < 8; i++) {
if (digitalRead(buttonPins[i]) == LOW) { // Botão pressionado
dispenseItem(i);
delay(500); // Debounce delay
}
}
}
void dispenseItem(int itemIndex) {
// Simulação de pagamento
Serial.print("Item escolhido: ");
Serial.println(itemIndex + 1);
Serial.print("Preço: ");
Serial.print(itemPrices[itemIndex]);
Serial.println(" centavos");
// Aqui você pode adicionar a lógica de pagamento.
// Por exemplo, verificar se o pagamento foi bem-sucedido.
// Se o pagamento for bem-sucedido:
Serial.println("Dispensando item...");
digitalWrite(ledPin, HIGH); // Acender LED
tone(buzzerPin, 1000, 200); // Emitir som
delay(200);
noTone(buzzerPin);
digitalWrite(ledPin, LOW); // Apagar LED
Serial.println("Item dispensado!");
}
void tarefa1() {
if ((millis() - millisTarefa1) < 200) {
// Acende o fita_de_leds
if (credito == 0) {
digitalWrite(fita_de_leds, HIGH);
}
} else {
// Apaga o fita_de_leds
digitalWrite(fita_de_leds, LOW);
}
// Verifica se já passou 400 milisegundos
if ((millis() - millisTarefa1) > 400) {
millisTarefa1 = millis();
}
}
void tarefa2() {
// Verifica se já passou 50 milisegundos
if ((millis() - millisTarefa2) >= 50) { // FIXED
//Se detectar pulso do moedeiro, aumenta o crédito e exibe no LCD
if (!digitalRead(moedeiro)) {
credito++;
lcd.clear();
lcd.print("Credito: ");
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) {
credito--;
contador = 5;
flag = 1;
while (flag == 1) {
contagem();
}
delay(100);
}
//Atualiza no LCD o crédito
lcd.setCursor(0, 0);
lcd.print("Credito: ");
lcd.print(credito);
lcd.print(" ");
}
// Verifica se já passou 100 milisegundos
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();
}
}