#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <PubSubClient.h>
#define LARGO 128
#define ANCHO 64
#define TRIG_PIN 25
#define ECHO_PIN 26
#define LED 12
#define OLED_ADDRESS 0x3C
// --- RED VIRTUAL WOKWI ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --- BROKER MQTT PÚBLICO ---
const char* mqtt_server = "broker.hivemq.com";
const char* mqtt_topic = "JoelTqz/sensor/distancia"; // Tópico con tu firma
WiFiClient espClient;
PubSubClient client(espClient);
Adafruit_SSD1306 display(LARGO, ANCHO, &Wire, -1);
void setup_wifi() {
delay(10);
Serial.begin(115200); // Velocidad estándar para ESP32
Serial.println("\n--- INICIANDO EJERCICIO 3 (JoelTqz) ---");
WiFi.begin(ssid, password);
Serial.print("Conectando WiFi simulado...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n¡Conectado exitosamente!");
}
long distanciacm(){
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
long distance = duration * 0.034 / 2;
return distance;
}
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("Intentando conexión MQTT de JoelTqz...");
// Identificador único aleatorio basado en tu usuario
String clientId = "ESP32-JoelTqz-E3-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println(" ¡Conectado al Broker!");
} else {
Serial.print("Falló con estado = ");
Serial.print(client.state());
Serial.println(" Reintentando en 2 segundos...");
delay(2000);
}
}
}
void setup() {
pinMode(LED, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
setup_wifi();
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
Serial.println(F("Error crítico: No se encontró pantalla OLED"));
for (;;);
}
display.clearDisplay();
display.setTextColor(WHITE);
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
long distancia = distanciacm();
// Control local del LED: si un objeto se acerca a menos de 50 cm, enciende el LED
if (distancia < 50 && distancia > 0) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
// Monitoreo Serial
Serial.print("Midiendo -> Distancia: ");
Serial.print(distancia);
Serial.println(" cm");
// Visualización Profesional en la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("SISTEMA TELEMETRIA");
display.println("---------------------");
display.setCursor(0, 25);
display.setTextSize(1);
display.println("DISTANCIA ACTUAL:");
display.setTextSize(2);
display.setCursor(20, 45);
display.print(distancia);
display.print(" cm");
display.display();
// Publicación hacia Node-RED
String mensaje = String(distancia);
client.publish(mqtt_topic, mensaje.c_str());
delay(2000); // Toma lecturas estables cada 2 segundos
}