#include <LiquidCrystal.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const char* mqttServidor = "instrumentacion-uji.dynv6.net";
const int mqttPuerto = 1883;
const char* nombreCliente = "joan";
unsigned long tiempo_nueva = 0;
unsigned long tiempo_carta = 0;
unsigned long tiempo_planto = 0;
bool pulsador_nueva_ant = 1;
bool pulsador_carta_ant = 1;
bool pulsador_planto_ant = 1;
int jugada;
WiFiClient clienteESP;
PubSubClient clienteMQTT(clienteESP);
LiquidCrystal lcd(12, 13, 17, 16, 27, 14);
struct InformacionPartida {
char crupier[20];
char jugador[20];
char estado[10];
int fondos;
};
InformacionPartida cartas;
void conectarWiFi() {
Serial.print("Conectando a WiFi");
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" ¡Conectado!");
}
void conectarMQTT() {
clienteMQTT.setServer(mqttServidor, mqttPuerto);
clienteMQTT.setCallback(LeerMQTT);
while (!clienteMQTT.connected()) {
Serial.print("Conectando a MQTT...");
if (clienteMQTT.connect(nombreCliente))
Serial.println("Conectado");
else {
Serial.print("Falló con estado ");
Serial.print(clienteMQTT.state());
delay(2000);
}
}
clienteMQTT.subscribe(("instrumentacion/" + String(nombreCliente)).c_str());
}
void LeerMQTT(char* topic, byte* payload, unsigned int length) {
char mensaje[length + 1] = {0x00};
for (int i = 0; i < length; i++)
mensaje[i] = (char)payload[i];
mensaje[length] = 0x00;
Serial.println(mensaje);
analizarJsonYMostrar(mensaje);
actualizarLCD();
}
void analizarJsonYMostrar(const char* jsonString) {
DynamicJsonDocument doc(1024);
deserializeJson(doc, jsonString);
strncpy(cartas.crupier, doc["crupier"], sizeof(cartas.crupier) - 1);
cartas.crupier[sizeof(cartas.crupier) - 1] = '\0';
strncpy(cartas.jugador, doc["jugador"], sizeof(cartas.jugador) - 1);
cartas.jugador[sizeof(cartas.jugador) - 1] = '\0';
strncpy(cartas.estado, doc["estado"], sizeof(cartas.estado) - 1);
cartas.estado[sizeof(cartas.estado) - 1] = '\0';
cartas.fondos = doc["fondos"];
}
void actualizarLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("C: ");
lcd.print(cartas.crupier);
lcd.setCursor(12, 0);
lcd.print("$:");
lcd.print(cartas.fondos);
lcd.setCursor(0, 1);
lcd.print("J: ");
lcd.print(cartas.jugador);
lcd.setCursor(15, 1);
if (strcmp(cartas.estado, "activa") == 0) {
lcd.print("a");
} else if (strcmp(cartas.estado, "perdiste") == 0) {
lcd.print("p");
} else if (strcmp(cartas.estado, "empate") == 0) {
lcd.print("e");
} else if (strcmp(cartas.estado, "ganaste") == 0) {
lcd.print("g");
}
}
void setup() {
Serial.begin(9600);
conectarWiFi();
conectarMQTT();
lcd.begin(16, 2);
pinMode(23, INPUT_PULLUP); // Nueva - Azul
pinMode(22, INPUT_PULLUP); // Carta - Amarillo
pinMode(21, INPUT_PULLUP); // Planto - Rojo
}
void loop() {
if (millis() > tiempo_nueva + 50) {
tiempo_nueva = millis();
bool pulsador_nueva = digitalRead(23);
if (pulsador_nueva == LOW && pulsador_nueva_ant == HIGH) {
char mensaje[50];
sprintf(mensaje, "{\"jugador\":\"%s\",\"accion\":\"nueva\"}", nombreCliente);
clienteMQTT.publish("instrumentacion/blackjack", (uint8_t*)mensaje, strlen(mensaje), true);
Serial.println(mensaje);
}
pulsador_nueva_ant = pulsador_nueva;
}
if (millis() > tiempo_carta + 50) {
tiempo_carta = millis();
bool pulsador_carta = digitalRead(22);
if (pulsador_carta == LOW && pulsador_carta_ant == HIGH) {
char mensaje[50];
sprintf(mensaje, "{\"jugador\":\"%s\",\"accion\":\"carta\"}", nombreCliente);
clienteMQTT.publish("instrumentacion/blackjack", (uint8_t*)mensaje, strlen(mensaje), true);
Serial.println(mensaje);
}
pulsador_carta_ant = pulsador_carta;
}
if (millis() > tiempo_planto + 50) {
tiempo_planto = millis();
bool pulsador_planto = digitalRead(21);
if (pulsador_planto == LOW && pulsador_planto_ant == HIGH) {
char mensaje[50];
sprintf(mensaje, "{\"jugador\":\"%s\",\"accion\":\"planto\"}", nombreCliente);
clienteMQTT.publish("instrumentacion/blackjack", (uint8_t*)mensaje, strlen(mensaje), true);
Serial.println(mensaje);
}
pulsador_planto_ant = pulsador_planto;
}
if (!clienteMQTT.loop()) {
Serial.println("Desconectado");
while (!clienteMQTT.connected()) {
Serial.print("Conectando a MQTT...");
if (clienteMQTT.connect(nombreCliente))
Serial.println("Conectado");
else {
Serial.print("Falló con estado ");
Serial.print(clienteMQTT.state());
delay(2000);
}
}
}
}