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
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
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.

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.

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.

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.

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

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.

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

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.

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.

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.

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.
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:

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

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.

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.

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.

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.

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

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.

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.

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.

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.

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

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.

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.

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).

Ahora serás redirigido a una página donde puedes añadir propiedades a tu 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.

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.

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.

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.

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.

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.

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.

Haz clic en el widget y selecciona Link Property

Ahora selecciona qué propiedad quieres mostrar.

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

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.


