martes, 25 de enero de 2022

INVERNADERO DOMOTIZADO


 

 

DATOS ALUMNO

Nombre

Javier Andrés Antón

Estudios superiores en proceso 

Máster Universitario en Profesor de Educación Secundaria Obligatoria y Bachillerato, Formación Profesional y Enseñanza de Idiomas.

Asignatura

Innovación Docente de la Especialidad de Tecnología

Centro

Universidad de Salamanca

Curso

2021/2022  

 

ENTORNO

Se trata de un proyecto que podría llevarse a cabo en la clase de robótica de 4º ESO, los materiales están disponibles con el KIT de arduino que puede comprarse de modo online, los sensores están disponibles y se podría reciclar materiales para su elaboración, como un ventilador de un PC obsoleto o sin uso, material de madera reciclado de un palé para realizar el invernadero o viejos plásticos de cualquier alimento o de los que terminan en la basura y que envuelven productos recién comprados.

Por tiempo y debido a las medidas COVID, solo se ha realizado el prototipo sin llegar a crear un invernadero, entendemos que si se llevase a la práctica podría realizarse dicho invernadero con imaginación y ganas.

También creo que el proyecto pone en contacto a los alumnos con las plantas y el poder llevar a cabo el cultivo por uno mismo de hortalizas o verduras que se pueden consumir, eso si, será necesario tener un lugar soleado y tiempo. 


OBJETIVOS DE DESARROLLO SOSTENIBLE 

La agenda 2030 para el desarrollo sostenible incluye unos Objetivos de Desarrollo Sostenible que pueden verse reflejados en este proyecto, voy a detallar cuales de todos ellos podrían ser estos.

  1. Poner fin al hambre, conseguir la seguridad alimentaria y una mejor nutrición, y promover la agricultura sostenible. (2)
  2. Garantizar una vida saludable y promover el bienestar para todos y todas en todas las edades. (3)
  3. Garantizar las pautas de consumo y de producción sostenibles. (12)

 

Mediante el uso de tecnología barata, disponible y sin grandes conocimiento por parte del usuario pretendemos con este proyecto habilitar para la producción de recursos alimenticios, de modo limitado, pero que en este caso particular mejora y anima a consumir productos saludables y de kilómetro 0.

 

MATERIALES UTILIZADOS

 Super Starter Kit UNO R3 Project que incluye (solo se indicarán los usados para el proyecto):

- UNO R3  Controller Board

- LCD 1602 Module (with pin header)

- Power Supply Module

- Servo Motor SG90

- DHT11 Temperature and Humidity Module

- Fan Blade and 3-6V Motor

- L293D

- Potentiometer 10K

- 830 Tie-Points Breadboard

- USB Cable

- Breadboard Jumper Wire

- 9V Battery with Snap-on Connector Clip

- 2 Resistor (220 ohmios)

- 2 Led (azul y rojo) simulan el humidificador y calentador respectivamente.

Dentro de esta web, podemos encontrar lo necesario para identificar todos los componentes e incluso crear nuestros propios proyectos.

 


 

EXPLICACIÓN FUNCIONAMIENTO

Se trata de un circuito elaborado con arduino que domotiza un invernadero para su correcto funcionamiento.

El circuito es capaz de medir la temperatura interna del invernadero y dependiendo de esta manejar una trampilla para intercambio de aire con el exterior, de manejar un humidificador, de manejar un calentador y de manejar un ventilador para forzar el intercambio de aire con el exterior.

Se ha seleccionado una temperatura límite inferior de 23º y una superior de 27º, por debajo de esta o superando los 27º se enciende el calentador o la apertura de trampilla y activación de ventilador respectivamente.

Para la humedad medida se ha establecido un límite inferior de 45% y uno superior del 65%, por debajo del límite inferior se enciende el humidificador, y por encima del límite superior se abre trampilla y habilita ventilador para forzar el intercambio del aire con el exterior.

El circuito también dispone de un LCD donde se indica en todo momento los valores actuales tanto de temperatura como de humedad, así mismo, se indica en una línea inferior del LCD el estado de los 4 dispositivos, la trampilla, calentador, humidificador y por último el ventilador, se muestran en ese orden. Para indicar el estado apagado se muestra "X", para indicar el estado activado se muestra ">>" 

 

 

