Skip to Content

Sistema automático de riego para plantas con Arduino IoT Cloud

Sistema automático de riego para plantas con Arduino IoT Cloud

En este proyecto, aprenderás a crear un sistema automático de riego interior con el Arduino IoT Cloud. Este sistema te permite monitorear y regar tus plantas desde cualquier lugar del mundo y es una excelente introducción al internet de las cosas.

He incluido instrucciones de montaje, una guía para empezar con Arduino IoT Cloud y todo el código necesario. Este proyecto utiliza una placa Arduino MKR1000 IoT, un sensor capacitivo de humedad del suelo, sensor de temperatura y humedad, LCD I2C y una bomba de agua. También es posible hacer este proyecto con un Arduino normal (sin conexión a internet).

Ten en cuenta que esto es principalmente una prueba de concepto, es decir, construir este sistema para una sola planta es bastante caro y probablemente no tenga mucho sentido. Sin embargo, ahora que sé cómo funciona todo, puedo ampliar fácilmente el sistema y añadir más funciones en el futuro.

Si tienes alguna pregunta o sugerencia, por favor deja un comentario abajo.

Para más información sobre algunos de los componentes usados en este proyecto, consulta los tutoriales a continuación:

Materiales

Componentes de hardware

arduino-mkr1000Arduino MKR1000 × 1 Amazon
arduino-mkr-relay-proto-shieldArduino MKR Relay Proto Shield × 1 Arduino
Capacitive soil moisture sensor × 1 Amazon
AM2301-temperature-humidity-sensorAM2301A (DHT21) temperature and humidity sensor × 1 Amazon
LCD20×4 character I2C LCD × 1 Amazon
Mini submersible pump × 1 Amazon
PVC tube 6 x 9 mm 1 m Amazon
IKEA container with lid × 1 IKEA
Project box 120 x 80 x 50 mm × 1 Amazon

Ten en cuenta que también puedes usar cualquiera de las otras placas Arduino IoT con conectividad Wi-Fi, como el Arduino MKR WiFi 1010 o el más económico Arduino Nano 33 IoT. La ventaja de las placas MKR es que encajan en el Arduino MKR Relay Proto Shield, lo que facilita mucho el cableado.

Para el tanque de agua, puedes usar cualquier recipiente que tengas a mano (yo usé un contenedor de almacenamiento de alimentos de IKEA de mi cocina).

Aplicaciones y servicios en línea

arduino-web-editorArduino Web Editor
arduino-iot-cloudArduino IoT Cloud

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Montaje del sistema

Todos los componentes están conectados a una caja central del proyecto que está montada en la tapa del contenedor IKEA.

Caja del proyecto montada en la tapa del contenedor IKEA

Para montar el Arduino MKR Relay Proto Shield, imprimí en 3D una placa adaptadora simple. Un pequeño agujero en el lateral de la caja del proyecto da acceso al puerto micro USB del MKR1000, que se usa para alimentar el sistema y programar la placa.

3d printed adapter plate
Placa adaptadora impresa en 3D

Sensor de humedad del suelo

Para este proyecto, usé un capacitive soil moisture sensor con salida analógica. Los sensores capacitivos tienen mejor resistencia a la corrosión que los resistivos, pero no son 100% impermeables. Al estar hechos de una PCB estándar con un sustrato compuesto, el agua puede entrar fácilmente por los bordes de la PCB. La electrónica en la parte superior del sensor tampoco está protegida contra el agua.

Para hacer el sensor un poco más impermeable, cubrí los bordes y la electrónica con esmalte de uñas transparente. Un recubrimiento conformal real probablemente sea mejor, pero el esmalte funciona bastante bien como alternativa económica.

nail polish
Cubrí los bordes del sensor y la electrónica con esmalte de uñas transparente

El cable que venía con el sensor era bastante corto, así que hice uno nuevo. También puedes simplemente soldar cables más largos al cable original.

longer cable
Cable nuevo para el sensor de humedad del suelo

Conexión del sensor de humedad del suelo al Arduino MKR1000

