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);
  }

}

jueves, 18 de enero de 2024

Dispositivo de asistencia en el aparcamiento y evacuación de gases inflamables



Alumno: D. David García Martín

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

PROYECTO




Descripción del proyecto:

El dispositivo que se ha creado tiene la finalidad de prestar asistencia en la maniobra de aparcamiento en de una plaza de garaje individual mediente la emisión de sonidos y luces diversas, así cómo la detección y evacuaciónde  gases inflamables que se encuentren en el habitáculo. La idea es que se encuentre intalado de forma fija en la plaza de garaje en cuestión, con el sensor de ultrasonidos apuntando al morro del coche y la pantalla LCD a una altura suficiente como para que la distancia al obstáculo, que en esta se muestra en todo momento, pueda ser visualizada sin probelmas por el conductor del vehículo. El motor de DC simula el funcionamiento de un ventilador más grande ubicado en el techo de la plaza de garaje.

Los dispositivos de entrada de información de este sistema son el sensor de ultrasonidos HC-SR04 y el sensor de gas MQ-2. En función de sus lecturas, el sistema electrónico realizará diferentes acciones.

  • Lectura del HC-SR04:

    1. Si la distancia al obstáculo (de ahora en adelante "d") es mayor de 50 cm, el LED verde permanecerá encendido y el buzzer no emitirá ningún sonido.
    2. Si 31 < d < 50 cm: el LED amarillo comenzará a parpadear a una velocidad derminada y el buzzer emitirá un sonido de 1600 Hz y 400 ms de duración.
    3. Si 10 < d < 30 cm: el LED rojo comenzará a parpadear a una velocidad más rápida que en el caso anterior y el buzzer emitirá un sonido de 1200 Hz y 150 ms de duración.
    4. Si 0 < d < 9 cm: todos los LED parpadearán al unísono a una velocidad mayor que en los casos anteriores y el buzzer emitirá un sonido de 800 Hz y 50 ms de duración.
  • Lectura del MQ-2: Si el nivel de gas supera un umbral determinado por la calibración del propio sensor, éste emitirá una señal digital del tipo LOW al Arduino. Cuando esto suceda el motor DC se pondrá en marcha a una velocidad constante (señal PWM de 200), de manera que evacuará el gas inflamable del habitáculo. Una vez que la concentración del gas haya disminuido lo suficiente como para que no se active el sensor MQ-2, el motor se parará.


Componentes:

x1 Arduino MEGA 2560

x1 motor DC

x1 transistor NPN PN2222

x1 diodo rectificador

x1 resistencia de 330 Ω

x1 sensor de ultrasonidos HC-SR04

x1 buzzer pasivo

x1 pantalla LCD de 16x2

x1 sensor de gas MQ-2

x3 LED (rojo, amarillo y verde)

x1 potenciómetro de 10 kΩ

x3 resistencias de 220 Ω

Cables macho - macho y protoboard.


ESQUEMA DE CONEXIONES






CÓDIGO ARDUINO


/*Trabajo autónomo Innovación Docente  | MUPES  | Curso 2023/24.
Título: SENSOR DE APARCAMIENTO CON DETECCIÓN DE GAS INFLAMABLE
AUTOR: DAVID GARCÍA MARTÍN   dagama@usal.es
*/

#include <LiquidCrystal.h> //Incluyo la librería correspondiente para utilizar la pantalla LCD.

//Defino los pines de la pantalla LCD de 16x2 y se asigna
const int rs = 5, en = 6, d4 = 7, d5 = 8, d6 = 9, d7 = 10;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//Inicializo constantes enteras globales que son el número al que se conecta el elemento que da nombre a la constante entera
const int pinTRIG =2;   //Al pin 2 conecto TRIGGER del sensor ultrasónico
const int pinECCO = 3;  //Al pin 3 conecto ECCO del sensor ultrasónico
const int ledVERDE = 22;  //Al pin 22 conecto el LED verde
const int ledAMARILLO = 23;   //Al pin 23 conecto el LED amarillo
const int ledROJO = 24;   //Al pin 24 conecto el LED rojo
const int buzzer = 4;   //Al pin 4 conecto el buzzer pasivo
const int motor = 11;   //Defino pin motor
const int pingas = 50;  //Defino pin del sensor de gas
//Defino las variables necersarias para el cálculo de la distancia con el sensor ultrasónico
long duracion;  //Variable numérica global de tipo long
int distancia;  //Variable numérica global de tipo entera


