sábado, 20 de enero de 2024

Proyecto incubadora

 Incubadora automática para huevos



Alumno: Jorge Adrián Seronero Sánchez

Asignatura: Innovación Docente de la Especialidad de Tecnología.

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

Centro: Universidad de Salamanca.

Curso: 2023/24

Video demostración


Descripción del proyecto:

Este prototipo tiene la finalidad de simular el funcionamiento automático para una incubadora de huevos. 

Partiendo de las necesidades de los huevos para poder desarrollarse:

  • Temperatura: 38ºC
  • Humedad: 65%
  • Volteo de los huevos cada 6 horas, a partir del dia 19 este volteo se anula para que los embriones se puedan colocar dentro del huevo antes de nacer.

Con esta información se diseña y programa el prototipo:

Para mantener la temperatura se condiciona una resistencia que proporcionara calor (simulado mediante un led rojo) que se enciende cuando la temperatura baja de 37,7ºC y se apaga cuando la temperatura sube de 38ºC.

Para mantener la humedad se programa una electroválvula (simulado mediante un led azul) que dejará entrar agua en la incubadora durante 3 segundos cuando la humedad baje del 65%; este control de humedad se realiza cada 3 horas, para que de tiempo a que la humedad suba.

Para el volteo de los huevos se programa un servomotor que varia su posición 90º cada 6 horas y ademas se incluye una orden para que deje de funcionar a partir del día 19.

Todo esto además con una salida de datos en una pantalla.

Alumnos para los que está dirigido:

Este proyecto se puede adaptar perfectamente para las asignaturas de Tecnología y Tecnología y Digitalización de 3º y 4º de ESO.

Componentes:

  • Placa de Arduino ELEGOO UNO R3 
  • Protoboard
  • Sensor Temperatura y Humedad DHT11
  • Pantalla LCD 16x2
  • Potenciómetro de 10 K
  • Diodo LED rojo
  • Diodo LED azul           
  • 2 resistencias 220Ω
  • Servomotor
  • Cables para circuito de diferentes longitudes
  • Cable puerto USB

Esquema 



Código

//Proyecto para incubadora

//Incluyo las bibliotecas sensor de temperatura y humedad y del servo
#include <dht_nonblocking.h>
#include <Servo.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
//defino el tipo de sensor y su pin de control
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
//Incluyo la biblioteca de la pantalla LCD y los pines que utiliza
#include <LiquidCrystal.h>
int tempPin = 0;
//                BS  E  D4 D5  D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// Declaro variables
int daysCounter = 0;
unsigned long lastDayIncrementTime = 0;  // Variable para almacenar el último tiempo en que se incrementó el contador de días
unsigned long lastHumidityControlTime = 0;  // Variable para almacenar el último tiempo en que se controló la humedad
unsigned long lastServoControlTime = 0;      // Último tiempo en que se movió el servo
unsigned long lastServoMovementTime = 0;     // Último tiempo en que el servo cambió de posición

Servo myservo;  // Objeto para controlar el servo
int servoPosition = 0;  // Posición inicial del servo
// Duración del movimiento del servo en milisegundos
const unsigned long servoMovementDuration = 4000;
unsigned long servoMovementStartTime = 0;  // Tiempo de inicio del movimiento del servo

// Día a partir del cual el servo dejará de funcionar
const int dayToDisableServo = 19;
//setup del programa, es la configuración inicial
void setup( )
{
  Serial.begin( 9600);  //Inicia el puerto serie
  lcd.begin(16, 2);   //Inicia la pantalla lcd
  pinMode(3, OUTPUT);  // Configura el pin 3 como salida
  pinMode(4, OUTPUT);  // Configura el pin 4 como salida
  myservo.attach(5);   // Conecta el servo al pin 5
  myservo.write(servoPosition);  // Establece la posición inicial del servo
  }


//Comprueba las lecturas de temperatura y humedad para ver si es correcto
static bool measure_environment( float *temperature, float *humidity )
{
  static unsigned long measurement_timestamp = millis( );

//mide temperatura y humedad cada 3 segundos
  if( millis( ) - measurement_timestamp > 3000ul )
  {
    if( dht_sensor.measure( temperature, humidity ) == true )
    {
      measurement_timestamp = millis( );
      return( true );
    }
  }

  return( false );
}


//Bucle del código

void loop( )
{
  float temperature;
  float humidity;

 // Mide temperatura y humedad. Si la función devuelve true, entonces hay medición disponible
  if( measure_environment( &temperature, &humidity ) == true )
  {
    lcd.setCursor(0, 0);
    lcd.print( "T = " );
    lcd.print( temperature, 1 );
    lcd.print( "C" );
    lcd.setCursor(0, 1);
    lcd.print("H = ");
    lcd.print( humidity, 1 );
    lcd.print("%");
  }
  // Mostrar el contador de días en la pantalla LCD
  lcd.setCursor(10, 1);
  lcd.print("Dia:");
  lcd.print(daysCounter);

  // Verificar si ha pasado un día completo
  unsigned long currentTime = millis();
  if (currentTime - lastDayIncrementTime >= 86400000ul)  // 86400000 milisegundos = 24 horas
  {
    daysCounter++;
    lastDayIncrementTime = currentTime;
  }
    // Control de humedad cada 3 horas
  if (currentTime - lastHumidityControlTime >= 10800000ul)  // 10800000 milisegundos = 3 horas
  {
    if (humidity < 65)
    {
      digitalWrite(4, HIGH);  // Activa el pin 4
      delay(3000);  // Mantiene el pin 4 activo durante 3 segundos
      digitalWrite(4, LOW);  // Desactiva el pin 4
      lastHumidityControlTime = currentTime;
    }
  }
  // Control de servo cada 6 horas, pero solo si no ha pasado el día 19
  if (daysCounter < dayToDisableServo && currentTime - lastServoControlTime >= 21600000ul)  // 21600000 milisegundos = 6 horas
  {
    if (currentTime - servoMovementStartTime >= servoMovementDuration)
    {
      servoPosition = (servoPosition == 0) ? 90 : 0;
      myservo.write(servoPosition);
      servoMovementStartTime = currentTime;
    }
    lastServoControlTime = currentTime;
  }
  // Control de la temperatura
    if (temperature < 37.7) {
    digitalWrite(3, HIGH);
  } else if (temperature > 38.0) {
    digitalWrite(3, LOW);
  }

}

No hay comentarios:

Publicar un comentario