La tabla a continuación muestra las conexiones que debes hacer.

Sensor de humedad del suelo Arduino MKR1000
GND GND
VCC 3.3 V
AOUT A2

Bomba y shield de relés

pump
Bomba sumergible mini

Para regar las plantas, usé una small submersible pump que puede alimentarse con 3.3 V. La bomba se controla con el relé 1 del Arduino MKR Relay Proto Shield. Como la bomba consume solo alrededor de 200 mA, puede alimentarse directamente desde la salida de 3.3 V del MKR1000.

Si quieres usar una bomba más grande, debes usar una fuente de alimentación externa. Asegúrate de que la corriente de la bomba esté dentro de las especificaciones de los relés.

arduino mkr relay proto shield
Arduino MKR Relay Proto Shield (Fuente: Arduino.cc)

El cable negro de la bomba está conectado a tierra. El cable rojo va al lado NO (normalmente abierto) del relé. COM está conectado a la salida de 3.3 V del MKR1000. Ten en cuenta que este 3.3 V está disponible en uno de los terminales de tornillo del Proto Shield.

Sensor de temperatura y humedad

temperature and humidity sensor
Sensor de temperatura y humedad montado en el lateral de la caja del proyecto

Aunque no es estrictamente necesario para regar automáticamente las plantas, pensé que un sensor de temperatura y humedad sería un buen añadido al sistema. Para este proyecto, usé un AM2301A sensor que viene en una carcasa con los cables ya conectados. Este sensor es fabricado por ASAIR, que también fabrica los populares sensores DHT11 y DHT22.

Para más información sobre sensores de temperatura y humedad DHT, consulta el tutorial a continuación:

Conexión del sensor de temperatura y humedad AM2301A

La tabla a continuación muestra las conexiones que debes hacer.

Sensor de temperatura y humedad AM2301A Arduino MKR1000
Negro GND
Rojo 3.3 V
Amarillo A1

Monté el sensor en el lateral de la caja del proyecto. Ten en cuenta que hice un pequeño agujero en la caja y en la parte trasera del sensor para pasar los cables.

temperature and humidity sensor connection
Los cables pasan por la parte trasera del sensor

LCD I2C

Además de Arduino IoT Cloud, los datos de los sensores también se muestran en el LCD I2C 20×4 montado en la tapa de la caja del proyecto.

LCD I2C de 20×4 caracteres montado en la tapa de la caja del proyecto

Corté una abertura en la caja del proyecto usando my homemade CNC router, pero también podrías usar una sierra de calar o incluso un cúter afilado.

i2c lcd back
El LCD está fijado con cuatro tornillos a través de los orificios de montaje en la PCB

El LCD normalmente se alimenta con 5 V, pero parece funcionar bien a 3.3 V. Gracias al módulo I2C montado en la parte trasera del LCD, solo necesitas conectar dos cables, SDA y SCL, al MKR1000. Las conexiones están disponibles en los terminales de tornillo del shield, por lo que el cableado de la pantalla es muy sencillo.

Conexiones del LCD I2C

LCD I2C de 20×4 caracteres Arduino MKR1000
GND GND
VCC 3.3 V
SDA SDA
SCL SCL

He escrito un tutorial detallado sobre el uso de LCDs I2C con Arduino que puedes encontrar aquí:

Una nota sobre el cableado

Como habrás visto, todos los sensores, el LCD y la bomba necesitan conectarse a 3.3 V y GND. El Arduino MKR Relay Proto Shield solo tiene una salida de alimentación y meter todos los cables en un solo terminal de tornillo no es buena idea. En su lugar, puedes usar algo como Wago lever nuts como punto de distribución de energía.

wago lever nuts
Conectores de palanca Wago

La manguera de agua

Inicialmente, planeé simplemente meter el extremo del tubo de PVC en algún lugar del centro de la maceta. Sin embargo, descubrí que esto dejaba una parte de la maceta empapada y el resto completamente seco.

Mi solución fue perforar muchos agujeros pequeños (1 mm) espaciados aproximadamente 2 cm en los últimos 30 – 40 cm del tubo. Imprimí en 3D un tapón para el extremo del tubo y algunos soportes para clavar en la tierra.

