Sensor Inalámbrico de Humedad de Suelo con Helium y DFRobot – Cuidado de Plantas en Tiempo Real
Componentes y materiales
| Módulo Helium Atom XBee | 1 |
| Punto de acceso Helium Element | 1 |
| Sensor capacitivo humedad suelo DFRobot Gravity (SEN0193) | 1 |
| Adaptador Helium Arduino/mbed | 1 |
| Arduino UNO | 1 |
Software y servicios
- Arduino IDE
- Helium Dashboard (cuenta gratuita)
- Librerías:
Helium,ArduinoJson(instalar desde Gestor de librerías)
Descripción
Sonda de humedad de suelo inalámbrica de bajo consumo (LPWAN) que envía lecturas a Helium Dashboard y/o canal HTTP (ej. IFTTT, requestbin). Ideal para macetas, jardín o agricultura de precisión.
Construcción de la sonda
- Inserta Helium Atom en Adaptador Helium Arduino → conéctalo al Arduino UNO. Configura jumpers RX/TX según placa (ver docs Helium).
- Conecta sensor DFRobot (3 hilos: negro=GND, rojo=5V, azul=AD0) al adaptador.
- Conecta conector blanco del sensor a la sonda capacitiva.
Despliegue de red Helium
- Conecta Helium Element a alimentación y Ethernet (LED verde/teal = online).
- En Helium Dashboard: crea cuenta → "New Atom" (nombre, últimos 4 dígitos MAC, código HVV 4 dígitos) → "New Element" (igual + ubicación en mapa).
- Verifica "Status & Signal" del Atom en Dashboard.
Canal HTTP
En Dashboard: "Channels" → "New Channel" → "HTTP" → URL destino (ej. https://requestbin.io/...). Nombre del canal: "HTTP" (usado en el sketch).
Configuración Arduino IDE y Sketch
- Instala librerías
HeliumyArduinoJson(Sketch → Include Library → Manage Libraries). - Nuevo sketch → pega el código completo (ver abajo).
- Conecta hardware por USB → Upload.
Sketch completo (Soil_Humidity.ino)
/* Copyright 2017, Helium Systems, Inc. All Rights Reserved. */
#include "Board.h"
#include <Arduino.h>
#include <ArduinoJson.h>
#include <Helium.h>
#include <Wire.h>
#define CHANNEL_NAME "HTTP"
#define CHANNEL_DELAY 5000
#define CHANNEL_SEND_CYCLE 12
Helium helium(&atom_serial);
Channel channel(&helium);
int channel_counter;
void report_status(int status, int result = 0) {
if (helium_status_OK == status) {
if (result == 0) Serial.println(F("Succeeded"));
else { Serial.print(F("Failed - ")); Serial.println(result); }
} else { Serial.println(F("Failed")); }
}
void connect() {
while (!helium.connected()) {
Serial.print(F("Connecting - "));
int status = helium.connect();
report_status(status);
if (helium_status_OK != status) delay(1000);
}
}
void channel_create(const char * channel_name) {
int8_t result; int status;
do {
connect();
Serial.print(F("Creating Channel - "));
status = channel.begin(channel_name, &result);
report_status(status, result);
if (helium_status_OK != status) delay(1000);
} while (helium_status_OK != status || result != 0);
}
void channel_send(const char * channel_name, void const * data, size_t len) {
int status; int8_t result;
do {
Serial.print(F("Sending - "));
status = channel.send(data, len, &result);
report_status(status, result);
if (status == helium_status_OK && result != 0) channel_create(channel_name);
else if (status != helium_status_OK) delay(1000);
} while (helium_status_OK != status || result != 0);
}
void setup() {
Serial.begin(9600);
Serial.println(F("Starting"));
helium.begin(HELIUM_BAUD_RATE);
channel_create(CHANNEL_NAME);
channel_counter = 0;
}
#define DRY_VALUE 536 // En aire
#define WET_VALUE 303 // En agua
#define HUM_RANGE (DRY_VALUE - WET_VALUE)
void loop() {
Serial.print(F("Reading - "));
float reading = analogRead(A0);
float percent = 100 * (1 - (reading - WET_VALUE) / HUM_RANGE);
Serial.print(reading); Serial.print(" - "); Serial.println(percent);
if (--channel_counter <= 0) {
StaticJsonBuffer<JSON_OBJECT_SIZE(2) + 100> jsonBuffer;
JsonObject & root = jsonBuffer.createObject();
root[F("value")] = reading;
root[F("percent")] = percent;
char buffer[HELIUM_MAX_DATA_SIZE];
size_t used = root.printTo(buffer, HELIUM_MAX_DATA_SIZE);
channel_send(CHANNEL_NAME, buffer, used);
channel_counter = CHANNEL_SEND_CYCLE;
}
delay(CHANNEL_DELAY);
}
Datos generados (JSON)
{ "value": 433, "percent": 55.5 }
value = lectura analógica cruda (0-1023). percent = humedad relativa calculada con calibración DRY/WET. Ajusta DRY_VALUE y WET_VALUE según tu sensor/suelo.
Verificación en Helium Dashboard
- Vista "Atom UI" → "Status & Signal" (online/offline, RSSI, SNR).
- "Event Log": cada paquete enviado y estado (éxito/fallo) al canal HTTP.
- "Debug": lecturas en tiempo real al activar opción.
Próximos pasos
- Añadir sensor temperatura/humedad aire (DHT22, BME280).
- Integrar con IFTTT → notificaciones móvil/email si humedad < umbral.
- Alimentación solar + LiPo para nodo autónomo exterior.
- Documentación Helium: docs.helium.com, Slack, Foro.
Proceso de manufactura
- Éxito duradero: lecciones de persistencia de Abraham Lincoln y el liderazgo en mantenimiento
- Sistema de control de acceso integrado con QR, RFID y verificación de temperatura
- Construya un Sensor de Humedad de Suelo de Bajo Coste para Riego Inteligente con Raspberry Pi
- Construye un sistema aeropónico automatizado con Raspberry Pi y sensor de humedad
- Construya un robot con Raspberry Pi y Python: Guía completa
- Integración de sensor termopar con Arduino Portenta H7 usando MAX6675
- Control Preciso de Servo con Arduino y MPU6050 (SG90 / MG996R)
- Módulo GPS u-blox LEA‑6H 02: Guía de integración con Arduino y Python
- Dominando reconocimiento y síntesis de voz en Arduino Due
- Sensores de Humedad de Suelo: Funcionamiento y Aplicaciones Prácticas
- Cámaras digitales mejoradas con IA revolucionan la monitorización de humedad del suelo