Monitorización textil (tejeduría)ESP32 PLCMQTTWiFiComunicación
Datalogging MQTT offline-first con búfer en SD
El WiFi de la fábrica se caerá — la única duda es si pierdes datos de producción cuando ocurra. Este ejemplo monitoriza una máquina (entradas de estado + un contador de pulsos de producción) y publica por MQTT, escribiendo antes cada mensaje en un fichero diario de la tarjeta SD. Cuando la red vuelve, no falta nada. Es el patrón offline-first que ejecutamos en tricotosas en producción.
Primero eventos, después snapshots
Un cambio en cualquier entrada publica un evento de inmediato — visibilidad por debajo del segundo de las paradas de máquina. Un snapshot completo con el contador de pulsos sale cada 20 s como heartbeat. Ambos llevan un ID de mensaje único (id del PLC + timestamp del RTC + millis) para que el backend pueda deduplicar y auditar.
La tarjeta SD es la fuente de verdad
publicar() escribe en el fichero JSON diario ANTES de intentar MQTT. La conectividad se convierte en una optimización, no en una dependencia. Los ficheros con nombre YYYY-MM-DD.json hacen triviales la recuperación manual y la subida masiva por HTTP.
Reconexión sin bloqueos
Los intentos de reconexión WiFi están limitados a uno cada 10 s y nunca bloquean el loop: la máquina se sigue monitorizando a toda velocidad mientras la red no está. Un RTC hardware sincronizado por NTP mantiene los timestamps fiables entre reinicios.
Un fragmento de la implementación
Tal cual del ejemplo desplegado en el ESP32 PLC — cópialo libremente:
void setup() {
Serial.begin(115200);
for (int i = 0; i < NPINS; i++) { pinMode(pins[i], INPUT); lastState[i] = digitalRead(pins[i]); }
attachInterrupt(I0_0, [] { pulses++; }, FALLING); // production counter
SD.begin();
RTC.begin();
checkWiFi();
mqtt.setServer(MQTT_HOST, MQTT_PORT);
uint32_t t0 = millis(); // initial WiFi wait (max 15 s)
while (WiFi.status() != WL_CONNECTED && millis() - t0 < 15000) delay(500);
if (WiFi.status() == WL_CONNECTED) syncRTC();
}El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.
Preguntas frecuentes
¿Cómo recupero los datos almacenados en búfer?
O bien reproduces los ficheros diarios por MQTT al reconectar, o expones un endpoint de subida HTTP — nuestra versión de producción sube los ficheros a Node-RED con basic auth.
¿A qué velocidad puede ir el contador de pulsos?
El contador corre sobre una interrupción hardware, así que miles de pulsos por segundo no son problema; el snapshot de 20 s solo reporta la cuenta acumulada.
¿Qué broker debería usar?
Sirve cualquier broker MQTT 3.1.1; nosotros solemos ejecutar Mosquitto en un concentrador on-premise con Node-RED para dashboards y persistencia en base de datos.