void setup() {//Pasos que se ejecutan en el arranque del Arduino MEGA
  // Inicializo los pines que voy a usar y los configuro como entradas o salidas según corresponda
  pinMode(pinTRIG, OUTPUT);   //Configuro el pin "pinTRIGG" como pin de salida
  pinMode(pinECCO, INPUT);    //Configuro el pin "pinECCO" como pin de entrada
  pinMode(ledVERDE, OUTPUT);    //Configuro el pin "ledVERDE" como pin de salida
  pinMode(ledAMARILLO, OUTPUT);   //Configuro el pin "ledAMARILLO" como pin de salida
  pinMode(ledROJO, OUTPUT);   //Configuro el pin "ledROJO" como pin de salida
  pinMode(buzzer, OUTPUT);    //Configuro el pin "buzzer" como pin de salida
  pinMode(pingas, INPUT);    //Configuro el pin "pingas" como pin de entrada
  pinMode(motor, OUTPUT);

  //Inicializo la pantalla LCD de 16x2
  lcd.begin(16, 2);
 
  /*Inicializo el puerto serie. Con este se podrá comprobar que las lecturas que
  devuleve la pantalla LCD son correctas.*/
  Serial.begin(9600);
  analogWrite(motor, 0);  //empieza el sketch con el motor parado
}

