Sistema de Monitorizado de Plantas Inteligente con AWS IoT
Componentes y materiales
- Arduino Yun ×1
- Kit Grove Starter Kit Plus para Intel Edison ×1 (usamos shield, sensor de temperatura y luz)
- Sensor de humedad de suelo Grove ×1
- LED rojo 5 mm ×1
- Resistencia 330 Ω ×1
Herramientas necesarias
- Impresora 3D (genérica)
Aplicaciones y servicios online
- AWS IoT
- AWS IAM
- AWS DynamoDB
- AWS SNS
- dweet.io
- Arduino IDE
Descripción del proyecto
¿Te vas de vacaciones y te preocupa tu planta? Este sistema monitoriza temperatura, luz y humedad del suelo, enviando datos a dweet.io o AWS IoT (DynamoDB). Si la humedad baja de un umbral, AWS SNS envía un email para que alguien riegue la planta. Incluye carcasa impresa en 3D.
Pasos de construcción
- Circuito: Conecta shield Grove al Yun. Temperatura → A0, Humedad suelo → A1, Luz → A2. LED rojo + 220 Ω al pin 2.
- Imprime la carcasa 3D (3 archivos STL, altura de capa 0.3 mm, relleno ≥25%). Tarda ~2 horas.
- Determina el umbral de sequía: Sube el sketch
SoilMoistureValuey anota el valor analógico cuando la tierra está seca (ej. 250). Ese valor se usará en la regla SNS. - Sube datos a dweet.io: Sketch
ArduinoYunDweetio(cambia el nombre “PlantMonitorTorontoON” por uno único). - Configura AWS CLI (crea cuenta AWS Free Tier, instala CLI, crea carpeta
AWS). - Crea un “thing” en AWS IoT:
aws iot create-thing --thing-name "plantSystem" - Genera certificados:
aws iot create-keys-and-certificate --set-as-active --certificate-pem-outfile cert.pem --public-key-outfile publicKey.pem --private-key-outfile privateKey.pem - Crea y adjunta política IoT (permiso
iot:*). - Adjunta política al certificado y certificado al thing.
- Prueba con MQTT.fx (configura perfil con certificados y CA root).
- Prepara el Yun para AWS IoT: Instala SDK
aws-iot-device-sdk-arduino-yunen librerías. Sube certificados a la carpetacerts/del Yun. Ejecuta scriptscodebase_upload.shyenvironment_setup.sh(instalan python-openssl, paho-mqtt, etc.). - Crea rol IAM y política para permitir a IoT escribir en DynamoDB e invocar Lambda.
- Crea tabla DynamoDB
plantSensor(partition key:key, sort key:timestamp, capacidad 1/1). - Crea regla IoT
plantDataToDynamoDBque inserte mensajes del tematopic/plantdataen la tabla. - Sube sketch
ArduinoYunAWSIoTDynamoDB+aws_iot_config.h(configura endpoint, thing name, rutas de certs). El Yun publicará JSON contemp,lightval,moistval. - Configura notificación SNS por email: En AWS IoT, crea regla
EmailSendcon condiciónmoistval < 250(tu umbral), acción SNS al topicsendMail(suscripción email). Asigna roliot-actions-rolecon políticasAmazonSNSFullAccess. - Ensambla la carcasa 3D (tornillo M4x40 para el sensor de humedad), orienta la abertura hacia la ventana, inserta sensor en la maceta y alimenta el Yun por micro-USB.
Código
SoilMoistureValue (determinar umbral)
const int moisturePin = A1;
const int ledPin = 2;
int moisturValue = 0;
int tooDryValue = 250; // ajustar según pruebas
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop() {
moisturValue = analogRead(moisturePin);
Serial.print("Moisture sensor = ");
Serial.println(moisturValue);
if (moisturValue < tooDryValue) digitalWrite(ledPin, HIGH);
else digitalWrite(ledPin, LOW);
delay(3000);
}
ArduinoYunDweetio (publicar en dweet.io)
#include
#include
#define SITE_URL "www.dweet.io"
#include
const int moisturePin = A1;
const int ledPin = 2;
int moisturValue = 0;
const int tooDryValue = 500;
float tooLowTemp = 20;
const int B = 4275;
const int R0 = 100000;
const int pinTempSensor = A0;
const int lightPin = A2;
unsigned long lastConnectionTime = 0;
const unsigned long postingInterval = 10L * 1000L;
void setup() {
Bridge.begin();
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
while (!Serial);
}
void loop() {
if (millis() - lastConnectionTime > postingInterval) {
YunClient c;
moisturValue = analogRead(moisturePin);
int a = analogRead(pinTempSensor);
float R = 1023.0/((float)a) - 1.0;
R = 100000.0 * R;
float temperature = 1.0/(log(R/100000.0)/B + 1/298.15) - 273.15;
int lightValue = analogRead(lightPin);
if (moisturValue < tooDryValue || temperature < tooLowTemp) digitalWrite(ledPin, HIGH);
else digitalWrite(ledPin, LOW);
if (c.connect(SITE_URL, 80)) {
String s = "POST /dweet/for/PlantMonitorTorontoON?Temperature=";
s += temperature; s += "&LightValue="; s += lightValue; s += "&SoilMoisture="; s += moisturValue;
c.println(s);
c.println("Host: www.dweet.io");
c.println("Connection: close");
c.println();
lastConnectionTime = millis();
}
}
}
ArduinoYunAWSIoTDynamoDB (publicar en AWS IoT → DynamoDB)
#include
#include
#include "aws_iot_config.h"
#include
#include
char data[80];
StaticJsonBuffer<200> jsonBuffer;
const int moisturePin = A1;
const int ledPin = 2;
int moisturValue = 0;
const int tooDryValue = 250;
float tooLowTemp = 20;
const int B = 4275;
const int R0 = 100000;
const int pinTempSensor = A0;
const int lightPin = A2;
unsigned long lastConnectionTime = 0;
const unsigned long postingInterval = 10L * 1000L;
aws_iot_mqtt_client myClient;
char msg[32];
int cnt = 0;
int rc = -100;
bool success_connect = false;
void msg_callback(char* src, int len) {
Serial.println("CALLBACK:");
for (int i=0; i
aws_iot_config.h (configuración AWS IoT)
#ifndef config_usr_h
#define config_usr_h
#define AWS_IOT_MQTT_HOST "XXXXXXXXXXX.iot.us-west-2.amazonaws.com"
#define AWS_IOT_MQTT_PORT 8883
#define AWS_IOT_CLIENT_ID "clientYun2"
#define AWS_IOT_MY_THING_NAME "PlantSystem"
#define AWS_IOT_ROOT_CA_FILENAME "rootCA.pem"
#define AWS_IOT_CERTIFICATE_FILENAME "cert.pem"
#define AWS_IOT_PRIVATE_KEY_FILENAME "privateKey.pem"
#define AWS_IOT_PATH_PREFIX "./certs/"
#define AWS_IOT_ROOT_CA_PATH AWS_IOT_PATH_PREFIX AWS_IOT_ROOT_CA_FILENAME
#define AWS_IOT_CERTIFICATE_PATH AWS_IOT_PATH_PREFIX AWS_IOT_CERTIFICATE_FILENAME
#define AWS_IOT_PRIVATE_KEY_PATH AWS_IOT_PATH_PREFIX AWS_IOT_PRIVATE_KEY_FILENAME
#endif
Piezas personalizadas y carcasa (STL)
Archivos STL para imprimir la carcasa que aloja Yun, shield y sensores.
Esquemáticos
Conexiones del shield Grove:
- Temperatura → A0
- Humedad suelo → A1
- Luz → A2
- LED rojo + 220 Ω → pin 2
Proceso de manufactura
- Monitorización meteorológica remota con Raspberry Pi 3 y PubNub
- Botón IoT AWS Controlado por Movimiento con Raspberry Pi, Sensor PIR y MQTT
- Monitoreo de Latidos Cardíacos sin Contacto vía Altavoces Inteligentes: Un Sistema Revolucionario
- Eleve sus operaciones: Aproveche la monitorización IoT de tanques para una gestión petrolífera más segura, inteligente y rentable
- Sistema IoT Avanzado con IA para Detección Temprana de Incendios Forestales y Monitorización de Salud de Árboles
- Sistema de Monitorización Remota IoT para Tanques de Petróleo y Diésel
- Descubre 8 Ventajas Clave de la Monitorización de Peso de Flotas IoT
- Cómo la Monitorización de Activos IoT Impulsa Seguridad y Eficiencia en Petróleo y Gas
- Revolucione la Gestión Láctea con Monitoreo de Nivel de Leche Habilitado por IoT
- Sistema Inteligente de Monitoreo de Ríos IoT Mejora la Gestión del Agua y Prevención de Inundaciones
- Dominando las Sentencias Using en C#: Importaciones, Alias y Directivas Estáticas