Puedes descargar los archivos STL aquí si quieres imprimir los tuyos:

tube with plug holes and holders
Soportes y tapón impresos en 3D

Esto parece funcionar bastante bien para humedecer la tierra de manera uniforme.

Manguera de agua instalada

Primeros pasos con Arduino IoT Cloud

En la siguiente sección, explicaré cómo empezar con Arduino IoT Cloud.

El primer paso es ir a https://create.arduino.cc/. En esta página web encontrarás el Editor Web, una guía para empezar, el Gestor de Dispositivos y un enlace a Arduino IoT Cloud.

arduino create dashboard
Panel de control de Arduino Create

Instalación del plugin Arduino Create

Hay varias formas de configurar una nueva placa, pero encuentro más fácil hacerlo a través de la página Getting Started. Haz clic en el icono Getting Started y desplázate hasta el final de la página donde dice Install Arduino Create Plugin. Este plugin te permite subir sketches desde el Editor Web de Arduino a tu placa o dispositivo.

getting started arduino create agent 1
Descarga e instala el plugin Arduino Create

Después de hacer clic en el icono Arduino Create Plugin al final de la página, haz clic en start, descarga e instala el plugin. El asistente de configuración comprobará si has instalado el plugin correctamente. Si es así, deberías ver la página siguiente.

getting started arduino create agent 4
Deberías ver esta página tras instalar el plugin Arduino Create

Configuración de una placa IoT

Ahora vuelve a la página Getting Started haciendo clic en el icono en la parte superior. El siguiente paso es configurar una nueva placa IoT. Para este proyecto, usé el Arduino MKR1000. Si no sabes el nombre de tu placa, puedes hacer clic en el icono Autodetect Arduino Board.

Selecciona el Arduino MKR1000

Se abrirá el asistente de configuración IoT que te guiará para configurar y probar la placa.

getting started mkr1000 iot configuration
Asistente de configuración IoT MKR1000

Haz clic en start y conecta la placa a tu ordenador con un cable USB. Si instalaste el plugin Arduino Create correctamente, el ordenador debería detectar tu dispositivo.

getting started mkr1000 iot configuration 1
Conecta el MKR1000 a tu ordenador con un cable USB y espera a que la placa esté disponible

Luego, ponle un nombre a tu placa. Yo simplemente la llamé MKR1000_1. Asegúrate de usar un nombre fácil de reconocer, especialmente si usas varias placas para diferentes proyectos.

getting started mkr1000 iot configuration name
Introduce un nombre para tu placa

Después, se debe configurar el chip criptográfico del MKR1000, lo que puede tardar hasta 5 minutos. Cada MKR1000 está equipado con un  Microchip ECC508 crypto chip. Este chip se usa para almacenar de forma segura la identidad de tu placa cuando está vinculada a tu cuenta de Arduino.

Configurando el chip criptográfico

Luego, puedes subir un sketch de ejemplo que te permitirá probar la funcionalidad de la placa y encender y apagar el LED integrado mediante el Monitor de Red. En la pestaña Secret del sketch, debes introducir el nombre y la contraseña de tu red wifi local.

Sube el sketch de ejemplo tras introducir tus datos wifi en la pestaña Secret

En la página siguiente, haz clic en el carácter LED para encender y apagar el LED integrado.

Haz clic en el carácter LED o escribe ON u OFF y haz clic en ‘SEND’

Si todo fue bien, deberías ver la página siguiente.

Creando un nuevo Thing

Tras configurar un nuevo dispositivo IoT, puedes volver al panel de Arduino Create y hacer clic en el icono Arduino IoT Cloud.

arduino iot cloud icon
Panel de Arduino Create con el icono Arduino IoT Cloud resaltado

Al hacer clic en este icono, se abrirá la página «Your Things» de Arduino IoT Cloud. En esta página puedes crear nuevos Things, que es como Arduino llama a los dispositivos que puedes conectar a internet. En nuestro caso, el Thing representa la placa Arduino MKR1000 con varios sensores conectados. Cada Thing puede tener múltiples propiedades como temperatura, estado de un LED, coordenadas GPS, etc.

