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.
Cables macho - macho y protoboard.
/*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
No hay comentarios:
Publicar un comentario