// Definição de Biblioteca
#include <LiquidCrystal.h>
#include <Servo.h>
// Definição dos pinos do display LCD
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Definição do servo motor para liberar os copos
Servo liberacaoCopo;
// Definição dos pinos dos botões, válvulas, buzina e sensores
#define botaoEsquerdo 6
#define botaoDireito 8
#define botaoEnter 7
#define valvulaY1 13
#define valvulaY2 A5
#define buzina A3
#define sensorCafe A0
#define sensorLeite A1
// Variáveis para seleção de produto e níveis dos tanques
int selecionaProduto = 0;
float nivelTanqueCafe = 0;
float nivelTanqueLeite = 0;
int tempo = 0;
void setup() {
// Configuração dos pinos dos botões como entrada com pull-up
pinMode(botaoEsquerdo, INPUT_PULLUP);
pinMode(botaoDireito, INPUT_PULLUP);
pinMode(botaoEnter, INPUT_PULLUP);
// Configuração dos pinos das válvulas e buzina como saída
pinMode(valvulaY1, OUTPUT);
pinMode(valvulaY2, OUTPUT);
pinMode(buzina, OUTPUT);
// Inicialização do servo motor
liberacaoCopo.attach(9);
liberacaoCopo.write(0);
// Inicialização do display LCD
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("INICIANDO");
delay(1000);
lcd.setCursor(3, 1);
lcd.print("COFFEE V1");
delay(1000);
lcd.clear();
}
void loop() {
// Exibição da tela de seleção de produto
exibirSelecaoProduto();
// Verifica se o botão esquerdo foi pressionado
if (digitalRead(botaoEsquerdo) == 0) {
selecionarProdutoAnterior();
}
// Verifica se o botão direito foi pressionado
if (digitalRead(botaoDireito) == 0) {
selecionarProximoProduto();
}
// Leitura dos níveis dos tanques
nivelTanqueCafe = lerNivelTanque(sensorCafe);
nivelTanqueLeite = lerNivelTanque(sensorLeite);
// Verifica se o botão enter foi pressionado
if (digitalRead(botaoEnter) == 0) {
processarEntrada();
}
}
//Void aplicado para seleção do produto
void exibirSelecaoProduto() {
lcd.setCursor(1, 0);
lcd.print("SELECIONE:");
lcd.setCursor(0, 1);
if (selecionaProduto == 0) {
lcd.print("<CAFE PEQUENO >");
} else if (selecionaProduto == 1) {
lcd.print("<CAFE MEDIO >");
} else if (selecionaProduto == 2) {
lcd.print("<CAFE GRANDE >");
} else if (selecionaProduto == 3) {
lcd.print("<PINGADO >");
} else if (selecionaProduto == 4) {
lcd.print("<LEITE >");
}
}
//Void com contador para que as opções avancem para esquerda e direita
void selecionarProdutoAnterior() {
if (selecionaProduto > 0) {
selecionaProduto--;
}
delay(300);
}
void selecionarProximoProduto() {
if (selecionaProduto < 4) {
selecionaProduto++;
}
delay(300);
}
float lerNivelTanque(int sensor) {
return analogRead(sensor) * 12.0 / 1023; // int sensor variando entre A0 e A1
}
//Void para processar o botao "enter". Segurando acima de 4s ele retorna a tela de níveis.
void processarEntrada() {
tempo = 0;
while (digitalRead(botaoEnter) == LOW) {
tempo += 100;
delay(100);
if (tempo >= 4000) {
exibirNiveis();
return;
}
}
processarProdutoSelecionado();
}
//Void da tela dos níveis.
void exibirNiveis() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CAFE: ");
lcd.print(nivelTanqueCafe, 1);
lcd.print("L");
lcd.setCursor(0, 1);
lcd.print("LEITE: ");
lcd.print(nivelTanqueLeite, 1);
lcd.print("L");
delay(4000);
lcd.clear();
}
//Void de processar produto selecionado. Void processarProduto correlacionado o tempo de processamento e o produto a ser processado.
void processarProdutoSelecionado() {
if (selecionaProduto == 0) {
processarProduto(3000, 0);
} else if (selecionaProduto == 1) {
processarProduto(6000, 1);
} else if (selecionaProduto == 2) {
processarProduto(9000, 2);
} else if (selecionaProduto == 3) {
processarProduto(6000, 3);
} else if (selecionaProduto == 4) {
processarProduto(6000, 4);
}
}
//Void para apresentar tela de erro (leite e café). Caso contrário, acontece o processamento do pedido.
void processarProduto(int tempoProcessamento, int produto) {
if (nivelTanqueCafe < 0.3 && (produto < 4 || produto == 3)) {
exibirErro(101);
return;
}
if (nivelTanqueLeite < 0.3 && (produto >= 3)) {
exibirErro(102);
return;
}
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("AGUARDE");
lcd.setCursor(6, 1);
lcd.print(">>>");
liberacaoCopo.write(0);
delay(1000);
if (produto != 4) digitalWrite(valvulaY1, HIGH);
if (produto >= 3) digitalWrite(valvulaY2, HIGH);
delay(tempoProcessamento);
digitalWrite(valvulaY1, LOW);
digitalWrite(valvulaY2, LOW);
emitirSom();
liberarCopo();
}
//Void de emitir o som do pedido.
void emitirSom() {
for (int i = 0; i < 7; i++) {
tone(buzina, 200);
delay(200);
noTone(buzina);
delay(200);
}
}
//Void de liberar o copo.
void liberarCopo() {
liberacaoCopo.write(90);
lcd.clear();
}
//Void de erro a ser exibido.
void exibirErro(int erro) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ERRO ");
lcd.print(erro);
lcd.setCursor(0, 1);
if (erro == 101) {
lcd.print("NIVEL:");
lcd.print(nivelTanqueCafe, 1);
lcd.print("L");
} else {
lcd.print("NIVEL:");
lcd.print(nivelTanqueLeite, 1);
lcd.print("L");
}
delay(3000);
lcd.clear();
}