#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiClient wifiClient;
const char* mqttBroker = "broker.hivemq.com";
const char* mqttClientName = "ClienteMarcel2";
const char* mqttUser = "";
const char* mqttPass = "";
const char* name_topic = "marcel/topico1";
const char* send_topic = "marcel/topico2";
PubSubClient mqttClient(wifiClient);
Servo myservo;
int servoPin = 33;
int LED = 13;
int BUT = 0;
bool buttonState = HIGH;
bool lastButtonState = HIGH;
bool lastDebounceState = HIGH;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
bool ledState = false;
void setup() {
Serial.begin(115200);
pinMode(LED, OUTPUT);
pinMode(BUT, INPUT_PULLUP);
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
myservo.setPeriodHertz(50);
myservo.attach(servoPin, 500, 2400);
myservo.write(0);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConectado a " + String(ssid));
Serial.println("Dirección IP: " + WiFi.localIP().toString());
mqttClient.setServer(mqttBroker, 1883);
mqttClient.setCallback(callback);
}
void loop() {
if (!mqttClient.connected()) {
mqttConnect();
}
mqttClient.loop();
int reading = digitalRead(BUT);
if (reading != lastDebounceState) {
lastDebounceTime = millis();
lastDebounceState = reading;
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
publishMessage(send_topic, "button_pressed", true);
Serial.println("Botón presionado");
} else {
publishMessage(send_topic, "button_released", true);
Serial.println("Botón liberado");
}
}
}
lastButtonState = reading;
}
void mqttConnect() {
while (!mqttClient.connected()) {
Serial.print("Intentando conexión MQTT...");
if (mqttClient.connect(mqttClientName, mqttUser, mqttPass)) {
Serial.println("conectado");
mqttClient.publish("hello", mqttClientName);
mqttClient.subscribe(name_topic);
} else {
Serial.print("falló, rc=");
Serial.print(mqttClient.state());
Serial.println(" intentando de nuevo en 5 segundos");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String incomingMessage = "";
for (int i = 0; i < length; i++) {
incomingMessage += (char)payload[i];
}
Serial.println("Mensaje recibido [" + String(topic) + "] " + incomingMessage);
if (incomingMessage == "on") {
ledState = true;
digitalWrite(LED, HIGH);
myservo.write(90);
Serial.println("Sensor de percibe poca luz exterior - LED ON en Placa 2, Servo a 90 grados");
} else if (incomingMessage == "off") {
ledState = false;
digitalWrite(LED, LOW);
myservo.write(0);
Serial.println("Sensor de luz percibe mucha luz exterior - LED ROJO OFF en Placa 2, Servo a 0 grados");
}
}
void publishMessage(const char* topic, String payload, boolean retained) {
if (mqttClient.publish(topic, payload.c_str(), true))
Serial.println("Mensaje publicado [" + String(topic) + "]: " + payload);
}