#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Configurações do LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Endereço I2C do LCD pode variar
// Configurações do teclado 4x4
const byte ROWS = 4; // Quatro linhas
const byte COLS = 4; // Quatro colunas
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // Pinos conectados às linhas do teclado
byte colPins[COLS] = {5, 4, 3, 2}; // Pinos conectados às colunas do teclado
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Configurações dos servos
Servo servos[4]; // Array para 4 servos
int servoPins[4] = {10, 11, 12, 13}; // Pinos conectados aos servos
// Pinos do moedeiro e botão de confirmação
const int coinPin = A1; // Pino para o botão/moedeiro
const int confirmPin = A0; // Pino para o botão de confirmação
// Configuração do LED
const int ledPin = A2; // Pino para o LED
bool ledState = false;
unsigned long previousMillis = 0;
const long interval = 500; // Intervalo de piscar em milissegundos
// Mapeamento de pinos de servo para valores em reais
float valoresProdutos[4] = {1.00, 2.00, 3.00, 4.00};
// Variáveis globais
float valorInserido = 0.0;
int produtoSelecionado = -1; // Inicializa sem nenhum produto selecionado
String entradaProduto = ""; // Armazena a entrada do número do produto
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50; // 50 ms para debounce
bool lastCoinButtonState = HIGH;
bool coinButtonPressed = false;
bool lastConfirmButtonState = HIGH;
bool confirmButtonPressed = false;
void setup() {
Serial.begin(9600); // Inicializa comunicação serial para depuração
lcd.begin(16, 2); // Inicializa o LCD com 16 colunas e 2 linhas
lcd.backlight();
lcd.print("Insira moedas:");
// Configuração dos pinos do moedeiro e botão de confirmação
pinMode(coinPin, INPUT_PULLUP); // Usa pull-up interno para evitar flutuações
pinMode(confirmPin, INPUT_PULLUP); // Usa pull-up interno para evitar flutuações
// Configuração do pino do LED
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW); // Inicialmente, o LED está desligado
}
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
if (isdigit(key)) { // Verifica se a tecla pressionada é um dígito
entradaProduto += key; // Adiciona o dígito à entrada do produto
lcd.clear();
lcd.print("Produto: ");
lcd.print(entradaProduto);
lcd.setCursor(0, 1);
lcd.print("Valor: ");
lcd.print(valorInserido);
} else if (key == '#') { // Apaga o número digitado em caso de erro
entradaProduto = "";
lcd.clear();
lcd.print("Produto: ");
lcd.print(entradaProduto);
lcd.setCursor(0, 1);
lcd.print("Valor: ");
lcd.print(valorInserido);
}
// Ignorar letras e asterisco
else if (key == 'A' || key == 'B' || key == 'C' || key == 'D' || key == '*') {
// Não faça nada
}
}
bool coinButtonState = digitalRead(coinPin);
if (coinButtonState != lastCoinButtonState) {
lastDebounceTime = millis(); // Reseta o tempo de debounce
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (coinButtonState == LOW && !coinButtonPressed) { // Botão foi pressionado
valorInserido += 1.00; // Adiciona R$ 1,00 ao inserir moeda
coinButtonPressed = true;
lcd.setCursor(0, 1);
lcd.print("Valor: ");
lcd.print(valorInserido);
Serial.print("Valor inserido: ");
Serial.println(valorInserido); // Imprime valor inserido para depuração
} else if (coinButtonState == HIGH && coinButtonPressed) {
coinButtonPressed = false; // Botão foi liberado
}
}
lastCoinButtonState = coinButtonState;
bool confirmButtonState = digitalRead(confirmPin);
if (confirmButtonState != lastConfirmButtonState) {
lastDebounceTime = millis(); // Reseta o tempo de debounce
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (confirmButtonState == LOW && !confirmButtonPressed) { // Botão de confirmação foi pressionado
produtoSelecionado = entradaProduto.toInt() - 1; // Subtrai 1 para ajustar ao índice do array
Serial.print("Produto selecionado: ");
Serial.println(produtoSelecionado); // Imprime produto selecionado para depuração
entradaProduto = ""; // Limpa a entrada do produto
if (produtoSelecionado >= 0 && produtoSelecionado < 4) {
Serial.print("Valor do produto: ");
Serial.println(valoresProdutos[produtoSelecionado]); // Imprime valor do produto para depuração
if (valorInserido >= valoresProdutos[produtoSelecionado]) {
Serial.println("Saldo suficiente, acionando servo."); // Depuração
servos[produtoSelecionado].attach(servoPins[produtoSelecionado]); // Ativa o servo
servos[produtoSelecionado].write(180);
delay(1000);
servos[produtoSelecionado].write(0);
delay(500); // Espera meio segundo antes de desligar o servo
servos[produtoSelecionado].detach(); // Desativa o servo
valorInserido -= valoresProdutos[produtoSelecionado];
lcd.clear();
lcd.print("Saldo: ");
lcd.print(valorInserido);
produtoSelecionado = -1; // Reseta a seleção de produto
} else {
lcd.clear(); // Limpa o LCD antes de mostrar a mensagem
lcd.setCursor(0, 1);
lcd.print("Saldo insuficiente");
Serial.println("Saldo insuficiente."); // Depuração
}
} else {
lcd.clear(); // Limpa o LCD antes de mostrar a mensagem
lcd.print("Prod Inválido");
Serial.println("Produto inválido."); // Depuração
produtoSelecionado = -1; // Reseta a seleção de produto
}
confirmButtonPressed = true;
} else if (confirmButtonState == HIGH && confirmButtonPressed) {
confirmButtonPressed = false; // Botão foi liberado
}
}
lastConfirmButtonState = confirmButtonState;
// Controle do LED piscando
unsigned long currentMillis = millis();
if (valorInserido > 0) {
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
ledState = !ledState; // Alterna o estado do LED
digitalWrite(ledPin, ledState);
}
} else {
digitalWrite(ledPin, LOW); // Desliga o LED se não houver crédito
}
}