/*
  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();
  }

}


$abcdeabcde151015202530354045505560fghijfghij
NOCOMNCVCCGNDINLED1PWRRelay Module