#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <M5Core2.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define WIFI_CHANNEL 6
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);
volatile bool pregunta = false; //variable que me dice si hay pregunta
volatile bool respuesta = false; //variable que me dice si hay respuestas
String payload;
String content = "";
String content2 = "";
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_Pregunta();
SuscribeMqtt_Respuestas();
mqttClient.setCallback(OnMqttReceived);
}
void ConnectMqtt()
{
while (!mqttClient.connected())
{
Serial.print("Starting MQTT connection...");
if (mqttClient.connect(MQTT_CLIENT_NAME))
{
Serial.println("Client connected!");
SuscribeMqtt_Pregunta();
SuscribeMqtt_Respuestas();
}
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_Pregunta()
{
mqttClient.subscribe("Central/Pregunta"); //topic de la pregunta
}
void SuscribeMqtt_Respuestas() {
mqttClient.subscribe("Central/Respuestas"); //topic de las respuestas
}
//este es el unico que uso, que se ejecuta siempre en cualquier callback
void OnMqttReceived(char *topic, byte *payload, unsigned int length)
{
content = "";
content2 = "";
if (String(topic) == "PabloRomero/Pregunta")
{
for (size_t i = 0; i < length; i++)
{
content.concat((char)payload[i]);
}
if (pregunta == false)
{
pregunta = true; //ha recibido una pregunta
M5.Axp.SetVibration(true);
delay(100);
M5.Axp.SetVibration(false);
delay(500);
}
}
else if (String(topic) == "PabloRomero/Respuestas")
{
for (size_t i = 0; i < length; i++)
{
content2.concat((char)payload[i]);
}
respuesta = true; //ha recibido una respuesta
}
}
void PublishMqtt_Resultado(String data)
{
payload = "";
payload = String(data);
mqttClient.publish("Central/Resultados", (char *)payload.c_str());
}
void setup(void)
{
Serial.begin(115200);
M5.begin();
M5.Lcd.setTextColor(YELLOW, BLACK); // Poner el color de texto en amarillo y el fondo en negro
M5.Lcd.setTextSize(2); // Poner el tamaño de las letras en 2
M5.Lcd.setCursor(0, 0); // Mover el cursor a la posición (x, y) = (0, 0)
ConnectWiFi();
InitMqtt();
SuscribeMqtt_Pregunta();
SuscribeMqtt_Respuestas();
}
void loop() {
M5.update(); // Actualiza estado de los botones
HandleMqtt();
if(pregunta == false){
M5.Lcd.println("El dispositivo está esperando una pregunta");
}
if (pregunta == true && respuesta == true) {
M5.Lcd.print(content); //Muestra la pregunta
M5.Lcd.setCursor(0, 20); // Mover el cursor a la posición (x, y) = (0, 20)
M5.Lcd.print(content2); //Muestra la respuesta
if (M5.BtnA.wasReleased()) {
PublishMqtt_Resultado("Respuesta de Pablo Romero : A");
pregunta = false;
respuesta = false;
}
else if (M5.BtnB.wasReleased()) {
PublishMqtt_Resultado("Respuesta de Pablo Romero : B");
pregunta = false;
respuesta = false;
}
else if (M5.BtnC.wasReleased()) {
PublishMqtt_Resultado("Respuesta de Pablo Romero : C");
pregunta = false;
respuesta = false;
}
}
}