Controlador de riego inteligente con Arduino: Auto-riego con sensores climáticos y de luz
Componentes y materiales
| Arduino Nano R3 | × | 1 |
| Expansor de E/S (IO Expander) | × | 1 |
| Paquete de expansor de E/S | × | 1 |
Aplicaciones y servicios en línea
- Arduino IDE
Sobre este proyecto
Crear un controlador de riego inteligente con Arduino
Riegue su jardín de forma inteligente con ciclos de agua dinámicos. Deje de regar si llueve o ha lluvido desde el último riego. Utilice el sensor de luz para detectar el amanecer y ajustar automáticamente los horarios de inicio. Detenga el riego si hace demasiado frío.
Lista de características
- Sensor de temperatura exterior
- Sensor de lluvia exterior
- Sensor de luz exterior
- Reloj en tiempo real (RTC) con respaldo de batería para programación semanal
- Almacenamiento no volátil: nunca pierda un riego por corte de energía
- Detección de amanecer
- Riego inteligente que ahorra en la factura del agua
- Riego antes del amanecer para permitir tiempo de absorción
- Detiene el riego cuando hace demasiado frío
- Reduce el crecimiento de hongos
- Control de programación fácil

Componentes necesarios para construir el controlador
- Expansor de E/S (IO Expander)
- 2x Conversores 1-Wire a I2C
- Unión 1-Wire
- Conector óptico
- Divisor (Splitter)
- Arduino Nano
- Relé de 4 canales 5V DC
- Sensor de luz TSL2561
- Sensor de temperatura DS18B20 resistente al agua
- Sensor de nivel de agua por infrarrojo óptico
- Reloj de precisión DS3231 AT24C32 IIC
- Pantalla OLED I2C SSD1306 128x64
- Caja estanca plástica transparente 200x120x75mm
- Caja estanca plástica transparente 100x68x50mm
- Prensaestopas IP68 PG7 de nailon
- Prensaestopas IP68 PG11 de nailon
- Jack keystone RJ11 de tornillo
- Cable RJ11 4C4P de 50 pies
- Cable RJ11 4C4P de 6 pies
- Cable de header 2.54mm
- 2x Microinterruptores pulsadores SPST momentáneos de 2 pines
- Fuente de alimentación 12VDC 1A de pared
Diagrama de cableado

Pantalla OLED

Presione el botón Menú para mostrar el menú y continúe presionando para recorrer todas las opciones. El menú se oculta automáticamente tras 30 segundos de inactividad. Presione el botón Seleccionar para ejecutar la función deseada.
¿Por qué usar el expansor de E/S?
- Diseño más simple
- Componentes estándar
- No requiere escribir driver 1-Wire
- No requiere driver DS3231 RTC
- No requiere driver EEPROM
- No requiere driver de pantalla OLED
- No ocupa espacio de código con fuentes de display
- No requiere driver de sensor de temperatura
- No requiere driver de sensor de lluvia óptico
- Ahorra espacio en Arduino: solo 12710 bytes (39%)
- Código escrito en solo tres días
- Cableado fácil con cable telefónico RJ11 estándar
- Sin problemas de longitud de cable de sensores
- Más barato que sistemas comerciales similares
- Fácil de modificar para requisitos individuales
- Fuente de alimentación única
Construir el sistema
Conecte el Arduino Nano al expansor de E/S y prográmelo con el siguiente código. El header de 6 pines es el puerto de depuración serial por software y no es necesario en la instalación final.

Asegúrese de cambiar las direcciones ONEWIRE_TO_I2C_ROM1 y ONEWIRE_TO_I2C_ROM2 definidas para que coincidan con la dirección de sus conversores 1-Wire a I2C.
Código principal (C/C++)
/* Sketch optimizado para IO Expander
* Sistema de Riego v1.1 */
#include <math.h>
#include <time.h>
#include <util/crc16.h>
#include <avr/wdt.h>
#include <SoftwareSerial.h>
#include "IOExpander.h"
#define FAHRENHEIT
#define INIT_BOARD "g5w1;g11w1;g11d0,75;g12w1;g12d0,75;rsf"
#define ONEWIRE_TO_I2C_ROM1 "i4scc"
#define ONEWIRE_TO_I2C_ROM2 "i6s8f"
#define ONEWIRE_TEMPERATURE "t6s0300"
#define RTC_SENSOR "s4te"
#define I2C_EEPROM "s4tf"
#define I2C_OLED "s4t10"
#define I2C_LIGHT "s3t9;sc0"
#define OPTICAL_SENSOR "g5a"
#define BUTTON1 "g11d"
#define BUTTON2 "g12d"
#define WATER_TIME_BEFORE_SUNRISE 60
#define SUNRISE_LUX 100
#define RAIN_DETECT_LEVEL 4.0
#define DO_NOT_WATER_TEMP 4.4444 // 40°F
#define MAX_ZONES 4
// ... constantes de tiempo y días ...
ZONE zone[] = {
{"Front Right", RELAY1},
{"Front Left", RELAY2},
{"Bushes", RELAY3},
{"Left Side", RELAY4},
};
SCHEDULE schedule[] = {
{ZONE1, SUNRISE | EVERYDAY, -1, 0, 4},
{ZONE2, EVERYDAY, 6, 15, 5},
{ZONE3, EVERYDAY, 6, 0, 10},
{ZONE4, EVERYDAY, 6, 10, 6},
};
// ... funciones principales: NextScheduleTime, StartScheduleTime, WaterScheduleTime ...
// ... setup() y loop() con lógica completa de control ...
Nota: Si usa el puerto USB para programar el Arduino Nano, debe desconectarlo del expansor de E/S ya que usa el mismo puerto serial. Para depuración, use el puerto ICSP para programar el ATmega328P. Para habilitar el puerto de depuración por software, descomente la definición SERIAL_DEBUG.
El divisor debe configurarse primero para aislar la línea de datos del sensor infrarrojo óptico de la línea del sensor remoto 1-Wire. Suelde un resistor de 0 ohmios 0603 en R2.

