#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#define ledA 5
#define ledV 18
#define ledN 17
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define WIFI_CHANNEL 6
volatile bool botonA_pressed = false;
volatile bool botonB_pressed = false;
volatile bool botonC_pressed = false;
volatile bool botonD_pressed = false;
const char *MQTT_BROKER_ADRESS = "mqtt.eclipseprojects.io";
const uint16_t MQTT_PORT = 1883;
const char *MQTT_CLIENT_NAME = "PabloRomero_sub_test";
WiFiClient espClient;
PubSubClient mqttClient(espClient);
String payload;
String content = "";
void ConnectWiFi()
{
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, WIFI_CHANNEL);
Serial.print("Connecting to WiFi ");
Serial.print(WIFI_SSID);
while (WiFi.status() != WL_CONNECTED)
{
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void InitMqtt()
{
mqttClient.setServer(MQTT_BROKER_ADRESS, MQTT_PORT);
SuscribeMqtt_BA();
SuscribeMqtt_BB();
mqttClient.setCallback(OnMqttReceived);
}
void ConnectMqtt()
{
while (!mqttClient.connected())
{
Serial.print("Starting MQTT connection...");
if (mqttClient.connect(MQTT_CLIENT_NAME))
{
Serial.println("Client connected!");
SuscribeMqtt_BA();
SuscribeMqtt_BB();
}
else
{
Serial.print("Failed MQTT connection, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void HandleMqtt()
{
if (!mqttClient.connected())
{
ConnectMqtt();
}
mqttClient.loop();
}
void SuscribeMqtt_BA()
{
mqttClient.subscribe("Interfaz/input");
}
void SuscribeMqtt_BB()
{
mqttClient.subscribe("Interfaz/alarma");
}
//este es el unico que uso, que se ejecuta siempre en cualquier callback
void OnMqttReceived(char *topic, byte *payload, unsigned int length)
{
content = "";
for (size_t i = 0; i < length; i++)
{
content.concat((char)payload[i]);
}
if (String(topic) == "Interfaz/input")
{
if (content == "A")
{
botonA_pressed = true;
}
else if (content == "B")
{
botonB_pressed = true;
}
else if (content == "C")
{
botonC_pressed = true;
}
}
else if (String(topic) == "Interfaz/alarma")
{
if (content == "Alarma")
{
botonD_pressed = true;
}
}
}
hw_timer_t*timerLedA = NULL;
hw_timer_t*timerLedN = NULL;
int state = 0; //
TaskHandle_t HandleTask1; //handle de la tarea
void IRAM_ATTR parpadeoAzul() {
digitalWrite(ledA, !digitalRead(ledA));
}
void IRAM_ATTR parpadeoNaranja() {
digitalWrite(ledN, !digitalRead(ledN));
}
void setup() {
Serial.begin(115200);
pinMode(ledA, OUTPUT);
pinMode(ledV, OUTPUT);
pinMode(ledN, OUTPUT);
ConnectWiFi();
InitMqtt();
SuscribeMqtt_BA();
SuscribeMqtt_BB();
digitalWrite(ledV, LOW);
digitalWrite(ledN, LOW);
//timer del led azul
timerLedA = timerBegin(0, 80, true);
timerAttachInterrupt(timerLedA, &parpadeoAzul, true);
timerAlarmWrite(timerLedA, 500000, true); //500ms
//timer del led naranja
timerLedN = timerBegin(1, 80, true);
timerAttachInterrupt(timerLedN, &parpadeoNaranja, true);
timerAlarmWrite(timerLedN, 500000, true); //500ms
xTaskCreatePinnedToCore(
estados, // Function en la que se implementa la tarea
"Tarea que controla los estados", // Nombre de la tarea
100000, // Memoria (en Bytes) asignados a esta tarea
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
5, // Prioridad de la tarea (cuanto más alto, más prioridad)
&HandleTask1, // Handle de la tarea 1
0); // Core donde va a correr la tarea 1
}
void loop() {
HandleMqtt();
delay(10); // this speeds up the simulation
}
void estados(void *parameter) {
while (1) {
switch (state) {
case 0: //DESARMADA
timerAlarmEnable(timerLedA);
timerAlarmDisable(timerLedN);
if (botonA_pressed) {
timerAlarmDisable(timerLedA);
state = 1; //pasa a armada
botonA_pressed = false;
digitalWrite(ledA, HIGH);
digitalWrite(ledV, LOW);
digitalWrite(ledN, LOW);
}
else if (botonD_pressed) {
timerAlarmDisable(timerLedA);
state = 3; //pasa a alarma
botonD_pressed = false;
digitalWrite(ledA, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledN, LOW);
}
break;
case 1: //ARMADA
if (botonB_pressed) {
state = 2; //pasa a funcionamiento
botonB_pressed = false;
digitalWrite(ledA, LOW);
digitalWrite(ledV, HIGH);
}
else if (botonA_pressed) {
state = 0; //pasa a desarmada
botonA_pressed = false;
digitalWrite(ledA, LOW);
digitalWrite(ledV, LOW);
}
else if (botonD_pressed) {
state = 3; //pasa a alarma
botonD_pressed = false;
digitalWrite(ledA, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledN, LOW);
}
break;
case 2: //FUNCIONAMIENTO
if (botonB_pressed) {
state = 1; //pasa a armada
botonB_pressed = false;
digitalWrite(ledA, HIGH);
digitalWrite(ledV, LOW);
}
else if (botonD_pressed) {
state = 3; //pasa a alarma
botonD_pressed = false;
digitalWrite(ledA, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledN, LOW);
}
break;
case 3: //ALARMA
timerAlarmEnable(timerLedA);
timerAlarmEnable(timerLedN);
if (botonC_pressed) {
timerAlarmDisable(timerLedN);
botonC_pressed = false;
state = 0;
}
break;
}
}
}