En este manual, voy a utilizar un sensor mh-rd detectar la lluvia lo antes posible. Con esto, podremos activar acciones. Quiero destacar que también podemos utilizar el sensor yl-83 que es prácticamente igual pero más caro. El propósito no es medir la cantidad de precipitación durante un período de tiempo determinado sino detectar el momento en qué empieza a llover. También vamos a ver cómo detectar la intensidad de la lluvia que está cayendo.
Además, crearé un sensor que me dirá la fecha del último día que llovió y uno que me dirá cuántos días hace que no llueve.
Aunque yo ahora lo voy a hacer para detectar la lluvia, también lo podemos utilizar como sensor de inundación.
Me imaginé un montón de cosas antes de tomar la forma más sencilla: medir la resistencia entre 2 conductores separados por unos milímetros con la esperanza de detectar una gota de agua que hubiera caído entre los 2.
Esta técnica tiene el mérito de ser sencilla, pero presenta algunos problemas, el mayor de los cuales es la corrosión de los conductores, realizándola correctamente podremos limitarla.
Características
- Intervalo de intento de detección de lluvia ajustable (mediante el potenciómetro que incluye el propio sensor)
- Bajo costo
- Todas las funciones utilizables con ESPHome
El módulo, lo voy a instalar en una caja impermeable IP65 para proteger las partes electrónicas. Esta cajita la he comprado en un bazar. También la encontrarás en tiendas de bricolaje.
Piezas necesarias para construir el sensor de lluvia con ESPHome
Para poner en marcha este sensor, son imprescindibles las siguientes piezas.
- Sensor mh-rd
- Placa de desarrollo ESP32, ESP8266, Wemos d1 mini o equivalente. Yo en este tutorial voy a utilizar la ESP32.
- Cables de conexión. Estos cables te los puedes fabricar tú mismo siguiendo este tutorial.
- Fuente de alimentación de 5V (Micro USB o Externa).
- Caja impermeable IP65.
Instalación mh-rd sensor de lluvia
Para instalar el firmware en el ESP32, le invito a seguir el procedimiento descrito en mí manual de Inicio de ESPHome.
Detección de lluvia
El sensor utilizado proviene de un kit de detección de lluvia que se encuentra fácilmente en línea cuya foto se muestra a continuación.
El kit tiene 1 entrada para el sensor, 1 potenciómetro para ajustar el umbral de sensibilidad, 2 Leds y 2 salidas: una analógica y otra digital.
Operación:
- Por defecto, cuando está seco, la resistencia es muy alta.
- Cuando el sensor detecta seco, cada 5 segundos, se toma una medida y se promedia, si el valor + el umbral de detección de lluvia es inferior a la última medida, entonces se considera lluvia (o nieve).
- Si la resistencia promedio del sensor menos el umbral de detección de secado supera el último valor leído, se considera que el sensor se está secando.
Hay muchas variables de configuración que le permiten configurarlo todo.
Nota: Para el caso de la nieve, los umbrales pueden NO ser los mismos. También sería posible configurar para distinguir la lluvia de la nieve, pero yo no lo voy a hacer ya que en mi ciudad no nieva prácticamente nunca (en 2023 hace 15 años que no cae ni un copo de nieve ☹).
Cableando del mh-rd sensor de lluvia con un ESP32
Sensor | ESP32 | Comentario |
---|---|---|
GND | GND | Negro |
VCC | VCC (3,3-5 V) | Rojo |
A0 (salida analógica) | Entrada analógica 0 (SN) | Verde |
D0 (salida digital) | Entrada digital (SP) | Naranja |
Esquema de cableando del mh-rd sensor de lluvia con un ESP32 wroom-32
Código para utilizar en ESPHome para el mh-rd sensor de lluvia
sensor:
- platform: adc
id: source_sensor
pin: GPIO39 #AO-SN
name: Intensidad de lluvia
attenuation: 11db
internal: False
# Es importante tener un intervalo de actualización bajo para que
# la medición tenga tiempo para hacerse correctamente durante
# la activación de la tensión
update_interval: 5s
filters:
- multiply: 0.846153 # 3.9 (11db attenuation full-scale voltage) -> 3.3V
- median:
window_size: 7
send_every: 4
send_first_at: 3
binary_sensor:
- platform: gpio
pin:
number: GPIO36 #DO-SP
inverted: true
name: "Sensor de lluvia ESPHome"
Tarjeta indicadora
Aprovechando el cambio de voltaje, creo una tarjeta indicadora que me muestre de forma gráfica la intensidad de lluvia. Al final del artículo, tienes el nuevo sensor de intensidad.
Código para crear esta tarjeta indicadora
type: gauge
min: 0
max: 4
entity: sensor.intensidad_de_lluvia
segments:
- from: '3.6'
color: green
lavel: Seco
- from: '2.5'
color: blue
- from: '1.5'
color: yellow
- from: '0'
color: red
needle: true
name: Intensidad de lluvia
¿Cuántos días hace que no llueve?
Vamos a ver cómo crear los sensores que nos den la fecha del último día y hora que llovió y así mismo del recuento de días que no llueve.
Código para pegar en el archivo configuration.yaml o en el templates.yaml si lo tienes creado
template:
- trigger:
- platform: state
entity_id: binary_sensor.sensor_de_lluvia_esphome
to: 'off'
from: 'on'
sensor:
- name: End of Last Rain
state: >
{{ now() }}
- sensor:
- name: Days Since Last Rain
state: >
{% if is_state('binary_sensor.sensor_de_lluvia_esphome', 'on') %}
0
{% else %}
{{ (now() - states('sensor.end_of_last_rain') | as_datetime).days }}
{% endif %}
Este sensor nos da la fecha del último día que llovió en un formato nada amigable. En base a este, voy a crear dos sensores uno que me dará solo la fecha del último día que llovió y el otro me dará la fecha y hora, pero en un formato más amigable. Si decides crear estos dos sensores, tienes que copiar este código en tu archivo sensors.yaml
- platform: template
sensors:
fecha_ultimo_dia_que_llovio:
friendly_name: Último día que llovió
value_template: "{{ as_timestamp(states('sensor.end_of_last_rain')) | timestamp_custom('%d-%m-%Y, %H:%M') }}"
icon_template: mdi:weather-rainy
- platform: template
sensors:
fecha_ultimo_dia_con_lluvia:
friendly_name: Último día con lluvia
value_template: "{{ as_timestamp(states('sensor.end_of_last_rain')) | timestamp_custom('%d-%m-%Y') }}"
icon_template: mdi:weather-rainy
Finalmente doy formato a estos dos sensores en el archivo customize.yaml
sensor.days_since_last_rain:
friendly_name: Días sin lluvia
device_class: moisture
sensor.fecha_ultimo_dia_que_llovio:
device_class: moisture
sensor.fecha_ultimo_dia_con_lluvia:
device_class: moisture
Sensor de intensidad de lluvia
Aprovechando el cambio de voltaje en la placa cuando llueve, creo este sensor que me marca la intensidad de lluvia de 0 a 10. En tu caso, tendrás que cambiar el sensor.intensidad_de_lluvia por el id de tu sensor.
- platform: template
sensors:
lluvia_intensidad:
friendly_name: "Intensidad de Lluvia"
unit_of_measurement: ""
value_template: "{{ ((3.73 - states('sensor.intensidad_de_lluvia')|float) / 3.73 * 10)|round(0) }}"
Tarjeta indicadora de intensidad de lluvia
type: gauge
entity: sensor.lluvia_intensidad
needle: true
severity:
green: 1
yellow: 4
red: 7
min: 0
max: 10