Perfore un agujero de 7/16" en la caja pequeña y 11/16" en la grande en el lado derecho para los prensaestopas PG7 y PG11. Use una herramienta Dremel para agrandar ligeramente hasta que encajen. El PG7 alimentará los sensores remotos y el PG11 los cables de 12VDC, 24VAC, colectores y cable RJ11 de sensores remotos.

Conecte los microinterruptores SPST momentáneos al jack RJ11. Use termorretráctil para aislar los contactos.

Conecte todos los cables y ensamble/alimente todas las partes en la caja grande. El cable RJ11 de 50 pies para sensores remotos debe pasar por el prensaestopas PG11 sin necesidad de cortarlo.

Perfore un agujero de 9/16" en la parte superior de la caja pequeña para el sensor de agua infrarrojo óptico. La caja remota es un ajuste apretado, pero si los componentes se colocan en la orientación recomendada debería encajar. Hacer los cables RJ11 lo más cortos posible ayuda. Se recomienda añadir pegamento marino en la arandela del prensaestopas antes de apretar la tuerca para mejor sellado.

Instale la caja de sensores remotos en el exterior y móntela elevada en el lado este de su casa con el sensor infrarrojo óptico y el sensor de luz apuntando al cielo sin obstrucciones.

Perfore agujeros de 1/4" en la parte superior, media e inferior de la caja grande y monte los botones.

Pruebe el sistema y verifique que todo funciona correctamente. Para probar relés y sensores, desconecte el Arduino del expansor y conéctelo directamente a la PC para control manual. Una vez verificado, ensamble todo en la caja usando cinta de doble cara y espuma de embalaje para asegurar las placas, y disfrute de los beneficios y ahorro de su controlador de riego inteligente.
Vídeo en funcionamiento
Actualización 12/09/2019
Versión v1.1 que corrige un problema de inicio si el sistema perdió energía por varios días.
Actualización 02/10/2019
Al conectar el 1-Wire a I2C al DS3231 y luego a la pantalla SSD1306 OLED, tendrá tres pull-ups diferentes en las líneas SDA y SCL. Esto resulta en un pull-up efectivo de 4.7k/3 = 1.56k que puede ser demasiado fuerte y causar corrupciones aleatorias en pantalla.

Como el DS3231 usa un array de resistencias compartido, elimine los otros pull-ups:
- 1-Wire a I2C: R3 y R4
- SSD1306 OLED: R6 y R7
Proceso de manufactura
- Construya un Controlador Domótico 433 MHz con Sensorflare y Raspberry Pi
- Monitor de temperatura casero con Raspberry Pi, MCP9808, InfluxDB y Grafana
- Papelera Inteligente: Solución IoT Celular para Gestión Automatizada de Residuos
- Barman Inteligente: Construye tu Propia Estación de Cócteles con Raspberry Pi
- Sensor de Emociones y EEG: Hardware de Bajo Coste para Detección de Emociones en Tiempo Real
- Controlador de Riego Inteligente con Windows 10 IoT, Raspberry Pi y Sensores de Humedad XBee
- Revolucionando la producción de sensores: Sensata usa mecatrónica inteligente
- Construyendo sistemas de agricultura inteligente open-source: empoderando agricultores con IoT asequible e interoperable
- ECM3532: Primera placa sensor IA integrada ultra-bajo consumo de Eta Compute acelera desarrollo edge
- Sensor de Deformación Ultra-Sensible y Duradero Revoluciona Textiles Inteligentes
- Sensor Ultra-Fino Revolucionario Mejora la Funcionalidad de Lentes de Contacto Inteligentes