// Opcion A: Publisher
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <M5Core2.h>
#define WIFI_SSID "Scape_Futhark"
#define WIFI_PASSWORD "admin1234"
#define WIFI_CHANNEL 6
const char *MQTT_BROKER_ADRESS = "test.mosquitto.org"; //Dirección del broker
const uint16_t MQTT_PORT = 1883; // Puerto de MQTT
const char *MQTT_CLIENT_NAME = "Publisher_vikingo"; //Nombre del cliente MQTT
TouchPoint_t coordenadas; // Instancia de coordenadas donde se guardan las coordenadas de la pulsación en LCD
void ConnectWiFi() // Función para conexión a red WiFi
{
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, WIFI_CHANNEL);
Serial.print("Connecting to WiFi ");
Serial.print(WIFI_SSID);
// Wait for connection
while (WiFi.status() != WL_CONNECTED)
{
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void InitMqtt() // Lanzamiento del cliente MQTT
{
mqttClient.setServer(MQTT_BROKER_ADRESS, MQTT_PORT);
}
void ConnectMqtt() //Conexión del cliente MQTT
{
while (!mqttClient.connected())
{
Serial.print("Starting MQTT connection...");
if (mqttClient.connect(MQTT_CLIENT_NAME))
{
Serial.print("Client connected");
}
else
{
Serial.print("Failed MQTT connection, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void HandleMqtt() //Manejador de MQtt
{
if (!mqttClient.connected())
{
ConnectMqtt();
}
mqttClient.loop();
}
void PublishMqtt_x(unsigned long data) // Función para publicar en topic de MQTT la coordenada X de la pulsación
{
payload = "";
payload = String(data);
mqttClient.publish("ScapeDrakkar/coordenadas_x", (char *)payload.c_str());
}
void PublishMqtt_y(unsigned long data) // Función para publicar en topic de MQTT la coordenada X de la pulsación
{
payload = "";
payload = String(data);
mqttClient.publish("ScapeDrakkar/coordenadas_y", (char *)payload.c_str());
}
void ActualizarPosicion(){ // Función para actualizar las coordenadas de la pulsación
coordenadas = M5.Touch.getPressPoint();
}
void Dibujar(){ // Función que muestra en la pantalla del M5 el dibujo que está realizando el usuario
M5.Lcd.DrawPixel(coordenadas.x, coordenadas.y,RED);
}
void setup(void)
{
M5.begin(); // Necesario para la incialización del M5
M5.Lcd.fillScreen(WHITE); // Reinicio de la pantalla
Serial.begin(115200);
ConnectWiFi();
InitMqtt();
}
void loop()
{
M5.update(); // Necesario para actualizar el estado del LCD
if(M5.Touch.IsPressed()){ // Si M5.Touch.IsPressed = true, se actualizan, publican en MQTT, y se dibujan en pantalla las coordenadas pulsadas por el usuario
ActualizarPosicion();
Dibujar();
HandleMqtt();
PublishMqtt_x(coordenadas.x);
PublishMqtt_y(coordenadas.y);
}
delay(500);
}