¿Tienes el pulgar verde? Si es así, este tutorial será esencial en tu próximo intento de cultivar plantas saludables. Y si eres como yo, los cambios de temperatura, demasiada agua, muy poca agua y estos efectos en el suelo son batallas que tus plantas tienen que luchar, a diario, y aparentemente solas. Con la llegada y creciente adopción de sistemas de monitoreo IoT, la lucha por la vida de las plantas puede convertirse en un segundo pensamiento, ya que este Sistema de Monitoreo de Invernadero con Alarma Inteligente está diseñado para ayudarte a cultivar tus hierbas, flores o malas hierbas favoritas, produciendo más, haciendo menos, pero “menos” inteligentemente!
Este sistema de monitoreo de plantas existe con un diseño y configuración amigables para el usuario e incorporará registros históricos con la Plataforma de Desarrollo de Aplicaciones IoT de Ubidots.
Como otros sistemas de monitoreo que solo envían y reciben datos a varias nubes, este sistema contará con un panel de control basado en la web fácil de construir y fácil de usar, con notificaciones de alarma inteligentes programables basadas en la salud de tus plantas. El sistema de alarma inteligente en este tutorial utilizará un Buzzer para notificar al horticultor cuando la humedad de las plantas haya superado un rango de saturación deseado. Este sistema de alarma inteligente le dará a tus plantas una voz para alertarte cuando tengan sed o si se están ahogando.
Ahora, comencemos...
Requisitos
Sensor de Temperatura/Humedad del Suelo (SHT10)
Paso a Paso
1. Configuración de Hardware
2. Configuración de Firmware
3. Configuración de Ubidots
4. Resumen
1. Configuración de Hardware
1. Comienza conectando tu NodeMCU ESP8266 a la Base NodeMCU.
2. Conecta el dispositivo ensamblado (mostrado arriba) con el cable micro USB al puerto USB de tu computadora para comenzar a configurar el dispositivo.
Cableado y Encaso del Sensor
Sensor de Temperatura/Humedad del Suelo – SHT10
Este sensor digital funciona con lógica de 3 o 5V y cualquier código SHT-1X para un microcontrolador funcionará. El sensor incluye una extensión de 1 metro de largo y tiene cuatro cables: Rojo = VCC (3-5VDC), Negro o Verde = Tierra, Amarillo = Reloj, Azul = Datos.
Configuración de cables - necesitarás conectar la resistencia de 10K desde el cable de Datos Azul al cable VCC Rojo. Esto asegura que la línea de datos esté en un nivel lógico definido y limita la interferencia del ruido eléctrico.
Ensamblaje de la placa - Siguiendo la tabla a continuación, haz las conexiones correctas con los cables jumper entre el SHT10 y la base NodeMCU. Recuerda que tus cables Rojo y Azul estarán conectados a través de la resistencia.
2. Sensor de Luz
Este sensor analógico/digital funciona con lógica de 3v y tiene 4 pines de salida – VCC+, GND, A0 (Pin Analógico), D0 (Pin Digital).
Siguiendo la tabla a continuación para hacer las conexiones correctas con los cables jumper entre el Sensor de Luz y la base NodeMCU. Para este proyecto se está utilizando el pin analógico (A0) y el pin digital (D0) está suspendido.
3. Buzzer
Este sensor funciona con lógica de 3v y tiene tres pines: VCC, GND, I/O (Pin de Datos).
Siguiendo la tabla a continuación para hacer las conexiones correctas con los cables jumper entre el Buzzer y la base NodeMCU.
Después de que cada sensor esté correctamente conectado a la base NodeMCU, ensambla todos los componentes/cables del dispositivo en una caja protectora. El dispositivo final para este proyecto, sin la cubierta protectora transparente, se ve como sigue:
2. Configuración de Firmware
El NodeMCU con el chipset ESP8266 utiliza el entorno de Arduino para programar y gestionar el firmware. Si aún no tienes la Arduino IDE más reciente instalada, por favor descarga e instala Arduino en tu computadora antes de comenzar la siguiente configuración de Firmware.
1. Comenzaremos nuestra configuración de firmware agregando las propiedades del paquete ESP8266 al Arduino IDE. Abre el Arduino IDE y selecciona Archivo > Preferencias e ingresa http://arduino.esp8266.com/stable/package_esp8266com_index.json en el campo de URLs Adicionales del Gestor de Placas.
NOTA IMPORTANTE:
Los usuarios de MAC deben instalar y cargar este controlador a su dispositivo NodeMCU.
Los usuarios de Windows deben instalar y cargar este controlador a su dispositivo NodeMCU.
2. A continuación, instalaremos los módulos de placa ESP8266 en el Arduino IDE. Desde la barra de herramientas, selecciona Placa > Gestor de Placas e instala la plataforma ESP8266 de la Comunidad ESP8266. Para encontrar los módulos correctos, busca “ESP8266” en la barra de búsqueda.
3. Cuando lo encuentres, instala ESP8266, si no está ya instalado, y luego cierra.
4. Con los módulos ESP8266 instalados en el IDE, se listará una variedad de placas en el gestor de placas para elegir. Reabre la barra de herramientas y busca la placa NodeMCU 1.0 (módulo ESP-12E).
5. Además, para mantener todo funcionando rápido y sin problemas, asegúrate de que la velocidad de carga esté optimizada a 115200. Ve a Herramientas > Velocidad de Carga > 115200:
6. A continuación, utilizaremos MQTT para comunicar los datos de nuestras plantas con Ubidots. Para asegurar la comunicación de datos, descarga la Biblioteca Ubidots MQTT ESP y haz clic en el botón verde "Clonar o descargar" para comenzar el proceso de "Descargar ZIP".
7. Mientras estés en Github, también descarga la biblioteca SH1X para permitir que los sensores y la placa NodeMCU se entiendan entre sí. Haz clic aquí para acceder al github de SH1X y selecciona el botón verde llamado "Clonar o descargar" y selecciona "Descargar ZIP".
Nota: La biblioteca SH1X es una biblioteca general que funciona con todas las placas soportadas por el Arduino IDE y no solo con la placa NodeMCU.
8. Con las bibliotecas .ZIP descargadas en tu computadora, volvamos al Arduino IDE y agreguemos las bibliotecas al hardware. Con tu Arduino IDE abierto, selecciona sketch > Incluir Biblioteca > Agregar Biblioteca .ZIP.
9. Selecciona el archivo .ZIP de UbidotsMQTTESP y luego “Aceptar” o “Elegir”.
10. Repite el Paso 8 anterior, esta vez agrega el archivo .ZIP de SH1X Master y luego “Aceptar” o “Elegir”.
11. Con las bibliotecas agregadas, cierra y reinicia el Arduino IDE.
Enviando (POST) & Recibiendo (GET) Valores de Sensores a Ubidots
1. En el Arduino IDE, copia y pega el siguiente código de muestra para POSTear los datos de tu dispositivo a tu cuenta de Ubidots. Asegúrate de actualizar el TOKEN y las credenciales de WiFi en el camino.
Asigna las siguientes variables en el código a continuación:
Tu TOKEN de Ubidots donde se indica en el código:
#define TOKEN "............................." // Tu TOKEN de Ubidots
Tu WIFINAME donde se indica en el código:
#define WIFINAME "..................." //Tu SSID
Tu WIFIPASSWORD donde se indica en el código:
#define WIFIPASS "...................." // Tu Contraseña Wifi
Ubiclient.ubidotsSetBroker ("industrial.ubidots.com").
/**************************************** Incluir Bibliotecas ****************************************/#include "UbidotsESPMQTT.h"#include <SHT1x.h>/**************************************** Definir Constantes ****************************************/#define TOKEN "............................." // Tu TOKEN de Ubidots#define WIFINAME "..................." //Tu SSID#define WIFIPASS "...................." // Tu Contraseña Wifi/*****No cambiar****/#define DEVICE_LABEL "plantms"#define VARIABLE_LABEL_1 "light-intensity"#define VARIABLE_LABEL_2 "temperature"#define VARIABLE_LABEL_3 "soilmoisture"#define VARIABLE_LABEL_4 "buzzer"#define DATAPIN D7#define CLCKPIN D5#define LIGHT_SENSOR A0#define BUZZER D3Ubidots ubiclient(TOKEN);WiFiClient client;SHT1x sht1x(DATAPIN, CLCKPIN);/**************************************** Funciones Auxiliares ****************************************/void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Mensaje recibido ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } if ((char)payload[0] == '1') { digitalWrite(BUZZER, HIGH); } else { digitalWrite(BUZZER, LOW); } Serial.println();}char* getUbidotsDevice(char* deviceLabel) { char* data = (char *) malloc(sizeof(char) * 700); char* response = (char *) malloc(sizeof(char) * 400); sprintf(data, "GET /api/v1.6/devices/%s/", deviceLabel); sprintf(data, "%s HTTP/1.1\r\n", data); sprintf(data, "%sHost: industrial.api.ubidots.com\r\nUser-Agent:esp8266/1.0\r\n", data); sprintf(data, "%sX-Auth-Token: %s\r\nConnection: close\r\n\r\n", data, TOKEN); if (client.connect("industrial.api.ubidots.com", 80)) { client.println(data); } else { return "e"; } free(data); int timeout = 0; while (!client.available() && timeout < 5000) { timeout++; if (timeout >= 4999) { return "e"; } delay(1); } int i = 0; while (client.available()) { response[i++] = (char)client.read(); if (i >= 399) { break; } } char * pch; char * statusCode; int j = 0; pch = strtok (response, " "); while (pch != NULL) { if (j == 1 ) { statusCode = pch; } pch = strtok (NULL, " "); j++; } free(response); return statusCode;}/**************************************** Funciones Principales ****************************************/void setup() { // pon tu código de configuración aquí, para ejecutar una vez: pinMode(BUZZER, OUTPUT); ubiclient.ubidotsSetBroker("industrial.ubidots.com"); // Establece el broker correctamente para la cuenta empresarial ubiclient.setDebug(true); // Pasa un valor bool verdadero o falso para activar mensajes de depuración Serial.begin(115200); ubiclient.wifiConnection(WIFINAME, WIFIPASS); ubiclient.begin(callback); if (!ubiclient.connected()) { ubiclient.reconnect(); } // Obtener información del dispositivo char* deviceStatus = getUbidotsDevice(DEVICE_LABEL); // verificar si el dispositivo está creado if (strcmp(deviceStatus, "404") == 0) { ubiclient.add(VARIABLE_LABEL_4, 0); //Inserta tus etiquetas de variable y el valor a enviar ubiclient.ubidotsPublish(DEVICE_LABEL); ubiclient.loop(); } ubiclient.ubidotsSubscribe(DEVICE_LABEL, VARIABLE_LABEL_4); //Inserta las etiquetas de la fuente de datos y de la variable}void loop() { // pon tu código principal aquí, para ejecutar repetidamente: if (!ubiclient.connected()) { ubiclient.reconnect(); ubiclient.ubidotsSubscribe(DEVICE_LABEL, VARIABLE_LABEL_4); //Inserta las etiquetas de la fuente de datos y de la variable } // Tomando lecturas del sensor int light_intesity_reading = analogRead(LIGHT_SENSOR); float tempc = sht1x.readTemperatureC(); float soilmoisture = sht1x.readHumidity(); // Publicando valores a las variables asignadas ubiclient.add(VARIABLE_LABEL_1, light_intesity_reading); ubiclient.add(VARIABLE_LABEL_2, tempc); ubiclient.ubidotsPublish(DEVICE_LABEL); ubiclient.loop(); ubiclient.add(VARIABLE_LABEL_3, soilmoisture); ubiclient.ubidotsPublish(DEVICE_LABEL); ubiclient.loop(); delay(1000);}
2. Con tu código en el IDE y actualizado con WiFi y TOKEN de Seguridad, Sube el código con el icono de “marca de verificación” y el icono de “flecha a la derecha” que se encuentran en la parte superior izquierda de la pantalla del IDE.
3. Cuando la carga del código esté completa, la siguiente notificación se reportará desde el Arduino IDE.
4. Para verificar que los datos se están enviando desde tu dispositivo a Ubidots, selecciona la herramienta de puerto com. Esta herramienta está denotada por un icono de “lupa” ubicado en la esquina superior derecha del IDE.
3. Configuración de Ubidots
Con la plataforma de Desarrollo de Aplicaciones IoT de Ubidots, tú eres el creador y administrador de tus propias aplicaciones. La primera vez que tu dispositivo envíe su primer punto a Ubidots, se creará automáticamente un nuevo dispositivo digital en la interfaz de usuario de Ubidots que contendrá las variables que se actualizarán desde el código de muestra.
En tu cuenta de Ubidots encontrarás un nuevo dispositivo con el nombre “plantms”, abreviatura de Sistema de Monitoreo de Plantas.
Haz clic en este dispositivo para encontrar las variables subyacentes de tus sensores actualizándose y mostrando de manera similar a la imagen de abajo.
Configuración del Sistema de Alarma Inteligente
Este sistema de alarma inteligente cuenta con una alerta de buzzer que sirve como la voz de las plantas en tus sistemas de monitoreo. La alerta de buzzer funciona como un sistema de alarma que se activa en función del aumento/disminución del valor de contenido de humedad del suelo por encima o por debajo de un umbral predeterminado.
Para crear el sistema de alarma inteligente, crearemos los siguientes eventos:
Evento 1: Demasiado Húmedo
Cuando la variable "humedad del suelo" exceda el umbral de 60, activa la variable “buzzer” para que se convierta en 1. Entonces el hardware reconocerá, cuando la variable “buzzer” sea 1, el buzzer sonará.
Evento 2: Buen Estado
Cuando la variable "humedad del suelo" esté entre los umbrales de 40-60, activa la variable buzzer para que se convierta en 0. Entonces nuestro dispositivo reconocerá, cuando la variable buzzer sea 0, el buzzer no sonará.
Evento 3: Demasiado Seco
Cuando la variable "humedad del suelo" caiga por debajo del umbral de 40, activa la variable “buzzer” para que se convierta en 1. Entonces el hardware reconocerá, cuando la variable “buzzer” sea 1, el buzzer sonará.
Evento 4: Temporizador para el sonido del buzzer
Cuando la humedad del suelo esté demasiado húmeda/demasiado seca, el buzzer se activa. Para evitar el dolor de cabeza del buzzer, este evento también se programará para apagar el buzzer después de 1 minuto de activación.
Configuración de Eventos
1. En tu cuenta de Ubidots, selecciona Datos –> Eventos. Luego, selecciona CREAR EVENTO o haz clic en el icono azul “+” en la esquina superior derecha de tu Interfaz de Usuario.
2. Los eventos que crearemos tendrán la siguiente lógica:
Notificación de Buzzer por Demasiado Húmedo
Variable Actualizada por Buen Estado
Notificación de Buzzer por Demasiado Seco
Temporizador para el sonido del Buzzer
Notificación de Buzzer por Demasiado Húmedo
En este punto, el sistema de notificación inteligente para nuestras plantas está parcialmente completo. El siguiente paso es configurar y asignar una notificación cuando nuestras plantas estén en buen estado. Para completar la Notificación de Buzzer, CREA un NUEVO EVENTO para buenas condiciones como se describe a continuación.
Variable Actualizada para Buen Estado
Ahora el sistema de notificación inteligente para nuestras plantas está casi completo. Terminemos el trabajo configurando y asignando una notificación cuando nuestras plantas estén demasiado secas. Para completar la Notificación de Buzzer por demasiado seco, vamos a crear otro evento con la siguiente lógica.
Notificación de Buzzer por Demasiado Seco
El paso final de nuestro sistema de notificación inteligente para nuestras plantas es configurar el Temporizador para el Buzzer. Hacer sonar el buzzer mientras el suelo está demasiado húmedo o demasiado seco es bastante doloroso. Por esta razón, agregaremos un final para apagar el sonido del buzzer después de 1 minuto. Para completar el Temporizador para el Buzzer, crea un evento final como se muestra a continuación.
Temporizador para el sonido del Buzzer
En este punto, el sistema de notificación inteligente para nuestras plantas está completo, resultando en los 4 eventos a continuación.
Nota de Calibración: Para el éxito de este tutorial, simplemente usamos 60 y 40 como los umbrales alto y bajo. Es probable que tus plantas requieran diferentes umbrales para las alarmas de demasiado húmedo o demasiado seco. A continuación se muestra un diagrama para ayudar a establecer los umbrales de eventos de acuerdo con el tipo de suelo que se esté utilizando.
Con esto puedes asignar los siguientes eventos de acuerdo con el diagrama anterior.
Evento 1: Demasiado Húmedo - En “Demasiada Agua”.
Evento 2: Buen Estado - En “Agua disponible para la planta”.
Evento 3: Demasiado Seco - En “Agua no disponible”.
Por ejemplo: Si mi suelo es un suelo franco. Establecería el evento “demasiado húmedo” a > 62, el evento “buen estado” entre 62 - 43 y el evento “demasiado seco” a < 43.
Expectativas del Sistema de Alerta Inteligente:
Volviendo a tu dispositivo “plantms”. La variable “buzzer” debería ser 1 cuando la humedad del suelo esté por encima de 60 acompañada de un sonido de buzzer durante 1 minuto; 1 cuando la humedad del suelo esté por debajo de 40 acompañada de un sonido de buzzer durante 1 minuto; y debería ser 0 entre los umbrales de 40 - 60 sin ningún sonido del buzzer.
Configuración del Panel de Control
Usando un panel de control puedes organizar y presentar datos a un usuario que se pueden entender rápidamente con la visualización de indicadores, interruptores, gráficos e identificadores. Para crear tu panel de control para que se vea como el nuestro, simplemente sigue los pasos de configuración a continuación.
1. Crea un Panel de Control. Para hacer esto, desde tu cuenta de Ubidots, haz clic en Datos –> Paneles de Control –> Crear un nuevo Panel de Control.
2. Cualquier nombre o título identificativo puede ser asignado al panel de control. Como se muestra a continuación, nuestro panel de control de muestra se llama PlantMS.
3. Después de que se crea el Panel de Control, sigue las instrucciones en pantalla para Crear el primer Widget y comenzar a visualizar e interactuar con los datos.
4. Nuestro panel de control contendrá un gráfico y un widget de control. Para crear el gráfico, simplemente selecciona:
Widget de Gráfico > Gráfico de Líneas > Agregar Variable > luego selecciona temperatura, humedad del suelo y intensidad de luz. Haz clic en finalizar para completar la programación del widget.