Ir al contenido

← Todas las funcionalidades

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.

Funcionalidades relacionadas