Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 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
- #include <ESP8266WiFi.h>
- #include <PubSubClient.h>
- #define APELLIDO "Soberon"
- #define NOMBRE "Joaquin"
- #define WIFI_SSID "Alumnos"
- #define WIFI_PASS ""
- #define MQTT_HOST "broker.hivemq.com"
- #define MQTT_PORT 1883
- #define TOPIC_PUB_INI "ites/soberon/ini"
- #define TOPIC_SUB_MSG "ites/soberon/msg"
- #define TOPIC_LWT "ites/soberon/esp8266/lwt"
- #define MQTT_QOS 1
- #define MQTT_KEEPALIVE_SEC 30
- #define MQTT_BUFFER_SIZE 1024
- #define MQTT_SOCKET_TIMEOUT_SEC 10
- #define LWT_ONLINE "online"
- #define LWT_OFFLINE "offline"
- #define REINTENTO_WIFI_MS 3000
- #define REINTENTO_MQTT_MS 3000
- #define BLINK_PERIOD_MS 2000
- #define BLINK_ON_MS 100
- #define SERIAL_BAUD 115200
- #define PIN_LED LED_BUILTIN
- #define LED_ACTIVO_LOW 1
- #define CONFIG_LED pinMode(PIN_LED, OUTPUT)
- #define ENCENDER_LED digitalWrite(PIN_LED, (LED_ACTIVO_LOW ? LOW : HIGH))
- #define APAGAR_LED digitalWrite(PIN_LED, (LED_ACTIVO_LOW ? HIGH : LOW))
- #define AJUSTAR_LED(x) do { if (x) ENCENDER_LED; else APAGAR_LED; } while (0)
- WiFiClient NET;
- PubSubClient MQTT(NET);
- void TASK_WIFI(void);
- void TASK_MQTT(void);
- void TASK_BLINK(void);
- void ON_MQTT_MESSAGE(char* topic, byte* payload, unsigned int length);
- void ON_MQTT_MESSAGE(char* topic, byte* payload, unsigned int length) {
- if (strcmp(topic, TOPIC_SUB_MSG) != 0) return;
- char MSG[129];
- unsigned int N = (length < sizeof(MSG) - 1) ? length : (sizeof(MSG) - 1);
- for (unsigned int i = 0; i < N; i++) MSG[i] = (char)payload[i];
- MSG[N] = '\0';
- Serial.print("[MQTT] Mensaje en "); Serial.print(TOPIC_SUB_MSG); Serial.print(": ");
- Serial.println(MSG);
- }
- void TASK_WIFI(void) {
- static bool WIFI_REPORTADO = false;
- static unsigned long T_LAST = 0;
- if (WiFi.status() == WL_CONNECTED) {
- if (!WIFI_REPORTADO) {
- WIFI_REPORTADO = true;
- Serial.print("[WiFi] Conectado. IP: "); Serial.println(WiFi.localIP());
- }
- return;
- }
- WIFI_REPORTADO = false;
- if (millis() - T_LAST < REINTENTO_WIFI_MS) return;
- T_LAST = millis();
- Serial.print("[WiFi] Conectando a SSID: "); Serial.println(WIFI_SSID);
- WiFi.mode(WIFI_STA);
- WiFi.begin(WIFI_SSID, WIFI_PASS);
- }
- void TASK_MQTT(void) {
- static unsigned long T_LAST = 0;
- if (WiFi.status() != WL_CONNECTED) return;
- if (!MQTT.connected()) {
- if (millis() - T_LAST < REINTENTO_MQTT_MS) return;
- T_LAST = millis();
- char CLIENT_ID[24];
- snprintf(CLIENT_ID, sizeof(CLIENT_ID), "esp8266-%06X", ESP.getChipId());
- Serial.print("[MQTT] Conectando a "); Serial.print(MQTT_HOST); Serial.print(":");
- Serial.print(MQTT_PORT); Serial.print(" como "); Serial.println(CLIENT_ID);
- if (MQTT.connect(CLIENT_ID, TOPIC_LWT, MQTT_QOS, true, LWT_OFFLINE)) {
- MQTT.publish(TOPIC_LWT, LWT_ONLINE, true);
- Serial.println("[MQTT] Conectado. LWT=online");
- MQTT.subscribe(TOPIC_SUB_MSG, MQTT_QOS);
- Serial.print("[MQTT] Suscripto a: "); Serial.println(TOPIC_SUB_MSG);
- String MAC = WiFi.macAddress();
- char PAYLOAD[160];
- snprintf(PAYLOAD, sizeof(PAYLOAD), "Nombre y Apellido: %s %s | MAC: %s", NOMBRE, APELLIDO, MAC.c_str());
- MQTT.publish(TOPIC_PUB_INI, PAYLOAD, false);
- Serial.print("[MQTT] Publicado en "); Serial.print(TOPIC_PUB_INI); Serial.print(": ");
- Serial.println(PAYLOAD);
- } else {
- Serial.print("[MQTT] Falló conexión, rc="); Serial.println(MQTT.state());
- }
- return;
- }
- MQTT.loop();
- }
- void TASK_BLINK(void) {
- static unsigned long T_BLINK = 0;
- static bool BLINK_ON = false;
- unsigned long NOW = millis();
- if (!BLINK_ON) {
- if (NOW - T_BLINK < BLINK_PERIOD_MS) return;
- BLINK_ON = true; T_BLINK = NOW; ENCENDER_LED;
- } else {
- if (NOW - T_BLINK < BLINK_ON_MS) return;
- BLINK_ON = false; APAGAR_LED;
- }
- }
- void setup() {
- CONFIG_LED; APAGAR_LED;
- Serial.begin(SERIAL_BAUD);
- Serial.println("=======================================");
- Serial.print("Programador: "); Serial.print(APELLIDO); Serial.print(", "); Serial.println(NOMBRE);
- Serial.println("Dispositivo: ESP8266");
- Serial.println("=======================================");
- MQTT.setServer(MQTT_HOST, MQTT_PORT);
- MQTT.setCallback(ON_MQTT_MESSAGE);
- MQTT.setKeepAlive(MQTT_KEEPALIVE_SEC);
- MQTT.setBufferSize(MQTT_BUFFER_SIZE);
- MQTT.setSocketTimeout(MQTT_SOCKET_TIMEOUT_SEC);
- }
- void loop() {
- TASK_WIFI();
- TASK_MQTT();
- TASK_BLINK();
- }
Advertisement
Add Comment
Please, Sign In to add comment