void loop() {//Bucle principal del programa

  /*Si detecta que hay gas inflamable, activa el ventilador
  para que se vaya el gas*/

  //Genero un pulso en el pin de trigger del sensor ultrasónico
  digitalWrite(pinTRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(pinTRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(pinTRIG, LOW);
 

  //Mido la duración del eco del sensor ultrasónico y calculo la distancia
  duracion = pulseIn(pinECCO, HIGH);
  distancia = duracion * 0.034 / 2; //Fórmula para obtener la distancia en cm al obstáculo

  //Muestro en monitor serial la distancia medida por el sensor ultrasónico
  Serial.print("Distancia: ");
  Serial.println(distancia);

  //En la pantalla LCD se imprime lo siguiente:
  lcd.clear();
  lcd.print("Distancia:");
  lcd.setCursor(0, 1);
  lcd.print(distancia);
  lcd.print(" cm");
 

  //Programación del funcionamiento de los LEDs y del buzzer según la distancia que mide el sensor ultrasónico:
  switch(distancia){
    case 31 ... 50: //Si la distancia al obstáculo está dentro del intervalo [21,50] cm, realiza lo siguiente:
      digitalWrite(ledVERDE, LOW);
      digitalWrite(ledAMARILLO, HIGH);  //Enciende el LED amarillo y apaga el resto
      digitalWrite(ledROJO, LOW);
      tone(buzzer, 1600);  //Emite un sonido de 500 Hz durante 500ms. Posteriormente permanece callado 500ms.
      delay(400);
      noTone(buzzer);
      delay(300);
      digitalWrite(ledAMARILLO, LOW);
      delay(10);
      break;    //sale del caso

    case 10 ... 30: //Si la distancia al obstáculo está dentro del intervalo [0,20] cm, realiza lo siguiente:
      digitalWrite(ledVERDE, LOW);
      digitalWrite(ledAMARILLO, LOW);
      digitalWrite(ledROJO, HIGH);  //Enciende el LED rojo y apaga el resto
      tone(buzzer, 1200); //Emite un sonido de 1000 Hz durante 300ms. Posteriormente permanece callado 300ms.
      delay(150);
      noTone(buzzer);
      delay(50);
      digitalWrite(ledROJO, LOW);
      delay(10);
      break;    //sale del caso

    case 0 ... 9:
      digitalWrite(ledVERDE, HIGH);
      digitalWrite(ledAMARILLO, HIGH);
      digitalWrite(ledROJO, HIGH);  //Enciende todos los LED
      tone(buzzer, 800); //Emite un sonido de 1000 Hz durante 300ms. Posteriormente permanece callado 300ms.
      delay(100);
      noTone(buzzer);
      delay(50);
      digitalWrite(ledVERDE, LOW);
      digitalWrite(ledAMARILLO, LOW);
      digitalWrite(ledROJO, LOW);
      delay(5);
      break;  //sale del caso

    default:  /*Si la distancia al obstáculo es mayor que 50 cm, es decir que no es ninguno de
              los dos intervalos anteriores, realiza lo siguiente:*/
      digitalWrite(ledVERDE, HIGH); //Enciende el LED verde y los demás permanecen apagados
      digitalWrite(ledAMARILLO, LOW);
      digitalWrite(ledROJO, LOW);
      noTone(buzzer); //No genera pitido
      break;    //sale del caso
  }


  /*Introduzco una pequeña pausa antes de que se reinicie el bucle.
  De esta manera evito que trabaje a una velocidad excesivamente alta,
  además de que se podrán visualizar las medidas con más calma*/
  delay(100);

  int estado = digitalRead(pingas); //creo una valiable de estado que recoge la señal digital del MQ-2
  if (estado == LOW) {      ////del sesnor MQ-2. Como este trabaja con lógica inversa, el código queda así.
      analogWrite(motor, 200);
  } else {
    analogWrite(motor, 0);
  }

}   // Fin del bucle


martes, 31 de enero de 2023

MINI INVERNADERO


 

 

Alumna: D. Patricia Blanco Figueredo

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: 2022/2023 

PROYECTO

 


 

DESCRIPCIÓN DEL PROYECTO 

Proyecto planteado para 3ro y 4to de la Eso en la asignatura de Tecnología. 

Este proyecto plantea un Mini invernadero que permite albergar una planta o varias, ya sean para uso culinario, como puede ser una planta de perejil, de albahaca, cilantro, tomate etc, o  plantas ornamentales que necesite una temperatura óptima todo el año. 

El sistema del min invernadero mide la humedad y la temperatura del interior, siendo la óptima de 18 a 24 grados centígrados encendiendo el led de color azul si se encuentra a esta temperatura, e indicando en la pantalla LCD "Stable". A partir de los 25 grados se encendería el led rojo y se marcaría en la pantalla LCD el mensaje "Danger". Al detectar el sensor una temperatura de más de 25 grados centígrados se activaría el Servomotor que giraría 90 grados para que la puerta superior del mini invernadero de abriese y ventilará hasta alcanzar la temperatura menor de 25 grados activando, así nuevamente el servomotor que volvería a la posición 0 que cerraría la ventana. 

 COMPONENTES

1

Arduino Uno R3

1

Posicional Microservomotor

1

LCD 16 x 2

1

250 kΩ Potenciómetro

1

Rojo LED

1

Azul LED

2

1 kΩ Resistencia

1

 Sensor de Temperatura y humedad DHT 

 
 
ESQUEMA 
 

 

 







CÓDIGO


 


#include <Servo.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11



static const int DHT_SENSOR_PIN = 3;
DHT_nonblocking dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE);

// initialize the LCD library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup()
{
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.print("Mi Planta"); //salida de texto inicio en pantalla
  lcd.setCursor(0, 2);

  Serial.begin(9600);  
  myservo.attach(2);  // pin del servo
 
}

/*
 * Poll for a measurement, keeping the state machine alive.  Returns
 * true if a measurement is available.
 */
static bool measure_environment(float *temperature, float *humidity) //estado del entorno
{
  static unsigned long measurement_timestamp = millis();

  /* Measure */
  if (millis() - measurement_timestamp > 1000ul)
  {
    if (dht_sensor.measure(temperature, humidity) == true)
    {
      measurement_timestamp = millis();
      return (true);
    }
  }

  return (false);

}

void loop()
{
 
  float temperature; // variable de temperatura decimal
  float humidity;//variable de humedad decimal

  /* Measure temperature and humidity.  If the functions returns
     true, then a measurement is available. */
  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);

    if (temperature > 24.0)
    {
      digitalWrite(5, HIGH);
      digitalWrite(4, LOW);
      lcd.print("Danger"); // mensaje que la temperatura alta peligro planta en peligro
      myservo.writeMicroseconds(1000);// se posiciona el servo en cero grados se abre la ventana
     
   
    }
    else
    {
      digitalWrite(5, LOW);
      digitalWrite(4, HIGH);
      lcd.print("Estable"); // mensaje que la temperatura idonea
       myservo.writeMicroseconds(2000);  // se posiciona el servo en 180 grados se cierra la ventana
    }

/* //-----Bucle Movimiento servo si quisieramos que la ventana se cierre y
se abra constantemente para regular temperatura---  
   for (pos = 0; pos <= 120; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 120; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }*/
   
  }
 

}