En la versión gratuita de IoT Cloud, solo puedes crear un Thing con hasta cinco propiedades. Si quieres más, debes actualizar al plan de pago de Arduino Cloud. Como este proyecto usa solo un Thing con menos de cinco propiedades, la versión gratuita funciona perfectamente.

create new thing
Página Your Things

Haz clic en ADD NEW THING y ponle un nombre. Yo lo llamé Automatic_indoor_garden. Selecciona la placa MKR1000 que acabamos de configurar en el menú desplegable (MKR1000_1).

Introduce un nombre para tu Thing y selecciona un dispositivo para asociarlo

Ahora serás redirigido a una página donde puedes añadir propiedades a tu Thing.

add property
Página de propiedades del Thing

Añadiendo propiedades

Para este proyecto, añadí tres propiedades diferentes: temperatura, humedad y contenido de humedad del suelo. Las propiedades representan variables en el código Arduino y también son legibles en la nube. Tras crear las propiedades y subir el código, podrás verlas en el panel de tu Thing.

Añadir propiedades es muy fácil haciendo clic en ADD PROPERTY. Ten en cuenta que debes repetir este proceso tres veces.

Para cada propiedad debes configurar los siguientes parámetros:

  • Nombre – el nombre que se mostrará en la lista de propiedades y en el widget.
  • Nombre de variable – el nombre de la variable que usarás en tu Sketch para referenciar esta propiedad. No puede incluir caracteres especiales.
  • Tipo – selecciona el tipo correcto de propiedad. Añade el mínimo y máximo para mediciones numéricas, para que el widget se dibuje correctamente.
  • Permiso
    • Lectura y escritura : la propiedad puede ser tanto configurada como mostrada en el panel de Arduino IoT Cloud.
    • Solo lectura : la propiedad se enviará a Arduino IoT Cloud y estará disponible en tu panel.
  • Actualización
    • Cuando el valor cambia : la propiedad se enviará a Arduino IoT Cloud cada vez que el cambio de valor sea mayor o igual al delta.
    • Regularmente : la propiedad se enviará a Arduino IoT Cloud cada vez que transcurra el número especificado de segundos.
  • Historial – Muestra una visualización de datos históricos para la propiedad.

En la imagen siguiente puedes ver los parámetros que usé para la propiedad Temperatura. Ten en cuenta que puedes seleccionar uno de los muchos tipos de propiedad integrados como Temperatura (Celsius) o crear uno personalizado.

add new property window
Captura de pantalla de la propiedad Temperatura

Puedes encontrar los parámetros para las otras propiedades en la tabla a continuación

Parámetros de propiedades del Thing

Nombre Variable
Nombre
Tipo Permiso Actualización
Temperatura temperature Temperatura (Celsius)
-20 °C – 60 °C
RO Cada 10 s
Humedad humidity Humedad relativa (Porcentaje)
0 RH – 100 RH
RO Cada 10 s
Contenido de humedad del suelo soilMoistureContent Float
0 – 100
RO Cada 1 s

Al seleccionar mostrar visualización de historial, puedes registrar los valores de tus propiedades durante un período y guardarlos como gráficos. Desafortunadamente, solo puedes guardar los datos por 1 día en la versión gratuita de Arduino IoT Cloud.

automatic indoor garden thing properties
Pestaña de propiedades

Después de añadir todas las propiedades, haz clic en EDIT SKETCH. Esto abrirá el Editor Web de Arduino.

Crear sketch

Tras hacer clic en EDIT SKETCH, verás que se ha creado automáticamente un nuevo sketch.

Editor con sketch auto-generado

Ten en cuenta que el sketch tiene el mismo nombre que nuestro Thing más la fecha de creación. Además de este archivo .ino, verás tres archivos más:

ReadMe.adoc : este es un archivo de texto plano donde puedes añadir información sobre el autor y el proyecto.

