#include <ESP32Servo.h>
#include <WiFi.h>
#include <PubSubClient.h>
const int SERVO_PIN = 19;
const int BUTTON_PIN = 4; // Pin donde está conectado el botón
const int LED_PIN = 13;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiClient wifiClient;
Servo sg90;
const char* mqttBroker = "test.mosquitto.org"; // Broker de Mosquitto
const int mqttPort = 1883; // Puerto sin TLS
const char* mqttClientName = "ClienteMathiMT06EFDI"; //CAMBIAR EL USUARIO
const char* mqttUser = "";
const char* mqttPass = "";
const char *name_topic = "efdi/mt06/mathiWokwi"; // CAMBIAR EL TOPICO
const char *send_topic = "efdi/mt06/mathiPlaca"; // CAMBIAR EL TOPICO
PubSubClient mqttClient(wifiClient);
int buttonStateBefore = HIGH; // Estado anterior del botón
int buttonState = HIGH;
int stateOnline = HIGH;
int currentAngle = 0;
bool direction = true; // true para avanzar, false para retroceder
void mqttConnect() {
mqttClient.setServer(mqttBroker, mqttPort);
while (!mqttClient.connected()) {
Serial.print("Attempting MQTT connection...");
if (mqttClient.connect(mqttClientName, mqttUser, mqttPass)) {
Serial.println("connected");
mqttClient.publish(send_topic, mqttClientName);
// Topic(s) subscription
mqttClient.subscribe(name_topic);
} else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
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("Message arrived[" + String(topic) + "]" + incomingMessage);
if (incomingMessage == "on") {
digitalWrite(LED_PIN, HIGH);
stateOnline = LOW;
Serial.println("LED ON");
} else if (incomingMessage == "off") {
digitalWrite(LED_PIN, LOW);
stateOnline = HIGH;
Serial.println("LED OFF");
}
}
//======================================= publising as string
void publishMessage(const char* topic, String payload, boolean retained) {
if (mqttClient.publish(topic, payload.c_str(), retained)) {
Serial.println("Message published [" + String(topic) + "]: " + payload);
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
sg90.attach(SERVO_PIN);
sg90.write(currentAngle);
// Conectar a WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// Loop while waiting for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// MQTT setup
mqttClient.setServer(mqttBroker, mqttPort);
mqttClient.setCallback(callback);
}
void loop() {
// Check if we are still connected to the MQTT broker
if (!mqttClient.connected()) {
mqttConnect();
}
// Let PubSubClient library do its magic
mqttClient.loop();
// Leer el estado actual del botón
buttonState = digitalRead(BUTTON_PIN);
// Publicar "on" solo cuando el botón se presiona (transición de HIGH a LOW)
if (buttonState == LOW && buttonStateBefore == HIGH) {
publishMessage(send_topic, "on", true);
buttonStateBefore = LOW; // Actualizar el estado anterior
}
// Publicar "off" solo cuando el botón se libera (transición de LOW a HIGH)
else if (buttonState == HIGH && buttonStateBefore == LOW) {
publishMessage(send_topic, "off", true);
buttonStateBefore = HIGH; // Actualizar el estado anterior
}
// Controlar el movimiento del servo si se ha recibido "on"
if (stateOnline == LOW) {
if (direction) {
currentAngle++;
if (currentAngle >= 180) {
direction = false; // Cambiar dirección al llegar a 180 grados
}
} else {
currentAngle--;
if (currentAngle <= 0) {
direction = true; // Cambiar dirección al llegar a 0 grados
}
}
sg90.write(currentAngle); // Mover el servo al ángulo actual
delay(15); // Pequeña pausa para suavizar el movimiento del servo
}
}