Bombeo de agua (saneamiento)ESP32 PLC 38ARGPIOControl
Estación de dos bombas con alternancia y telemetría LoRaWAN
Cuando una estación de bombeo está a una hora en coche y no tiene cobertura de red, necesitas dos cosas: un controlador que sobreviva por sí solo al fallo de una bomba, y una telemetría que funcione sin WiFi. Este ejemplo ejecuta una estación de dos bombas con alternancia automática y failover en un ESP32 PLC 38AR, y lo reporta todo por LoRaWAN en una trama de 4 bytes — amable con la batería y sin tarjetas SIM.
Alternancia y failover
Cada ciclo de llenado arranca la bomba contraria, equilibrando el desgaste entre los dos motores. Si la bomba en marcha dispara (relé térmico o falta de confirmación del contactor), el controlador conmuta a la bomba sana y marca el error — la estación sigue bombeando con redundancia degradada en lugar de inundarse.
Tres tareas FreeRTOS, tres responsabilidades
El control se ejecuta cada 100 ms; la tarea LoRaWAN envía una trama cada 60 s; una tercera tarea vuelve a hacer join OTAA cada hora como watchdog de comunicaciones. Separarlas significa que una radio lenta nunca bloquea la lógica de bombas — el ESP32 de doble núcleo lo gestiona con naturalidad.
4 bytes que cuentan toda la historia
Once entradas digitales, dos salidas, dos flags de error y una sonda de nivel analógica de 10 bits se empaquetan a nivel de bit en 4 bytes. Tramas pequeñas significan menos airtime, mejor cumplimiento del duty cycle de LoRaWAN y más alcance con spreading factors altos.
Un fragmento de la implementación
Tal cual del ejemplo desplegado en el ESP32 PLC 38AR — cópialo libremente:
void setup() {
Serial.begin(115200);
const int ins[] = {I_MIN, I_MAX, I_OVERLVL, I_RESET, I_MAN_P1, I_MAN_P2,
I_CONF_P1, I_CONF_P2, I_THERM_P1, I_THERM_P2};
for (int p : ins) pinMode(p, INPUT);
pinMode(Q_P1, OUTPUT); pinMode(Q_P2, OUTPUT); pinMode(Q_PILOT, OUTPUT);
stopAll();
lora_init(57600); // RN2xx3 via SerialSC1
lora_join_otaa("APP_EUI", "APP_KEY");
xTaskCreate(vTaskControl, "control", 4096, NULL, 3, NULL);
xTaskCreate(vTaskLora, "lora", 4096, NULL, 1, NULL);
xTaskCreate(vTaskRejoin, "rejoin", 4096, NULL, 2, NULL);
}El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.
Preguntas frecuentes
¿Qué módulo LoRa utiliza este ejemplo?
Cualquier módem tipo RN2xx3 en el puerto serie del PLC. Las llamadas lora_init/lora_join_otaa se corresponden con los comandos del módulo — consulta la plantilla LoRaWAN de nuestro catálogo de soluciones.
¿Por qué empaquetar bits en lugar de enviar JSON?
Los payloads LoRaWAN son un bien escaso: 4 bytes frente a ~200 bytes de JSON marcan la diferencia entre tramas compatibles con SF12 y mensajes que no caben en el duty cycle.
¿Cómo se cablea la sonda de nivel analógica?
Un transmisor de nivel 4-20 mA en la entrada I0_11, leído como 0-1023 y enviado como 10 bits dentro de la trama.