#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 0
#define UTC_OFFSET_DST 0
//definicion de pines de salida
const int REL1 = 15;
const int REL2 = 2;
const int REL3 = 4;
const int REL4 = 5;
const int REL5 = 18;
//definicion de pines de entrada
const int pinCoin = 13; // Pin GPIO donde está conectado el botón
const int aceptar = 12;
//const int pinCoin = 14;
volatile bool has_interrupted = false;
volatile bool aux = false;
int cont = 0;
//INTERRUCION DE NUEVA MONEDA
void IRAM_ATTR miFuncionInterrupcion() {
has_interrupted = true;
}
void setup() {
Serial.begin(115200);
//INICIALIZACION PINES DE SALIDA
pinMode(REL1, OUTPUT);
pinMode(REL2, OUTPUT);
pinMode(REL3, OUTPUT);
pinMode(REL4, OUTPUT);
pinMode(REL5, OUTPUT);
//INICIALIZACION DE INTERUUPCION
pinMode(pinCoin, INPUT_PULLUP); // Configurar el pin como entrada con resistencia pull-up interna
pinMode(aceptar, INPUT_PULLUP); // Configurar el pin como entrada con resistencia pull-up interna
attachInterrupt(digitalPinToInterrupt(pinCoin), miFuncionInterrupcion, RISING); // Configurar la interrupción
//iNICIALIZACION LCD
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("WiFi ");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
spinner();
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Buendia estimado cliente");
LCD.setCursor(0, 1);
LCD.println("sea bienvenido");
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
aux=true;
}
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
LCD.setCursor(15, 1);
LCD.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
LCD.setCursor(0, 1);
LCD.println("Connection Err");
return;
}
LCD.setCursor(0, 0);
LCD.println("Maquina de ");
// LCD.println(&timeinfo, "%H:%M:%S");
LCD.setCursor(0, 2);
LCD.println("dispensación");
}
void loop() {
if(aux){
home();
}
delay(250);
if(has_interrupted){
cont++;
delay(200);
aux=false;
contador_deingreso();
has_interrupted = false;
}
if (digitalRead(aceptar)==LOW && cont>=1){
producto2();
aux=true;
cont=0;
}
}
void contador_deingreso(){
Serial.println("¡Botón presionado!");
//cont++;
LCD.setCursor(0, 0);
LCD.println("Monedas ingresadas: ");
LCD.setCursor(0, 1);
LCD.print(String("Contador ") + String(cont)+String(" $"));
// delay(5000);
}
void producto1(){
digitalWrite(REL1, true);
delay(1000);
digitalWrite(REL1, false);
}
void producto2(){
digitalWrite(REL2, true);
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Llenando P1...");
delay(10000);
digitalWrite(REL2, false);
LCD.setCursor(0, 0);
LCD.println(" LISTO ");
LCD.setCursor(0, 1);
LCD.println("VUELVA PRONTO");
delay(3000);
}
void producto3(){
digitalWrite(REL3, true);
delay(1000);
digitalWrite(REL3, false);
}
void producto4(){
digitalWrite(REL4, true);
delay(1000);
digitalWrite(REL4, false);
}
void producto5(){
digitalWrite(REL5, true);
delay(1000);
digitalWrite(REL5, false);
}
void home(){
LCD.setCursor(0, 0);
LCD.println(" DISPENSADOR DE ");
LCD.setCursor(0, 1);
LCD.println(" AGUA ");
delay(3000);
LCD.setCursor(0, 0);
LCD.println("AGUA PURIFICADA");
LCD.setCursor(0, 1);
LCD.println(" CELICA ");
delay(3000);
LCD.setCursor(0, 0);
LCD.println("DISENADA X XAVKER");
LCD.setCursor(0, 1);
LCD.println(" 0979724195 ");
delay(3000);
}