Sistema de cuidado de plantas automático
Este proyecto de la asignatura Sistemas Empotrados y de Tiempo Real correspondiente al curso 21/22, ha sido realizado por el Grupo 15, cuyos integrantes son:
- Michele di Fede
- María Peña Ramos
- David Santamaría Rubio
Introducción
La idea inicial del proyecto era la de realizar un prototipo de un sistema automático para cuidar plantas, que la única interacción que necesitase con el usuario fuera la de rellenar el tanque de agua cuando se vaciase.
Las características pensadas en un primer momento, eran las de regar automáticamente cuando la planta lo necesitase (controlando el nivel de humedad y temperatura), darle luz a la planta cuando no le llegase luz solar, activar un ventilador para disipar el calor cuando éste fuera demasiado alto, realizar un seguimiento del crecimiento de la planta con el paso de los días y controlar el nivel del tanque de agua para avisar al usuario cuando haya que rellenarlo.
Finalmente, tuvimos que desechar la implementación de alguna de ellas, e incluimos otras que se nos ocurrieron sobre la marcha.
Materiales
- Arduino UNO
- Sensor de humedad 1 x 4€
- Sensor DTH11
- Sensor ultrasónico
- Fotoresistor
- Relé 1 x 1€
- Bomba de agua 2 x 5€
- Tubos de riego 1 x 2€
- Leds
- Led RGB
- Resistencias
- Potenciómetro
- Pantalla LCD
- Protoboard
- Cables 1 x 2€
Presupuesto total = 19 €
Código del proyecto
#include <DHT.h>
#include <LiquidCrystal.h>
//Definimos el pin donde se conectan los sensores
#define DHTPIN A0
#define sensorLuz A5
#define proximidad A4
//Dependiendo del tipo de sensor
#define DHTTYPE DHT11
// Inicializamos el sensor DHT11
DHT dht(DHTPIN, DHTTYPE);
//Puerto de bomba de agua
int bomba = 9;
//Puerto led riego vacío
int vacio = 10;
//Numero de riegos que aguanta el tanque de agua
int tanque = 3;
//Puerto led bombilla
int luz = 8;
//Umbral minimo de luz
int lum_min = 250;
//Umbral minimo de humedad y temperatura
float hum_min = 30.00;
int contador = 0;
int tiempo;
int nivel_minimo = 8;
int TriggerPin = 7;
int EchoPin = 6;
//Inicializamos pines de pantalla
LiquidCrystal lcd(12,11,5,4,3,2);
int ping(int TriggerPin, int EchoPin) {
long duracion, distancia;
digitalWrite(TriggerPin, LOW); //para generar un pulso limpio ponemos a LOW 4us
delayMicroseconds(4);
digitalWrite(TriggerPin, HIGH); //generamos Trigger (disparo) de 10us
delayMicroseconds(10);
digitalWrite(TriggerPin, LOW);
duracion = pulseIn(EchoPin, HIGH); //medimos el tiempo entre pulsos, en microsegundos
distancia = duracion * 10 / 292/ 2; //convertimos a distancia, en cm
return distancia;
}
void setup() {
Serial.begin(9600);
// Inicializamos sensor DHT
dht.begin();
//Inicializamos pantalla
lcd.begin(16, 2);
//Definimos led bombilla como output
pinMode(luz, OUTPUT);
//Definimos bomba de agua como output
pinMode(bomba, OUTPUT);
pinMode(TriggerPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop() {
digitalWrite(bomba, HIGH);
// Leemos la humedad relativa
float h = dht.readHumidity();
// Leemos la temperatura en grados centígrados
float t = dht.readTemperature();
// Comprobamos si ha habido algún error en la lectura
if (isnan(h) || isnan(t))
{
Serial.println("Error obteniendo los datos del sensor DHT11");
return;
}
//Mostrar humedad y temperatura por pantalla
lcd.setCursor(0, 0);
lcd.print("Humedad: ");
lcd.print(h);
lcd.print(" %");
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C");
//Activación led bombilla
if(analogRead(sensorLuz) < lum_min)
{
digitalWrite(luz, HIGH);
}
else
{
digitalWrite(luz, LOW);
}
//Activación bomba de agua
if((dht.readHumidity() < hum_min))
{
digitalWrite(bomba, LOW);
delay(2000);
digitalWrite(bomba, HIGH);
delay(1000);
lcd.begin(16, 2);
}
//Comprobar que el bidón sigue con agua
int cm = ping(TriggerPin, EchoPin);
if (cm > nivel_minimo)
{
digitalWrite(vacio, HIGH);
}
else
{
digitalWrite(vacio, LOW);
}
}
Conexiones y componentes
Video explicativo
Presentación
https://drive.google.com/file/d/1vcSSKpHXP17CSDGoZzQ8OvPZcKROpnMR/view?usp=sharing