Joa0712

Desafío 25/09/25

Sep 25th, 2025 (edited)
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.48 KB | Software | 0 0
  1. // El código es el mismo que el desafio 18/9, nada mas hay que verificar que cumpla al 100% con las reglas y "mejorarlo" en lo que se pueda
  2.  
  3.  
  4. #include <ESP8266WiFi.h>
  5. #include <PubSubClient.h>
  6.  
  7. #define APELLIDO "Soberon"
  8. #define NOMBRE "Joaquin"
  9.  
  10. #define WIFI_SSID "Alumnos"
  11. #define WIFI_PASS ""
  12. #define MQTT_HOST "broker.hivemq.com"
  13. #define MQTT_PORT 1883
  14.  
  15. #define TOPIC_PUB_INI "ites/soberon/ini"
  16. #define TOPIC_SUB_MSG "ites/soberon/msg"
  17. #define TOPIC_LWT "ites/soberon/esp8266/lwt"
  18.  
  19. #define MQTT_QOS 1
  20. #define MQTT_KEEPALIVE_SEC 30
  21. #define MQTT_BUFFER_SIZE 1024
  22. #define MQTT_SOCKET_TIMEOUT_SEC 10
  23. #define LWT_ONLINE "online"
  24. #define LWT_OFFLINE "offline"
  25.  
  26. #define REINTENTO_WIFI_MS 3000
  27. #define REINTENTO_MQTT_MS 3000
  28.  
  29. #define BLINK_PERIOD_MS 2000
  30. #define BLINK_ON_MS 100
  31.  
  32. #define SERIAL_BAUD 115200
  33.  
  34. #define PIN_LED LED_BUILTIN
  35. #define LED_ACTIVO_LOW 1
  36. #define CONFIG_LED pinMode(PIN_LED, OUTPUT)
  37. #define ENCENDER_LED digitalWrite(PIN_LED, (LED_ACTIVO_LOW ? LOW : HIGH))
  38. #define APAGAR_LED digitalWrite(PIN_LED, (LED_ACTIVO_LOW ? HIGH : LOW))
  39. #define AJUSTAR_LED(x) do { if (x) ENCENDER_LED; else APAGAR_LED; } while (0)
  40.  
  41. WiFiClient NET;
  42. PubSubClient MQTT(NET);
  43.  
  44. void TASK_WIFI(void);
  45. void TASK_MQTT(void);
  46. void TASK_BLINK(void);
  47. void ON_MQTT_MESSAGE(char* topic, byte* payload, unsigned int length);
  48.  
  49. void ON_MQTT_MESSAGE(char* topic, byte* payload, unsigned int length) {
  50.   if (strcmp(topic, TOPIC_SUB_MSG) != 0) return;
  51.   char MSG[129];
  52.   unsigned int N = (length < sizeof(MSG) - 1) ? length : (sizeof(MSG) - 1);
  53.   for (unsigned int i = 0; i < N; i++) MSG[i] = (char)payload[i];
  54.   MSG[N] = '\0';
  55.   Serial.print("[MQTT] Mensaje en "); Serial.print(TOPIC_SUB_MSG); Serial.print(": ");
  56.   Serial.println(MSG);
  57. }
  58.  
  59. void TASK_WIFI(void) {
  60.   static bool WIFI_REPORTADO = false;
  61.   static unsigned long T_LAST = 0;
  62.   if (WiFi.status() == WL_CONNECTED) {
  63.     if (!WIFI_REPORTADO) {
  64.       WIFI_REPORTADO = true;
  65.       Serial.print("[WiFi] Conectado. IP: "); Serial.println(WiFi.localIP());
  66.     }
  67.     return;
  68.   }
  69.   WIFI_REPORTADO = false;
  70.   if (millis() - T_LAST < REINTENTO_WIFI_MS) return;
  71.   T_LAST = millis();
  72.   Serial.print("[WiFi] Conectando a SSID: "); Serial.println(WIFI_SSID);
  73.   WiFi.mode(WIFI_STA);
  74.   WiFi.begin(WIFI_SSID, WIFI_PASS);
  75. }
  76.  
  77. void TASK_MQTT(void) {
  78.   static unsigned long T_LAST = 0;
  79.   if (WiFi.status() != WL_CONNECTED) return;
  80.   if (!MQTT.connected()) {
  81.     if (millis() - T_LAST < REINTENTO_MQTT_MS) return;
  82.     T_LAST = millis();
  83.     char CLIENT_ID[24];
  84.     snprintf(CLIENT_ID, sizeof(CLIENT_ID), "esp8266-%06X", ESP.getChipId());
  85.     Serial.print("[MQTT] Conectando a "); Serial.print(MQTT_HOST); Serial.print(":");
  86.     Serial.print(MQTT_PORT); Serial.print(" como "); Serial.println(CLIENT_ID);
  87.     if (MQTT.connect(CLIENT_ID, TOPIC_LWT, MQTT_QOS, true, LWT_OFFLINE)) {
  88.       MQTT.publish(TOPIC_LWT, LWT_ONLINE, true);
  89.       Serial.println("[MQTT] Conectado. LWT=online");
  90.       MQTT.subscribe(TOPIC_SUB_MSG, MQTT_QOS);
  91.       Serial.print("[MQTT] Suscripto a: "); Serial.println(TOPIC_SUB_MSG);
  92.       String MAC = WiFi.macAddress();
  93.       char PAYLOAD[160];
  94.       snprintf(PAYLOAD, sizeof(PAYLOAD), "Nombre y Apellido: %s %s | MAC: %s", NOMBRE, APELLIDO, MAC.c_str());
  95.       MQTT.publish(TOPIC_PUB_INI, PAYLOAD, false);
  96.       Serial.print("[MQTT] Publicado en "); Serial.print(TOPIC_PUB_INI); Serial.print(": ");
  97.       Serial.println(PAYLOAD);
  98.     } else {
  99.       Serial.print("[MQTT] Falló conexión, rc="); Serial.println(MQTT.state());
  100.     }
  101.     return;
  102.   }
  103.   MQTT.loop();
  104. }
  105.  
  106. void TASK_BLINK(void) {
  107.   static unsigned long T_BLINK = 0;
  108.   static bool BLINK_ON = false;
  109.   unsigned long NOW = millis();
  110.   if (!BLINK_ON) {
  111.     if (NOW - T_BLINK < BLINK_PERIOD_MS) return;
  112.     BLINK_ON = true; T_BLINK = NOW; ENCENDER_LED;
  113.   } else {
  114.     if (NOW - T_BLINK < BLINK_ON_MS) return;
  115.     BLINK_ON = false; APAGAR_LED;
  116.   }
  117. }
  118.  
  119. void setup() {
  120.   CONFIG_LED; APAGAR_LED;
  121.   Serial.begin(SERIAL_BAUD);
  122.   Serial.println("=======================================");
  123.   Serial.print("Programador: "); Serial.print(APELLIDO); Serial.print(", "); Serial.println(NOMBRE);
  124.   Serial.println("Dispositivo: ESP8266");
  125.   Serial.println("=======================================");
  126.   MQTT.setServer(MQTT_HOST, MQTT_PORT);
  127.   MQTT.setCallback(ON_MQTT_MESSAGE);
  128.   MQTT.setKeepAlive(MQTT_KEEPALIVE_SEC);
  129.   MQTT.setBufferSize(MQTT_BUFFER_SIZE);
  130.   MQTT.setSocketTimeout(MQTT_SOCKET_TIMEOUT_SEC);
  131. }
  132.  
  133. void loop() {
  134.   TASK_WIFI();
  135.   TASK_MQTT();
  136.   TASK_BLINK();
  137. }
Advertisement
Add Comment
Please, Sign In to add comment