#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[40]; // Array para 40 servos
int servoPins[40] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, A0, A1, A2, A3, A4, A5, A6, A7};
// Pinos do moedeiro e botão de confirmação
const int coinPin = 18; // Pino para o botão/moedeiro
const int confirmPin = 19; // Pino para o botão de confirmação
// Mapeamento de pinos de servo para valores em reais
float valoresProdutos[40] = {
1.00, 2.00, 3.00, 4.00, 5.00, 6.00, 7.00, 8.00, 9.00, 10.00,
11.00, 12.00, 13.00, 14.00, 15.00, 16.00, 17.00, 18.00, 19.00, 20.00,
21.00, 22.00, 23.00, 24.00, 25.00, 26.00, 27.00, 28.00, 29.00, 30.00,
31.00, 32.00, 33.00, 34.00, 35.00, 36.00, 37.00, 38.00, 39.00, 40.00
};
// Nomes dos produtos
String nomesProdutos[40] = {
"chocolate", " oleo", "acucar", "leite", "deterjente",
"feijao", "farinha", "azeite", "sal", "sabao em po",
"vinagre", "bolacha ", "macarrao", "tang", "azeitona",
"pao de forma", "pimenta", "agua de coco", "suco de uva ", "cafe",
"azeitona", "maioneze", "leite em po", "carvao", "carne seca",
"suco laranja", "esponja de aco", "miogo", "creme dental", "amaciante",
"barra chocolate", "sal grosso", "camizinha", "cotonete sabonete", "shampo",
"cigarro 1", "cigarro 2", "cigarro 3", "isqueiro", "cigarro solto"
};
// 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("COLOQUE CREDITO:");
// 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
}
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
int produtoTemp = entradaProduto.toInt() - 1; // Converte a entrada para número do produto
if (produtoTemp >= 0 && produtoTemp < 40) {
lcd.clear();
lcd.print("Produto N="); // Exibe "Produto N=" na linha superior
lcd.print(entradaProduto); // Exibe o número do produto
lcd.setCursor(0, 1);
lcd.print(nomesProdutos[produtoTemp]); // Exibe o nome do produto
lcd.print(" R$");
lcd.print(valoresProdutos[produtoTemp], 2); // Exibe o valor do produto
} else {
lcd.clear();
lcd.print("Prod Inválido"); // Exibe mensagem de produto inválido
}
} 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("CREDITO: ");
lcd.print(valorInserido);
}
}
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("CREDITO: ");
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 < 40) {
lcd.clear();
lcd.print("LIBERANDO COMPRA"); // Exibe mensagem de liberação do produto
lcd.setCursor(0, 1);
lcd.print(nomesProdutos[produtoSelecionado]); // Exibe o nome do produto
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("CREDITO: ");
lcd.print(valorInserido);
produtoSelecionado = -1; // Reseta a seleção de produto
} else {
lcd.clear(); // Limpa o LCD antes de mostrar a mensagem
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;
}