#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "TextScrollerOne.h"
#include "ServoControl.h"
#include "BuzzerControl.h"
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
#define BTN_Credito 17
#define BTN_ESCOLHE1 19
#define BTN_ESCOLHE2 18
#define BOMBA_DAGUA 12
#define RESISTENCIA 14
#define SERVO_DISPENSER_CAFE 16
#define SENSOR_TEMPERATURA 27
#define SENSOR_FLUXO 25
BuzzerControl buzzer(21);
// Variáveis para o sensor de fluxo
volatile int contadorPulsos = 0;
void IRAM_ATTR countPulses(){
contadorPulsos++;
}
// Cria um objeto servo
ServoControl cafeservo(SERVO_DISPENSER_CAFE);
TextScroller scroller(&lcd, 16, " Beba um cafe delicioso ");
boolean pagamento = false;
int bebida = 0;
void lcd_apagarLinha(uint8_t linha) {
lcd.setCursor(0, linha);
lcd.print(" ");
}
void toquetoque(){
buzzer.beep(100,2093);
delay(50);
buzzer.beep(100,1865);
delay(100);
buzzer.beep(100,1661);
delay(200);
buzzer.beep(100,1865);
delay(100);
buzzer.beep(200,2093);
delay(100);
}
void comprar() {
bool selecionado = false;
lcd.clear();
lcd.setCursor(0,6);
lcd.print(" Escolha ");
lcd.setCursor(0,1);
lcd.print("1-mok. 2-cappuc.");
do {
if (digitalRead(BTN_ESCOLHE1) == HIGH) { // Se o botão 1 for pressionado
bebida = 1;
selecionado = true;
} else if (digitalRead(BTN_ESCOLHE2) == HIGH) { // Se o botão 2 for pressionado
bebida = 2;
selecionado = true;
}
if (selecionado) {
switch (bebida) {
case 1:
Serial.println("Selecionado: Mocaccino");
// Adicione aqui o código para liberar bebida
lcd.setCursor(2,0);
lcd.print("Mocaccino");
lcd.setCursor(3,1);
lcd.print(" Selecionado");
digitalWrite(RESISTENCIA, HIGH);
delay(3000);
digitalWrite(RESISTENCIA, LOW);
toquetoque();
pagamento = false;
lcd.clear();
break;
case 2:
Serial.println("Selecionado: cappuccino");
// Adicione aqui o código para liberar cappuccino
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Cappuccino");
lcd.setCursor(3,1);
lcd.print(" Selecionado");
ligarBomba();
controleMedidaAgua();
aquecer();
controleTemperatura();
liberarCafe();
delay(1000);
lcd.clear();
lcd.setCursor(3,0);
lcd.print("PREPARANDO");
delay(2000);
pagamento = false;
lcd.clear();
break;
default:
Serial.println("Nenhuma bebida selecionada ou opção inválida");
// Código para quando nenhuma bebida válida for selecionada
break;
}
}
// Aguarda um pouco antes de continuar o loop (para evitar múltiplas leituras do mesmo botão)
delay(200);
} while (!selecionado);
}
//pagamento = false;
//lcd_apagarLinha(1);
void setup() {
Wire.begin(23, 22);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.backlight();
pinMode(BTN_Credito, INPUT);
pinMode(BTN_ESCOLHE1, INPUT);
pinMode(BTN_ESCOLHE2, INPUT);
pinMode(BOMBA_DAGUA, OUTPUT);
pinMode(RESISTENCIA, OUTPUT);
pinMode(SENSOR_TEMPERATURA, INPUT);
pinMode(SENSOR_FLUXO, INPUT);
digitalWrite(BTN_Credito, LOW);
digitalWrite(BTN_ESCOLHE1,LOW);
digitalWrite(BTN_ESCOLHE2, LOW);
digitalWrite(BOMBA_DAGUA, LOW);
digitalWrite(RESISTENCIA, LOW);
buzzer.begin();
toquetoque();
cafeservo.attach(SERVO_DISPENSER_CAFE);
delay(500);
Serial.begin(9600);
}
void loop() {
if (digitalRead(BTN_Credito) == HIGH) {
pagamento= true;
if(pagamento == true){
lcd.clear();
Serial.println("credito ok");
Serial.println("opções de escolha");
lcd.setCursor(4,1);
lcd.print("credito Ok");
delay(1000);
comprar();
}
}
else{
scroller.scroll();
lcd.setCursor(4, 1);
lcd.print("R$ 5.00");
Serial.println("estou no menu principal");
delay(250);
}
}
void ligarBomba(){
digitalWrite(BOMBA_DAGUA, HIGH);
Serial.println("bomba d`agua ligada");
}
void aquecer(){
digitalWrite(RESISTENCIA, HIGH);
Serial.println("Aquecendo àgua");
lcd_apagarLinha(1);
lcd.setCursor(3,1);
lcd.print("PREPARANDO");
// digitalWrite(RESISTENCIA, LOW);
//Serial.println("temperatura de preparo ok");
}
void liberarCafe(){
cafeservo.write(180);
delay(500);
cafeservo.write(90);
}
void controleTemperatura(){
float temperatura;
while(temperatura <95.0){
int sensorTemp = analogRead(SENSOR_TEMPERATURA);
float voltage = sensorTemp * (3.3 / 4095.0);
temperatura = voltage * 300; // valor original é 100 eu mudei para teste
delay(200);
Serial.println("temperatura: ");
Serial.println(temperatura);
Serial.println("°C");
}
digitalWrite(RESISTENCIA, LOW);
Serial.println("temperatura de preparo Ok ");
}
void controleMedidaAgua(){
unsigned long previousMillis = 0;
const unsigned long intervalo = 1000; // Intervalo de 1 segundo
const float pulsosPorLitro = 98.0; // Número de pulsos por litro mudar conforme sensor
float totalvolumeLitros = 0.0;
float totalMilliLitros = 0.0;
attachInterrupt(digitalPinToInterrupt(SENSOR_FLUXO ), countPulses, FALLING);
while(totalMilliLitros < 150.0){
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= intervalo) {
previousMillis = currentMillis;
// Calcular o volume em litros baseado no número
//de pulsos recebidos desde a última atualização
float volumeLitros = contadorPulsos / pulsosPorLitro;
totalvolumeLitros += volumeLitros; // Atualizar o volume total
totalMilliLitros = totalvolumeLitros * 1000.0;// Calcular o volume em mililitros
// Exibir o volume total
Serial.print("Volume total passado: ");
Serial.print(totalMilliLitros);
Serial.println(" ml");
contadorPulsos = 0; // Resetar a contagem de pulsos para a próxima atualização
}
}
digitalWrite(BOMBA_DAGUA, LOW);
Serial.println("bomba d`agua desligada");
detachInterrupt(digitalPinToInterrupt(SENSOR_FLUXO)); // Detach the interrupt after use
}