thingProperties.h : este archivo es generado automáticamente por Arduino IoT Cloud cuando añades propiedades a tu Thing. En general, no deberías editar el código en este archivo tú mismo. Se actualiza automáticamente cuando cambias las propiedades del Thing en el panel.

Por favor, consulta la IoT Cloud – Getting Started página en Arduino Project Hub para una explicación más detallada sobre las diferentes funciones en thingProperties.h.

thingproperties
thingProperties.h

Secret: esta pestaña te permite rellenar las credenciales de tu red. SECRET_SSID y SECRET_PASS son el nombre y la contraseña de la red wifi a la que se conectará el MKR1000. Tras rellenar estos datos, haz clic en guardar.

Pestaña Secret

Código Arduino

Los archivos auto-generados facilitan mucho empezar con IoT Cloud, pero claro, aún necesitas escribir algo de código tú mismo.

En el sketch principal, no en thingProperties.h, añadí código que lee los sensores, controla la bomba de agua y muestra información en el LCD I2C de caracteres.

Puedes reemplazar el código en el sketch principal con el código siguiente. Conecta la placa MKR1000 a tu ordenador si no lo has hecho y sube el código haciendo clic en el botón de subir (flecha derecha en la parte superior). Recomiendo desconectar la bomba por ahora y dejar solo los sensores instalados.

A continuación, explicaré cómo funciona el código y te mostraré cómo puedes cambiar varios parámetros tú mismo.

Puedes copiar el código haciendo clic en el botón en la esquina superior derecha del campo de código.

/*
  Sketch for automatic indoor garden project. More info: https://www.makerguides.com

  Arduino IoT Cloud Properties description

  The following variables are automatically generated and updated when changes are made to the Thing properties

  float soilMoistureContent;
  float humidity;
  float temperature;

  Properties which are marked as READ/WRITE in the Cloud Thing will also have functions
  which are called when their values are changed from the Dashboard.
  These functions are generated with the Thing and added at the end of this sketch.
*/

#include "thingProperties.h"
#include "DHT.h"
#include "LiquidCrystal_I2C.h"

#define DHTPIN A1
#define DHTTYPE DHT21

#define RELAYPIN 1
#define SOILPIN A2

DHT dht = DHT(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);

const unsigned long pumpPeriod = 20000;
const unsigned long waitPeriod = 120000;
unsigned long previousMillis;
float moistureSensorData;

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500);

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);

  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
  */
  setDebugMessageLevel(4);
  ArduinoCloud.printDebugInfo();

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(RELAYPIN, OUTPUT);

  dht.begin();

  lcd.init();
  lcd.backlight();
}

void loop() {
  ArduinoCloud.update();

  // Your code here
  temperature = dht.readTemperature();
  humidity = dht.readHumidity();

  lcd.setCursor(0, 0);
  lcd.print("Temperature:");
  lcd.setCursor(13, 0);
  lcd.print(temperature);
  lcd.print("\xDf" "C");
  lcd.setCursor(0, 1);
  lcd.print("Humidity:");
  lcd.setCursor(10, 1);
  lcd.print(humidity);
  lcd.print("%");

  moistureSensorData = analogRead(SOILPIN);
  //Serial.println(moistureSensorData);
  soilMoistureContent = map(moistureSensorData, 883, 469, 0, 100);
  soilMoistureContent = constrain(soilMoistureContent, 0, 100);
  lcd.setCursor(0, 2);
  lcd.print("Soil moisture:");
  lcd.setCursor(15, 2);
  lcd.print(soilMoistureContent, 0);
  lcd.print("%  ");

  if (soilMoistureContent <= 30 && millis() - previousMillis >= waitPeriod) {
    digitalWrite(RELAYPIN, HIGH);
    digitalWrite(LED_BUILTIN, HIGH);
    delay(pumpPeriod);
    digitalWrite(RELAYPIN, LOW);
    digitalWrite(LED_BUILTIN, LOW);

    previousMillis = millis();
  }
}

Cómo funciona el código

