//Al tocar la pantalla dibujar los puntos e enviar la coordenada tocada (x,y) en uno o dos topics mediante MQTT.
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <Adafruit_ILI9341.h>
#include <Adafruit_FT6206.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define WIFI_CHANNEL 6
#define button 32
#define TFT_DC 2
#define TFT_CS 15
#define I2C_cap_SDA 21
#define I2C_cap_SCL 22
const char *MQTT_BROKER_ADRESS = "test.mosquitto.org";
const uint16_t MQTT_PORT = 1883;
const char *MQTT_CLIENT_NAME = "mario_pub";
WiFiClient espClient;
PubSubClient mqttClient(espClient);
Adafruit_FT6206 ctp = Adafruit_FT6206();
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
volatile bool buttonInterrupted = false;
TS_Point p_current;
TS_Point p_prev;
void ConnectWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, WIFI_CHANNEL);
Serial.print("Connecting to WiFi ");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
}
void InitMqtt() {
mqttClient.setServer(MQTT_BROKER_ADRESS, MQTT_PORT);
}
void ConnectMqtt() {
while (!mqttClient.connected()) {
Serial.print("Starting MQTT connection...");
if (mqttClient.connect(MQTT_CLIENT_NAME)) {
Serial.println("Client connected");
} else {
Serial.print("Failed, rc=");
Serial.println(mqttClient.state());
delay(5000);
}
}
}
void HandleMqtt() {
if (!mqttClient.connected()) {
ConnectMqtt();
}
mqttClient.loop();
}
void PublishMqtt(int x, int y) {
// Crear el mensaje en formato JSON
String message = "{\"pos_x\": " + String(x) + ", \"pos_y\": " + String(y) + "}";
// Publicar el mensaje en un único topic
mqttClient.publish("mmggjj/punto", message.c_str());
}
void IRAM_ATTR button_ISR() {
buttonInterrupted = true;
}
void setup()
{
pinMode(button, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(button), button_ISR, FALLING);
// Inicializar puerto serie
Serial.begin(115200);
Serial.println("Pintar con la pantalla capacitiva");
// Inicializar display
Wire.setPins(I2C_cap_SDA, I2C_cap_SCL);
tft.begin();
// Inicializar sensor capacitivo
if (!ctp.begin(1))
{
Serial.println("No se pudo inicializar el controlador FT6206");
while (true);
}
tft.setRotation(2);
Serial.println("Capacitive touchscreen started");
tft.fillScreen(ILI9341_BLACK);
tft.setRotation(2);
ConnectWiFi();
InitMqtt();
}
void loop()
{
HandleMqtt();
if (ctp.touched())
{
p_current = ctp.getPoint(); // Guardo el pixel que se ha tocado
if (p_current != p_prev) // Si no es el mismo que se ha tocado previamente
{
Serial.printf("x:%d, y:%d \r\n", p_current.x, p_current.y );
tft.drawPixel(p_current.x, p_current.y, ILI9341_WHITE);
PublishMqtt(p_current.x,p_current.y);
}
p_prev = p_current; // Actualizo el píxel actual
}
if (buttonInterrupted)
{
buttonInterrupted = false;
tft.fillScreen(ILI9341_BLACK);
}
delay(10);
}
/*
void PublishMqtt(const char* word, int number) {
// Crear el mensaje en formato JSON
String message = "{\"word\": \"" + String(word) + "\", \"number\": " + String(number) + "}";
// Publicar el mensaje en un único topic
mqttClient.publish("mmggjj/punto", message.c_str());
}
*/