Se ha introducido un alimentador adicional a arduino, que proporciona una tensión de 5 y de 3 voltios. El uso del motor de CC exige demasiada corriente y en ocasiones dejaba al LCD poco iluminado si solo se alimentaba mediante el pin de 5V del arduino, por este motivo se colocó este circuito adicional, se conecta sobre la placa protoboard y habilita la línea superior con 5V y la inferior con 3V, como se ve en el circuito se hace uso de la línea superior para alimentar al circuito conectado a la placa protoboard salvo el motor CC, al ser este tan exigente en corriente se ha conectado el chip que controla el motor (L293) a la salida 5V del arduino, dejando el resto del circuito alimentado a través del circuito adicional. Este circuito a su vez se alimenta con una pila de 9V.

Este es el vídeo explicativo donde se muestra el funcionamiento real del invernadero domotizado.

 

VIDEO EXPLICATIVO FUNCIONAMIENTO 

 


 

ESQUEMA DEL CIRCUITO

 

 

CÓDIGO

//www.elegoo.com
//2016.12.9

//Librería para el LCD:
#include <LiquidCrystal.h>

//Librería para el termómetro/humector
#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11

//Librería para el motor servo
#include <Servo.h>
Servo myservo;  //Crea el objeto servo para controlar el motor

//Iniciación de variables para motor continua y asignación del pin en arduino
#define ENABLE 5
#define DIRA 0
#define DIRB 1

//Iniciación de variables para control de posición servo, trampilla, calentador, ventilador y humidificador.
int pos = 0;    //Variable que almacena la posición del servo
int trampilla = 0; //Variable para control trampilla respiración invernadero
int calentador = 0; //Variable para control del calentador
int ventilador = 0; //Variable para control del ventilador
int humidificador = 0; //Variable para control del humidificador


//Inicialización de los pines de salidas del arduino para control del LCD
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

//Inicialización de pin entrada y función para el control termómetro/humectador
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );

//Inicialización y valor de las constantes de temperatura y humedad límites dentro del invernadero.
const float baselineTemp = 23.00;
const float toplineTemp = 27.00;

const float baselineHum = 45.00;
const float toplineHum = 65.00;

/Inicio ejecución
void setup()
{
  //Inicio donde establecemos el número columnas y filas LCD
  lcd.begin(16, 2);

  //Inicialización a 0 del pin que simula el encendido de un resistor
    pinMode(4, OUTPUT);
    digitalWrite(4, LOW);
   //Inicialización a 0 del pin que simula el encendido de humidificador
    pinMode(13, OUTPUT);
    digitalWrite(13, LOW);

  myservo.attach(3);  //Salida pin 3 para control servo
 
  //Inicialización como salidas pines para control motor contínua (ventilador)
  pinMode(ENABLE,OUTPUT);
  pinMode(DIRA,OUTPUT);
  pinMode(DIRB,OUTPUT);
}

/* Pool para medición temperatura/humedad
 * mantiene las mediciones activas siempre
 * devuelve verdadero si la medida es correcta.
 */
static bool measure_environment( float *temperature, float *humidity )
{
  static unsigned long measurement_timestamp = millis( );
  /* Mide cada 4 segundos. */
  if( millis( ) - measurement_timestamp > 3000ul )
  {
    if( dht_sensor.measure( temperature, humidity ) == true )
    {
      measurement_timestamp = millis( );
      return( true );
    }
  }
  return( false );
}

