Sistema de estacionamiento Inteligente de automóviles con Arduino
Introducción
En esta ocasión aprenderemos a cómo crear un sistema de estacionamiento de automóviles utilizando una placa de microcontrolador Arduino, una pantalla LCD I2C 20×4 , un servomotor MG955 y 7 sensores IR. El sistema de estacionamiento ayudará a automatizar el proceso de estacionamiento de un automóvil al proporcionar información en tiempo real y guiar al conductor a través del espacio de estacionamiento. Discutiremos los componentes utilizados, sus funcionalidades y cómo trabajan juntos para crear un sistema de estacionamiento eficiente.
Componentes necesarios
Arduino uno
2.siete sensores infrarrojos
3.Pantalla LCD 20×4 con I2C
4.Servomotor
5.Cables jumper
6.fuente de alimentación de 9V a 12V
Diagrama de circuito
Pasos para su montaje
Paso 1.Conecte los pines VCC y GND de los sensores IR a los pines 5V y GND de la placa Arduino, respectivamente.
Paso 2.Conecte los pines de señal de los sensores IR (entrada_de_carro, salida_de_carro, carro1 asta llegar al pin del carro5) a cualquier pin de entrada digital disponible en el Arduino en este caso hemos utilizado los siguientes ( pines 2, 4, 5, 6, 7, 8,9) respectivamente.
Paso 3. Conecte el cable de señal del servomotor a un pin de salida digital en el Arduino ( pin 3 ).
Paso 4.Conecte los pines SDA y SCL del módulo de pantalla LCD llamada (Adaptador I2C) a los pines SDA y SCL correspondientes en el Arduino ( A4 y A5 para la mayoría de las placas Arduino).
Paso 5.Conecte los pines VCC y GND del módulo de pantalla LCD(Adaptador I2C) a los pines 5V y GND de la placa Arduino, respectivamente.
Una vez que se realizan las conexiones del circuito, puede cargar el código provisto en la placa Arduino utilizando el IDE de Arduino. El código inicializa los sensores, el servomotor y la pantalla LCD en la función de configuración(). La función loop() lee continuamente las entradas del sensor, actualiza la pantalla LCD y controla el servomotor en función de las lecturas del sensor.
Código fuente
Bibliotecas requeridas
El código utiliza tres bibliotecas: Servo, Wire y LiquidCrystal_I2C. La Servo biblioteca se utiliza para controlar el servomotor, la Wire biblioteca permite la comunicación I2C y la LiquidCrystal_I2C biblioteca permite el control de la pantalla LCD.
//proyecto Estacionamiento inteligente :mat ingenio
//apoya ami canal dando like y suscribiendte
#include <Servo.h> // Incluir la librería para el servo motor
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 4); // Crear un objeto para controlar la pantalla LCD
Servo myservo; // Crear un objeto para controlar el servo motor
#define entrada_de_carro 2 // Pin de entrada para detectar la llegada de un carro
#define salida_de_carro 4 // Pin de entrada para detectar la salida de un carro
#define carro1 5 // Pin de entrada para detectar la presencia de un carro en el espacio 1
#define carro2 6 // Pin de entrada para detectar la presencia de un carro en el espacio 2
#define carro3 7 // Pin de entrada para detectar la presencia de un carro en el espacio 3
#define carro4 8 // Pin de entrada para detectar la presencia de un carro en el espacio 4
#define carro5 9 // Pin de entrada para detectar la presencia de un carro en el espacio 5
int S1 = 0, S2 = 0, S3 = 0, S4 = 0, S5 = 0; // Variables para almacenar el estado de ocupación de cada espacio de estacionamiento
int sensor1 = 0, sensor2 = 0; // Variables para controlar el estado de los sensores
int NdeEspacios = 5; // Variable para almacenar el número de espacios disponibles
void setup() {
Serial.begin(9600); // Iniciar la comunicación serial
pinMode(carro1, INPUT); // Configurar el pin del carro1 como entrada
pinMode(carro2, INPUT); // Configurar el pin del carro2 como entrada
pinMode(carro3, INPUT); // Configurar el pin del carro3 como entrada
pinMode(carro4, INPUT); // Configurar el pin del carro4 como entrada
pinMode(carro5, INPUT); // Configurar el pin del carro5 como entrada
pinMode(entrada_de_carro, INPUT); // Configurar el pin de entrada_de_carro como entrada
pinMode(salida_de_carro, INPUT); // Configurar el pin de salida_de_carro como entrada
myservo.attach(3); // Conectar el servo motor al pin 3
myservo.write(90); // Posicionar el servo motor en la posición inicial
lcd.begin(16, 4); // Inicializar la pantalla LCD
lcd.setCursor(0, 1);
lcd.print(" Aparcamiento ");
lcd.setCursor(0, 2);
lcd.print(" de coches ");
delay(1000);
lcd.clear();
Read_Sensor(); // Leer el estado de los sensores de ocupación de los espacios de estacionamiento
int total = S1 + S2 + S3 + S4 + S5; // Calcular el número total de espacios ocupados
NdeEspacios = NdeEspacios - total; // Calcular el número de espacios disponibles
}
void loop() {
Read_Sensor(); // Leer el estado de los sensores de ocupación de los espacios de estacionamiento
lcd.setCursor(0, 0);
lcd.print("N°deEspacios: ");
lcd.print(NdeEspacios);
lcd.print(" ");
lcd.setCursor(0, 1);
if (S1 == 1) {
lcd.print("S1:ocupado ");
} else {
lcd.print("S1:vacio");
}
lcd.setCursor(10, 1);
if (S2 == 1) {
lcd.print(" S2:ocupado ");
} else {
lcd.print(" S2:vacio");
}
lcd.setCursor(0, 2);
if (S3 == 1) {
lcd.print("S3:ocupado ");
} else {
lcd.print("S3:vacio");
}
lcd.setCursor(10, 2);
if (S4 == 1) {
lcd.print(" S4:ocupado ");
} else {
lcd.print(" S4:vacio");
}
lcd.setCursor(0, 3);
if (S5 == 1) {
lcd.print("S5:ocupado");
} else {
lcd.print("S5:vacio");
}
if (digitalRead(entrada_de_carro) == 0 && sensor1 == 0) { // Si se detecta la llegada de un carro
if (NdeEspacios > 0) { // Si hay espacios disponibles
sensor1 = 1;
if (sensor2 == 0) {
myservo.write(180); // Abrir el estacionamiento
NdeEspacios = NdeEspacios - 1; // Decrementar el número de espacios disponibles
}
} else {
lcd.setCursor(0, 0);
lcd.print("Estacionamiento lleno ");
delay(1500);
}
}
if (digitalRead(salida_de_carro) == 0 && sensor2 == 0) { // Si se detecta la salida de un carro
sensor2 = 1;
if (sensor1 == 0) {
myservo.write(180); // Abrir el estacionamiento
NdeEspacios = NdeEspacios + 1; // Incrementar el número de espacios disponibles
}
}
if (sensor1 == 1 && sensor2 == 1) { // Si se han detectado la llegada y salida de un carro
delay(1000);
myservo.write(90); // Cerrar el estacionamiento
sensor1 = 0;
sensor2 = 0;
}
delay(1);
}
void Read_Sensor() {
S1 = !digitalRead(carro1); // Leer el estado del sensor del carro1 y almacenarlo en la variable S1 (0 para ocupado, 1 para vacío)
S2 = !digitalRead(carro2); // Leer el estado del sensor del carro2 y almacenarlo en la variable S2 (0 para ocupado, 1 para vacío)
S3 = !digitalRead(carro3); // Leer el estado del sensor del carro3 y almacenarlo en la variable S3 (0 para ocupado, 1 para vacío)
S4 = !digitalRead(carro4); // Leer el estado del sensor del carro4 y almacenarlo en la variable S4 (0 para ocupado, 1 para vacío)
S5 = !digitalRead(carro5); // Leer el estado del sensor del carro5 y almacenarlo en la variable S5 (0 para ocupado, 1 para vacío)
}
Definiciones de pines
El código define los números de pin para los diversos sensores y componentes utilizados en el sistema. Estos incluyen entrada_de_carro y salida_de_carro para los sensores infrarrojos en la entrada y salida, respectivamente, y tambien de los pines de carro1 asta carro5 los sensores infrarrojos en cada lugar de estacionamiento.
#define entrada_de_carro 2 // Pin de entrada para detectar la llegada de un carro
#define salida_de_carro 4 // Pin de entrada para detectar la salida de un carro
#define carro1 5 // Pin de entrada para detectar la presencia de un carro en el espacio 1
#define carro2 6 // Pin de entrada para detectar la presencia de un carro en el espacio 2
#define carro3 7 // Pin de entrada para detectar la presencia de un carro en el espacio 3
#define carro4 8 // Pin de entrada para detectar la presencia de un carro en el espacio 4
#define carro5 9 // Pin de entrada para detectar la presencia de un carro en el espacio 5
Inicialización de variables
El código inicializa las variables para realizar un seguimiento de la ocupación del espacio de estacionamiento ( S1, S2, S3,S4 y S5), así como las banderas ( sensor1 y sensor2) y el número total de espacios disponibles ( Ndeespacios).
Función de configuración
La setup()función se llama una vez al principio del programa.
Inicializa la comunicación en serie, establece los modos de pin para los sensores, conecta el servomotor e inicializa la pantalla LCD.
La pantalla LCD muestra mensajes introductorios durante unos segundos y luego calcula el número inicial de espacios disponibles.
pinMode(carro1, INPUT); // Configurar el pin del carro1 como entrada
pinMode(carro2, INPUT); // Configurar el pin del carro2 como entrada
pinMode(carro3, INPUT); // Configurar el pin del carro3 como entrada
pinMode(carro4, INPUT); // Configurar el pin del carro4 como entrada
pinMode(carro5, INPUT); // Configurar el pin del carro5 como entrada
pinMode(entrada_de_carro, INPUT); // Configurar el pin de entrada_de_carro como entrada
pinMode(salida_de_carro, INPUT); // Configurar el pin de salida_de_carro como entrada
myservo.attach(3); // Conectar el servo motor al pin 3
myservo.write(90); // Posicionar el servo motor en la posición inicial
Función de bucle
La loop()función a se llama repetidamente después de la setup()función.
Comienza llamando a la Read_Sensor()función para actualizar las variables de ocupación de slots ( S1, S2, S4 y S5).
La pantalla LCD muestra el número de espacios disponibles y el estado (vacío/lleno) de cada espacio.
Si el sensor de infrarrojos de la entrada ( entrada_de_carro) detecta un carro y sensor1 no está configurado, comprueba si hay espacios disponibles. Si es así, establece sensor1 y abre la puerta girando el servomotor a 180 grados. También reduce el número de espacios disponibles ( Ndeespacios) en 1 asi sucesivamente asta que ya no queden.
Si el sensor de infrarrojos en la salida ( salida_de_carro) detecta un automóvil y sensor2 no está armado, lo arma sensor2 y abre la puerta girando el servomotor a 180 grados. Aumenta el número de espacios disponibles ( Ndeespacios) en 1.
Una vez que ambas banderas ( sensor1 y sensor2) estén configuradas, y la puerta se cierre girando el servomotor de nuevo a 90 grados.
El ciclo termina con un pequeño retraso antes de comenzar de nuevo.
Read_Sensor(); // Leer el estado de los sensores de ocupación de los espacios de estacionamiento
lcd.setCursor(0, 0);
lcd.print("N°deEspacios: ");
lcd.print(NdeEspacios);
lcd.print(" ");
lcd.setCursor(0, 1);
if (S1 == 1) {
lcd.print("S1:ocupado ");
} else {
lcd.print("S1:vacio");
}
lcd.setCursor(10, 1);
if (S2 == 1) {
lcd.print(" S2:ocupado ");
} else {
lcd.print(" S2:vacio");
}
lcd.setCursor(0, 2);
if (S3 == 1) {
lcd.print("S3:ocupado ");
} else {
lcd.print("S3:vacio");
}
lcd.setCursor(10, 2);
if (S4 == 1) {
lcd.print(" S4:ocupado ");
} else {
lcd.print(" S4:vacio");
}
lcd.setCursor(0, 3);
if (S5 == 1) {
lcd.print("S5:ocupado");
} else {
lcd.print("S5:vacio");
}
if (digitalRead(entrada_de_carro) == 0 && sensor1 == 0) { // Si se detecta la llegada de un carro
if (NdeEspacios > 0) { // Si hay espacios disponibles
sensor1 = 1;
if (sensor2 == 0) {
myservo.write(180); // Abrir el estacionamiento
NdeEspacios = NdeEspacios - 1; // Decrementar el número de espacios disponibles
}
} else {
lcd.setCursor(0, 0);
lcd.print("Estacionamiento lleno ");
delay(1500);
}
}
if (digitalRead(salida_de_carro) == 0 && sensor2 == 0) { // Si se detecta la salida de un carro
sensor2 = 1;
if (sensor1 == 0) {
myservo.write(180); // Abrir el estacionamiento
NdeEspacios = NdeEspacios + 1; // Incrementar el número de espacios disponibles
}
}
if (sensor1 == 1 && sensor2 == 1) { // Si se han detectado la llegada y salida de un carro
delay(1000);
myservo.write(90); // Cerrar el estacionamiento
sensor1 = 0;
sensor2 = 0;
}
delay(1);
Función de lectura del sensor
La Read_Sensor()función a se llama dentro de la loop()función.
Lee los sensores infrarrojos en cada espacio de estacionamiento ( carro1 al carro5) y actualiza las variables de ocupación de los espacios correspondientes ( S1 al S5) en consecuencia.
void Read_Sensor() {
S1 = !digitalRead(carro1); // Leer el estado del sensor del carro1 y almacenarlo en la variable S1 (0 para ocupado, 1 para vacío)
S2 = !digitalRead(carro2); // Leer el estado del sensor del carro2 y almacenarlo en la variable S2 (0 para ocupado, 1 para vacío)
S3 = !digitalRead(carro3); // Leer el estado del sensor del carro3 y almacenarlo en la variable S3 (0 para ocupado, 1 para vacío)
S4 = !digitalRead(carro4); // Leer el estado del sensor del carro4 y almacenarlo en la variable S4 (0 para ocupado, 1 para vacío)
S5 = !digitalRead(carro5); // Leer el estado del sensor del carro5 y almacenarlo en la variable S5 (0 para ocupado, 1 para vacío)
}
luego de aver realizado el codigo tenemos que verificar si compila nuestro programa para eso verificamos aqui:
luego de haber compilado nuestro trabajo copiamos la dirección para poder pegar en nuestro proteus
primero que todo realizamos el proyecto en proteus:
luego de haber realizado el código pasamos a nuestro proteus:
realizamos nuestro proteus colocando todo los componentes a utilizar
construimos nuestro proyecto en proteus
ojo: el proyecto en proteus lo realizado de dos maneras la primera utilizando el sensor infrarrojo en proteus el cual pueden obtener sus librerías dando clip aquí sensor infrarrojo .Pero me funciona muy lento por motivos de que mi proteus no es el original por eso lo echo con otra forma que es mas rápido pero en tu representación real funciona normal...
esta seria la otra forma que lo realizado donde el LOGICSTATE representa nuestros sensores infrarrojos ,donde tiene la misma funcionabilidad asi que tranquilo realizalo cualquiera...
vemos el funcionamiento:
primero damos clip en la tarjeta del Arduino y ponemos editar propiedades o simplemente damos doble clip y donde dice program file: colocamos la dirección y luego aceptar.
psdta: ayi en la imagen esta señalada en donde debemos pegar la dirección copiada de nuestro código.
vemos como funciona :)
Conclusión
Con el uso de una pantalla LCD I2C 20×4, un servomotor, un sensor IR y un Arduino, podemos crear un sistema de estacionamiento de automóviles que automático el proceso de estacionamiento y mejore la experiencia general del usuario. Dicho sistema no solo proporciona información en tiempo real a los conductores, sino que también mejora la gestión del espacio de estacionamiento y reduce la necesidad de intervención manual.
Con más mejoras, este sistema se puede expandir para manejar múltiples espacios de estacionamiento, integrarse con aplicaciones móviles o incorporar funciones avanzadas como sistemas de pago automático.
Más tutoriales de Arduino