Alumno: Carlos Prieto Herranz
Curso: 2021/2022
Universidad de Salamanca
Máster Universitario en Profesor de Educación Secundaria Obligatoria y Bachillerato, Formación Profesional y Enseñanza de Idiomas
Asignatura: Innovación Docente en la asignatura de Tecnología
Descripción del proyecto
Este proyecto consiste básicamente en una barrera de un parking, que se abre y se cierra en función de diferentes entradas. Una vez que el coche llega a la puerta del parking, se detecta con un ultrasonidos su presencia, y en ese momento, se sube la barrera poco a poco, para dejarle pasar. Al mismo tiempo, la luz roja empieza a parpadear, signo de que aún no se puede pasar y además existe una señal acústica para reforzarlo. Una vez que la barrera alcanza el punto más alto, el semáforo se pone en verde y la barrera se mantiene abierta, hasta el momento en el que se asegura que el coche ha entrado por completo en el parking. Para poder cerciorarlo, se dispone una ldr en el suelo del parking, que en todo momento se encuentra iluminada por un foco, por lo que una vez que pase el coche por encima, la luminosidad que recibe la ldr, será mucho menor, y en ese momento, la barrera comenzará a bajar al mismo tiempo que el semáforo vuelve a parpadear con luz roja y suena una señal acústica. Este proyecto, podría encuadrarse dentro de la asignatura de Tecnología de 4º ESO.
Entradas: 1 ldr y 1 sensor de ultrasonidos.
Salidas: 2 led (1 roja y 1 verde), 1 servomotor y 1 zumbador.
Otros componentes: Placa de arduino, cables, protoboard y resistencias.
Vídeo explicativo
Esquema de conexiones con Tinkercad
Código
//Se incluyen las liberías a utilizar
#include "SR04.h"
#include "Servo.h"
//Se introduce el número del pin de cada elemento como variables enteras
int ldr=A0;
int ledroja=4;
int ledverde=2;
int timbre=12;
//Se define la variable luz, que se utilizará en la LDR
int luz;
//La librería del ultrasonidos permite asignar directamente trig y echo a los pines correspondientes
#define TRIG_PIN 9
#define ECHO_PIN 8
//Se obtiene una salida para la entrada de los dos pines del ultrasonidos
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
//Se define la variable a, que será la distancia que detecta el ultrasonidos
long a;
//Con la librería del servo, se define la variable del servo, en este caso motor, y se define también su posición inicial
Servo motor;
int position=45;
//Se inicializa el setup
void setup() {
Serial.begin(9600); //Se conecta la consola
delay(1000); //Se retrasa 1 s
motor.attach(10); //Con la librería del servo, se conecta al pin correspondiente
//Las variables enteras asignadas previamente se definen como entradas o salidas
pinMode(ldr,INPUT);
pinMode(ledroja,OUTPUT);
pinMode(ledverde,OUTPUT);
pinMode(timbre,OUTPUT);
//Se establece la posición inicial del motor
motor.write(position);
}
//Se inicializa el loop, que se repetirá de manera cíclica cuando se cargue a la placa
void loop() {
//Medida de la distancia del ultrasonidos
a=sr04.Distance(); //La variable a, será la distancia que mide el ultrasonidos
Serial.print(a); //Se imprime en la consola la distancia
Serial.println("cm"); //Se imprime en la consola cm y se pide que se de un salto de línea
//Medida de la luminosidad con la ldr
luz=analogRead(A0); //Se guarda en luz, la lectura del ldr
Serial.println(luz); //Se imprime la lectura del ldr
//Situación del servo
Serial.print(position); //Se imprime la posición de la barrera
Serial.println("grados"); //Se imprime después del número, la palabra "grados"
delay(500); //Se retrasa 0,5 s entre lecturas de posición
digitalWrite(ledroja,HIGH); //La luz roja estará activada
digitalWrite(ledverde,LOW); //La luz verde estará desactivada
if (a<=10){ //Se pone un condicional, si la distancia es menor de 10 cm, detecta la presencia de un coche
for (position=45; position<135;) //Se introduce un ciclo for, que va desde 45, que es la posición inicial a la posición final de la barrera
{
digitalWrite(ledroja,HIGH);
delay(500);
digitalWrite(ledroja,LOW); //Con estas tres últimas sentencias, se permite que la luz roja parpadee
tone(timbre,260,2000); //Al mismo tiempo que parpadea la luz, suena un timbre
delay(500); //Se introduce un retardo de 0,5s
position=position+10; //A la variable posición se le suma en cada vuelta 10 grados
motor.write(position); //Con la variable position que va cambiando, se permite mover el motor
delay(50);
}
//En este punto, la barrera está ya arriba
digitalWrite(ledroja,LOW); //La luz roja se apaga
digitalWrite(ledverde,HIGH); //La luz verde se enciende
while(luz>150){ //Con un while conseguimos que mientras la luz sea mayor que un valor de 150, no se baje la barrera, dado que el coche aún no ha pasado por encima de la ldr
luz=analogRead(A0); //Hacemos una lectura de la luminosidad con la ldr
Serial.println(luz); //Imprimimos el valor en la consola
delay(10);} //Dejamos un breve tiempo para evitar que el coche pase por encima y no detectemos que se oscurece
//Cuando salimos del while, implica que la luminosidad ha bajado, y que el coche ha pasado por encima, por lo que
//hay que bajar la barrera
delay(2000); //Dejamos 2 s para asegurar que el coche haya pasado completamente
digitalWrite(ledverde,LOW); //Apagamos la luz verde
for (position=134; position>45;) //Para el rango de posiciones desde 134 a 45:
{
digitalWrite(ledroja,HIGH);
delay(500);
digitalWrite(ledroja,LOW); //Volvemos a hacer que la luz roja parpadee
tone(timbre,260,2000); //Al mismo tiempo hacemos que el timbre suene
delay(500);
position=position-10; //En cada vuelta, le restamos 10 grados a la posición
motor.write(position); //Movemos el motor a la nueva posición
Serial.print(position); //Se imprime la posición de la barrera
Serial.println("grados"); //Se imprime después del número, la palabra "grados"
delay(50);
}
}
}