Sistema de estacionamiento Inteligente de automóviles con Arduino


FacebookTwitterPinterestLink

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

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

link de descarga de código:

//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

#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

Función de configuración


  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


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


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

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

Más tutoriales de Arduino