#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definir endereço do LCD, geralmente 0x27 ou 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definir pinos
const int moedeiroPin = 2; // Pino de entrada do moedeiro
const int motor1Pin = 9; // Pino de controle do motor 1 (Cigarro)
const int motor2Pin = 10; // Pino de controle do motor 2 (Vodka)
const int motor3Pin = 11; // Pino de controle do motor 3 (Cigarro)
const int botao1Pin = 3; // Botão para selecionar item 1
const int botao2Pin = 4; // Botão para selecionar item 2
const int botao3Pin = 5; // Botão para selecionar item 3
const int botao4Pin = 6; // Botão para selecionar item 4 (Dunhill)
const int botao5Pin = 7; // Botão para selecionar item 5 (Cigarro L.A.)
const int rele1Pin = 12; // Pino de controle do relé 1 (Dunhill)
const int rele2Pin = 13; // Pino de controle do relé 2 (Cigarro L.A.)
int credito = 0;
int moedeiroEstadoAnterior = LOW; // Estado anterior do pino do moedeiro
unsigned long ultimoTempoMoedeiro = 0; // Tempo da última leitura do moedeiro
const unsigned long debounceTempo = 200; // Tempo de debounce em milissegundos
void setup() {
pinMode(moedeiroPin, INPUT);
pinMode(motor1Pin, OUTPUT);
pinMode(motor2Pin, OUTPUT);
pinMode(motor3Pin, OUTPUT);
pinMode(botao1Pin, INPUT_PULLUP);
pinMode(botao2Pin, INPUT_PULLUP);
pinMode(botao3Pin, INPUT_PULLUP);
pinMode(botao4Pin, INPUT_PULLUP);
pinMode(botao5Pin, INPUT_PULLUP);
pinMode(rele1Pin, OUTPUT);
pinMode(rele2Pin, OUTPUT);
Serial.begin(9600);
// Inicializar o LCD
lcd.begin(16, 2); // Iniciar o LCD com 16 colunas e 2 linhas
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Credito: R$0");
}
void loop() {
// Verificar inserção de moeda com debounce
int moedeiroEstadoAtual = digitalRead(moedeiroPin);
unsigned long tempoAtual = millis();
if (moedeiroEstadoAtual == HIGH && moedeiroEstadoAnterior == LOW && (tempoAtual - ultimoTempoMoedeiro) > debounceTempo) {
// Detectou borda de subida com debounce
credito += 1; // Incrementar crédito ao inserir uma moeda de 1 real
Serial.println("Moeda inserida. Crédito: " + String(credito) + " reais");
exibirCredito(); // Exibir crédito no display
ultimoTempoMoedeiro = tempoAtual; // Atualizar o tempo da última leitura
}
moedeiroEstadoAnterior = moedeiroEstadoAtual;
// Verificar se o botão 1 foi pressionado
if (digitalRead(botao1Pin) == LOW && credito >= 1) {
Serial.println("Item 1 selecionado");
ativarMotor(motor1Pin, 3800, "PITU"); // Ativa o motor 1 por 5 segundos e exibe "CIGARRO" no display
credito -= 1;
Serial.println("Crédito restante: " + String(credito) + " reais");
exibirCredito(); // Exibir crédito no display
} else if (digitalRead(botao1Pin) == LOW && credito < 1) {
exibirMensagemInicial();
}
// Verificar se o botão 2 foi pressionado
if (digitalRead(botao2Pin) == LOW && credito >= 1) {
Serial.println("Item 2 selecionado");
ativarMotor(motor2Pin, 3800, "VODKA"); // Ativa o motor 2 por 10 segundos e exibe "VODKA" no display
credito -= 1;
Serial.println("Crédito restante: " + String(credito) + " reais");
exibirCredito(); // Exibir crédito no display
} else if (digitalRead(botao2Pin) == LOW && credito < 1) {
exibirMensagemInicial();
}
// Verificar se o botão 3 foi pressionado
if (digitalRead(botao3Pin) == LOW && credito >= 1) {
Serial.println("Item 3 selecionado");
ativarMotor(motor3Pin, 600, "HOTMAN"); // Ativa o motor 3 por 0,5 segundos e exibe "CIGARRO" no display
credito -= 1;
Serial.println("Crédito restante: " + String(credito) + " reais");
exibirCredito(); // Exibir crédito no display
} else if (digitalRead(botao3Pin) == LOW && credito < 1) {
exibirMensagemInicial();
}
// Verificar se o botão 4 foi pressionado
if (digitalRead(botao4Pin) == LOW && credito >= 1) {
Serial.println("Item 4 selecionado");
ativarRele(rele1Pin, 600, "DUNHILL"); // Ativa o relé 1 por 5 segundos e exibe "DUNHILL" no display
credito -= 1;
Serial.println("Crédito restante: " + String(credito) + " reais");
exibirCredito(); // Exibir crédito no display
} else if (digitalRead(botao4Pin) == LOW && credito < 1) {
exibirMensagemInicial();
}
// Verificar se o botão 5 foi pressionado
if (digitalRead(botao5Pin) == LOW && credito >= 1) {
Serial.println("Item 5 selecionado");
ativarRele(rele2Pin, 600, " L.A."); // Ativa o relé 2 por 5 segundos e exibe "CIGARRO L.A." no display
credito -= 1;
Serial.println("Crédito restante: " + String(credito) + " reais");
exibirCredito(); // Exibir crédito no display
} else if (digitalRead(botao5Pin) == LOW && credito < 1) {
exibirMensagemInicial();
}
}
void ativarMotor(int motorPin, unsigned long tempoAtivacao, String itemSelecionado) {
digitalWrite(motorPin, HIGH); // Ativar o motor
lcd.clear(); // Limpar o LCD
lcd.setCursor(0, 0);
lcd.print(itemSelecionado); // Exibir o item selecionado no display
unsigned long tempoInicio = millis();
while (millis() - tempoInicio <= tempoAtivacao) {
lcd.setCursor(0, 1);
lcd.print("Tempo: " + String((tempoAtivacao - (millis() - tempoInicio)) / 1000) + "s ");
delay(1000);
}
lcd.clear();
digitalWrite(motorPin, LOW); // Desativar o motor
}
void ativarRele(int relePin, unsigned long tempoAtivacao, String itemSelecionado) {
digitalWrite(relePin, HIGH); // Ativar o relé
lcd.clear(); // Limpar o LCD
lcd.setCursor(0, 0);
lcd.print(itemSelecionado); // Exibir o item selecionado no display
unsigned long tempoInicio = millis();
while (millis() - tempoInicio <= tempoAtivacao) {
lcd.setCursor(0, 1);
lcd.print("Tempo: " + String((tempoAtivacao - (millis() - tempoInicio)) / 1000) + "s ");
delay(1000);
}
lcd.clear();
digitalWrite(relePin, LOW); // Desativar o relé
}
void exibirCredito() {
lcd.clear(); // Limpar o LCD
lcd.setCursor(0, 0);
lcd.print("Credito: R$" + String(credito)); // Exibir crédito no display
if (credito > 0) {
lcd.setCursor(0, 1);
lcd.print("APERTE O BOTAO");
}
}
void exibirMensagemInicial() {
lcd.clear(); // Limpar o LCD
lcd.setCursor(0, 0);
lcd.print("COLOQUE A MOEDA"); // Exibir mensagem inicial no display
}