En la sección loop del código, la temperatura y humedad se leen con dht.readTemperature() y dht.readHumidity() respectivamente. Las variables temperature y humidity fueron añadidas automáticamente en thingProperties.h y sus valores se enviarán a la nube cada 10 segundos.

La siguiente sección del código imprime los valores en el LCD I2C.

  lcd.setCursor(0, 0);
  lcd.print("Temperature:");
  lcd.setCursor(13, 0);
  lcd.print(temperature);
  lcd.print("\xDf" "C");
  lcd.setCursor(0, 1);
  lcd.print("Humidity:");
  lcd.setCursor(10, 1);
  lcd.print(humidity);
  lcd.print("%");

Luego, se lee la salida analógica del sensor de humedad del suelo con analogRead(). Este valor se escala entre 0 y 100 % de humedad. Para calibrar el sensor, puedes imprimir los datos en el Monitor Serial. El valor 833 corresponde al valor que obtuve al sostener el sensor en el aire y 469 cuando lo metí en un vaso con agua.

  moistureSensorData = analogRead(SOILPIN);
  //Serial.println(moistureSensorData);
  soilMoistureContent = map(moistureSensorData, 883, 469, 0, 100);
  soilMoistureContent = constrain(soilMoistureContent, 0, 100);
  lcd.setCursor(0, 2);
  lcd.print("Soil moisture:");
  lcd.setCursor(15, 2);
  lcd.print(soilMoistureContent, 0);
  lcd.print("%  ");

En la última sección del código, compruebo si el contenido de humedad del suelo está por debajo del 30 % y, si es así, se riegan las plantas durante un tiempo establecido. Añadí un período mínimo de espera entre ciclos de riego para dar tiempo a que la tierra absorba el agua.

  if (soilMoistureContent <= 30 && millis() - previousMillis >= waitPeriod) {
    digitalWrite(RELAYPIN, HIGH);
    digitalWrite(LED_BUILTIN, HIGH);
    delay(pumpPeriod);
    digitalWrite(RELAYPIN, LOW);
    digitalWrite(LED_BUILTIN, LOW);

    previousMillis = millis();
  }

Probablemente tendrás que ajustar los parámetros pumpPeriod y waitPeriod al principio del código para adaptarlos a tu configuración particular.

Crear un panel de control

Tras subir el código, haz clic en GO TO IOT CLOUD. Ahora haz clic en Dashboards en la parte superior.

arduino iot cloud dashboards
Paneles de Arduino IoT Cloud

Cuando estés en esta página, haz clic en create dashboard. Puedes añadir widgets a tu panel para mostrar valores, gráficos, etc.

arduino iot cloud dashboard add widget
Añadir un widget de valor

Haz clic en el widget y selecciona Link Property

arduino iot cloud value
Haz clic en Link Property

Ahora selecciona qué propiedad quieres mostrar.

Vincular una propiedad de nuestro Thing

Tras añadir varios widgets, tu panel debería verse algo así:

Panel con valores y gráficos

Conclusión

En este artículo, te he mostrado cómo crear un sistema simple de riego automático con el MKR1000 y Arduino IoT Cloud. Espero que este tutorial te haya sido útil y te inspire.

En la configuración actual, Arduino IoT Cloud solo se usa para mostrar y registrar los datos de los sensores. Por lo tanto, también podrías hacer esto como un sistema independiente con un Arduino Uno o similar. Personalmente, solo quería experimentar con Arduino IoT Cloud y ver lo difícil que era configurarlo. Fue mucho más fácil de lo que pensaba y definitivamente lo usaré para otros proyectos en el futuro.

He estado usando este sistema por un tiempo corto y parece funcionar muy bien. Reportaré resultados en un mes aproximadamente, una vez que lo haya probado más tiempo.

Una cosa que podría añadir en el futuro es un interruptor de nivel de agua para el tanque y conectarlo a un sistema de alertas por correo electrónico. Me temo que olvidaré rellenar el tanque ahora que no tengo que preocuparme por regar las plantas…

Si tienes alguna pregunta o sugerencia, por favor deja un comentario abajo.