#define BLYNK_PRINT Serial
// Datos de Blynk (Asegúrate que estos coincidan con tu proyecto)
#define BLYNK_TEMPLATE_ID "TMPL2moepbhbr"
#define BLYNK_TEMPLATE_NAME "IOT IN OUT ADC SENSOR"
#define BLYNK_AUTH_TOKEN "q6AUKyNgO2NL9JdW9kEjxGhhQne6_Hnc"
#include <LiquidCrystal_PCF8574.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <OneWire.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
LiquidCrystal_PCF8574 lcd(0x27);
//ESP32: SDA: D21 --- SCL: D22
#define ONE_WIRE_BUS 4 //D4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
/*
// --- AJUSTE REAL ---
char ssid[] = "APRENDICES";
char pass[] = "Apr3nd1z2025*++*";
*/
//*/
// --- AJUSTE PARA WOKWI ---
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//*/
// Variables para el control desde Blynk
int blynk_sw0 = 0, blynk_sw1 = 0, blynk_sw2 = 0;
// Para detectar cambios físicos
int last_i0 = 0, last_i1 = 0, last_i2 = 0;
int valA0;
float temp;
// Pines pulsadores
#define PIN_I0 18 //D18
#define PIN_I1 19 //D19
#define PIN_I2 23 //D23
// Lectura del pulsador (Invertida por INPUT_PULLUP: Pulsado = 1)
#define LEER_I0 (!digitalRead(PIN_I0))
#define LEER_I1 (!digitalRead(PIN_I1))
#define LEER_I2 (!digitalRead(PIN_I2))
//Pines led´s
#define Q0 15 //D15
#define Q1 2 //D2
#define Q2 5 //D5
byte alto[]={0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x00};
byte bajo[]={0x00,0x1F,0x11,0x11,0x11,0x11,0x1F,0x00};
// --- EVENTO: CUANDO TOCAS EL INTERRUPTOR EN BLYNK ---
// Esto garantiza que el cambio sea inmediato en el ESP32
BLYNK_WRITE(V5) {
blynk_sw0 = param.asInt();
digitalWrite(Q0, blynk_sw0 || LEER_I0);
}
BLYNK_WRITE(V6) {
blynk_sw1 = param.asInt();
digitalWrite(Q1, blynk_sw1 || LEER_I1);
}
BLYNK_WRITE(V7) {
blynk_sw2 = param.asInt();
digitalWrite(Q2, blynk_sw2 || LEER_I2);
}
// Al conectar, recupera cómo estaban los interruptores en la App
BLYNK_CONNECTED() {
Blynk.syncVirtual(V5, V6, V7);
}
void actualizarPantalla(){
lcd.setCursor(0,0);
lcd.print(Blynk.connected() ? "Blynk: Conectado " : "Blynk: Conectando...");
lcd.setCursor(0,1);
lcd.print("I: ");
lcd.write(LEER_I0 ? 1 : 0);
lcd.write(LEER_I1 ? 1 : 0);
lcd.write(LEER_I2 ? 1 : 0);
lcd.setCursor(0,3);
lcd.print("Q: ");
// Leemos el estado REAL del pin físico para mostrarlo en el LCD
lcd.write(digitalRead(Q0) ? 1 : 0);
lcd.write(digitalRead(Q1) ? 1 : 0);
lcd.write(digitalRead(Q2) ? 1 : 0);
lcd.setCursor(0,2);
lcd.print(" 012");
lcd.setCursor(12,1);
lcd.print("A0: "); lcd.print(valA0);
lcd.setCursor(12,2);
lcd.print("T"); lcd.print((char)223); lcd.print(": ");
if (temp <= -127) lcd.print("Err"); else lcd.print(temp,1);
}
void setup() {
pinMode(PIN_I0, INPUT_PULLUP);
pinMode(PIN_I1, INPUT_PULLUP);
pinMode(PIN_I2, INPUT_PULLUP);
pinMode(Q0, OUTPUT);
pinMode(Q1, OUTPUT);
pinMode(Q2, OUTPUT);
sensors.begin();
Serial.begin(115200);
lcd.begin(20,4);
lcd.createChar(0,bajo);
lcd.createChar(1,alto);
delay(200);
lcd.setBacklight(255);
// --- MENSAJES DE INICIO ---
lcd.setCursor(0,0);
lcd.print("SISTEMA INICIANDO...");
lcd.setCursor(0,1);
lcd.print("WiFi: Wokwi-GUEST");
delay(1500);
lcd.setCursor(0,2);
lcd.print("Buscando Blynk...");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
lcd.clear();
}
void loop(){
Blynk.run();
// 1. Leer Sensores
valA0 = analogRead(36);
sensors.requestTemperatures();
temp = sensors.getTempCByIndex(0);
// 2. LÓGICA DE CONTROL (SALIDAS)
// La salida es el resultado de (Pulsador O Blynk)
digitalWrite(Q0, LEER_I0 || blynk_sw0);
digitalWrite(Q1, LEER_I1 || blynk_sw1);
digitalWrite(Q2, LEER_I2 || blynk_sw2);
// 3. SINCRONIZACIÓN CON BLYNK
if(Blynk.connected()){
Blynk.virtualWrite(V0, valA0);
Blynk.virtualWrite(V1, temp);
Blynk.virtualWrite(V2, LEER_I0);
Blynk.virtualWrite(V3, LEER_I1);
Blynk.virtualWrite(V4, LEER_I2);
// Si presionas el pulsador físico, actualizamos el interruptor de la App
if (LEER_I0 != last_i0) {
Blynk.virtualWrite(V5, LEER_I0 || blynk_sw0);
last_i0 = LEER_I0;
}
if (LEER_I1 != last_i1) {
Blynk.virtualWrite(V6, LEER_I1 || blynk_sw1);
last_i1 = LEER_I1;
}
if (LEER_I2 != last_i2) {
Blynk.virtualWrite(V7, LEER_I2 || blynk_sw2);
last_i2 = LEER_I2;
}
}
actualizarPantalla();
delay(100);
}