//Inicio de la ejecución en loop
void loop()
{
// Variables necesarias para temperatura
  float temperature;
  float humidity;
 
//Escribimos en LCD
  //En la primera línea la temperatura y humedad, usamos la función.
  if( measure_environment( &temperature, &humidity ) == true )
  {
    lcd.setCursor(0,0);
    lcd.print( "Tem=" );
    lcd.setCursor(4,0);
    lcd.print(temperature);
    lcd.setCursor(6,0);
    lcd.print( "C " );
    lcd.setCursor(8,0);
    lcd.print(" Hum=");
    lcd.setCursor(13,0);
    lcd.print( humidity );
    lcd.setCursor(15,0);
    lcd.print( "%" );

  //Escribimos en la segunda línea del LCD
    //Escribimos estado de la trampilla
    if (trampilla==1){
    lcd.setCursor(0,1);
    lcd.print( "T->>" );
    }else {
    lcd.setCursor(0,1);
    lcd.print( "T-X " );      
    }

    //Escribimos estado de calentador  
    if (calentador==1){
    lcd.setCursor(4,1);
    lcd.print( "C->>" );
    }else {
    lcd.setCursor(4,1);
    lcd.print( "C-X " );      
    }    

    //Escribimos estado de humidificador
    if (humidificador==1){
    lcd.setCursor(8,1);
    lcd.print( "H->>" );
    }else {
    lcd.setCursor(8,1);
    lcd.print( "H-X " );      
    }

    //Escribimos estado de ventilador
    if (ventilador==1){
    lcd.setCursor(12,1);
    lcd.print( "V->>" );
    }else {
    lcd.setCursor(12,1);
    lcd.print( "V-X " );      
    }    
 
  // Si la temperatura es mayor de 27º abrimos trampilla y encendemos ventilador.
  if (temperature >= toplineTemp && trampilla==0)
    {
    ventilador=1;                   //activa variable indicadora de ventilador encendido
    trampilla=1;                      // activa variable indicadora de trampilla abierta
      //Abrimos trampilla      
      for (pos = 0; pos <= 180; pos += 1) // Va de 0 grados a 180 grados de apertura
      {                                    // en pasos de 1 grado en 1 grado
      myservo.write(pos);              // Posicionamos el servo en contenido de variable 'pos'
      delay(15);                       // esperamos 15ms para que el servo alcance la posición
      }
    //Encendemos ventilador
    digitalWrite(ENABLE,HIGH); // Habilita ventilador
    digitalWrite(DIRA,HIGH); //en una sola dirección
    digitalWrite(DIRB,LOW);
    }
    
  //Si la temperatura es más baja de 23º encendemos calentador (led rojo on)
  if (temperature < baselineTemp)
    {
      digitalWrite(4, HIGH);
      calentador=1;
    } else if (temperature >= baselineTemp)  //Si la temperatura ya alcanzó los 23º apagamos calentador (led rojo off)
    {
      digitalWrite(4, LOW);
      calentador=0;
    }

  // Si la humedad está demasiado baja (<45%) activamos vaporizador, (led azul on).
  if (humidity < baselineHum)
    {
    digitalWrite(13, HIGH);
    humidificador=1;
    }else  if (humidity < baselineHum) // Si la humedad ya alcanzó el 45% desactivamos vaporizador, (led azul off).
    {
    digitalWrite(13, HIGH);
    humidificador=1;
    }

  //Si la humedad alcanzó el 65% y la trampilla está cerrada, apagamos humidificador(led azul off) y abrimos trampilla.
  if (humidity >= toplineHum && trampilla==0)
    {
    digitalWrite(13, LOW);
    humidificador=0;                    //desactivamos variable humidificador
    ventilador=1;                       //activamos variable ventilador  
    trampilla=1;                       // activa variable indicadora de trampilla abierta
      for (pos = 0; pos <= 180; pos += 1) // Va de 0 grados a 180 grados de apertura
      {                                    // en pasos de 1 grado en 1 grado
      myservo.write(pos);              // Posicionamos el servo en contenido de variable 'pos'
      delay(15);                       // esperamos 15ms para que el servo alcance la posición
      }
    //Encendemos ventilador
    digitalWrite(ENABLE,HIGH); // Habilita ventilador
    digitalWrite(DIRA,HIGH); //en una sola dirección
    digitalWrite(DIRB,LOW);
   }

   //Si la humedad baja de 65% y la temperatura baja de 27º y tenemos la trampilla abierta, cerramos trampilla.
   if (humidity < toplineHum && trampilla==1 && temperature < toplineTemp )
   {
      ventilador=0;                     // desactivamos variable de ventilador
      trampilla=0;                      // desactivamos variable de ventana
      for (pos = 180; pos >= 0; pos -= 1) // Va de 0 grados a 180 grados de apertura
      {                                   // en pasos de 1 grado en 1 grado
      myservo.write(pos);              // Posicionamos el servo en contenido de variable 'pos'
      delay(15);                       // esperamos 15ms para que el servo alcance la posición
      }
      digitalWrite(ENABLE,LOW); // desactivamos ventilador.
           
   }
  }
}

 

No hay comentarios:

Publicar un comentario