CONTROL DE UN ESTACIONAMIENTO

Publicado: julio 27, 2010 en MICROCONTROLADORES

PARQUEADERO ELECTRONICO

MICROPROCESADORES,

Marcelo Ramírez

soymarcelo88@hotmail.com

REQUERIMIENTOS  DE LA PRÁCTICA

Realizar un sistema con base en un microcontrolador que indique el estado de un estacionamiento.

FUNCIONALIDAD:

Indicar si hay cupo o no en un estacionamiento con el control del encendido de dos letreros luminosos (leds de fondo). El cupo máximo es de 60 autos, y la cantidad actual de autos debe indicarse en una LCD 2*16. Además en la LCD se visualizara en una línea un reloj digital.

Los sensores nos generan una señal activa en bajo (Hacer uso de interrupciones externas) cuando un auto está pasando frente a ellos. Se colocan dos para poder determinar si un auto está entrando o saliendo. Cuando  entre o salga un vehículo presentar un mensaje en la LCD que indique estos eventos, también se enviara un mensaje hacia un computador.

Para la TX de datos  utilizar el modulo UART (Comunicación serial asíncrona) del microcontrolador para transmitir hacia el   computador  la siguiente información:

Ingreso _ salida / Número de vehículos / Estado (lleno _ hay lugar)/ Tiempo (hora)

Cuando el sistema se enciende, no hay autos dentro del estacionamiento, los visualizadores deben mostrar 00 y la salida HAY LUGAR debe estar activa.

DESARROLLO:

Se sugiere realizar pruebas por separado al hardware, las evaluaciones propuestas son:

1. Prueba del LCD.

2. Prueba de la transmisión serial, enviando una cadena constante desde el micro a la PC. Si se realizan estas pruebas, se tendrá la certeza de que el hardware funciona por completo y solo restará el desarrollo del programa final del sistema.

TRABAJO FINALIZADO

El microcontrolador se programó en CodevisionAVR, y se simuló en Proteus:

1era FASE._ LCD 16*2 que visualiza un reloj digital y si hay o no cupo en el estacionamiento (60 vehículos max.)

2da FASE._ Leds indicadores de estado

3ra FASE._ Conexión serial, del microcontrolador al PC

4ta FASE._ Sensores que detectan el ingreso de vehículos (utilize switch’s en Proteus), se pueden utilizar ultrasonidos, infrarojos, etc…

5ta FASE._ Programación del microcontrolador Atmega32

PROYECTO EN FUNCIONAMIENTO

CÓDIGO EN C:

/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.7 Evaluation
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : CONTROL DE UN ESTACIONAMIENTO
Version :
Date    : 18/01/2009

Authors : Marcelo Vicente Ramírez

Company : UTPL
Comments:

Chip type           : ATmega32
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 512
*****************************************************/

#include <mega32.h> //librería del microcontrolador Atmega 32
#include <delay.h>  //
#include <stdio.h>  //
#include <lcd.h> //Librería de la pantalla lcd 16*2
#define HAY_LUGAR PORTB.0 //Setear el puerto B.0 como la variable HAY_LUGAR
#define CUPO_LLENO PORTB.1 //Setear el puerto B.1 como la variable CUPO_LLENO

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm

static unsigned int time_count;  /*.5 second counter*/
int seg1,seg2,min1=8,min2=4,hor1=1,hor2=1,unidad=0,decena=0,a,b;

//PROCESO PARA EL RELOJ DIGITAL_____________________________________
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
TCNT0 = 6; /*set for 250 us timeout*/
++time_count;  /*increment 1 second counter*/
if (time_count == 4000) {
time_count = 0;  /*reset time counter for next .5 second*/
seg1++;
if (seg1>9) {
seg1=0;
seg2++;
if (seg2>5) {
seg2=0;
min1++;
if (min1>9) {
min1=0;
min2++;
if (min2>5) {
min2=0;
hor1++;
if (hor1>9) {
hor1=0;
hor2++;
}
}
}
}
}
}
if ((hor2==2&&hor1==3)&&(min2==5&&min1==9)&&(seg2==5&&seg1==9)) {
hor2=hor1=min2=min1=seg2=seg1=0;
}
}

//_________________________________________________________________

interrupt[EXT_INT0]  void ext_int0_isr(void) {
a=1;
unidad++;

if(decena==6&&unidad==1){
unidad=0;
decena=6;
}
if(unidad>9){
unidad=0;
decena++;
}
printf(“\n\rVEHICULO INGRESANDO// NUMERO DE VEHICULOS=[%d%d]”,decena,unidad);
printf(“//HORA=[%d%d:%d%d:%d%d]”,hor2,hor1,min2,min1,seg2,seg1);
if(decena==6&&unidad==0){
printf(“//CUPO LLENO”);
}
else{
printf(“//HAY LUGAR”);
}
PORTB.2=1;
delay_ms(200);
PORTB.2=0;
}
interrupt[EXT_INT1]  void ext_int1_isr(void) {

b=1;
unidad–;

if(unidad<0&&decena!=0){
unidad=9;
decena=decena-1;
}
if(decena==0&&unidad<0){
unidad=0;
decena=0;
}

printf(“\n\rVEHICULO SALIENDO  // NUMERO DE VEHICULOS=[%d%d]”,decena,unidad);
printf(“//HORA=[%d%d:%d%d:%d%d]”,hor2,hor1,min2,min1,seg2,seg1);
if(decena==6&&unidad==0){
printf(“//CUPO LLENO”);
}
else{
printf(“//HAY LUGAR”);
}

PORTB.2=1;
delay_ms(400);
PORTB.2=0;

}

void main (void) {
unsigned char lcd[9];
unsigned char cupo[9];
DDRB=0xFF;

GICR=192;  // 2 interrupciones
MCUCR=0b1111; // Detenciòn de las interrupciones (INT0,INT1) por flanco de bajada

/*set timer 0 prescaler to clk/8*/
TCCR0=0x02;
TCNT0=0x00;
OCR0=0x00;

/* unmask  Timer 0 overflow interrupt*/
TIMSK=0x01;

UCSRB=0b00011000; //UCR=0x18; habilitacion de transmision, recepcion
UBRRH=0x00; //UBRR=0x33;
UBRRL=0b110011;  //UBRR=0x33 para 8MH a 9600

/* enable interrupts */
#asm(“sei”)

lcd_init(16);// 16×2
seg1=0;
printf(“\n\r   ———————————————————————“);
printf(“\n\r   [    [    [   [  [ [[[ PARQUEADERO ELECTRONICO ]]] ]  ]   ]    ]    ]”);
printf(“\n\r   ———————————————————————“);
printf(“\n\n\r\r//—-BIENVENIDO—// NUMERO DE VEHICULOS=[%d%d]”,decena,unidad);
printf(“//HORA=[%d%d:%d%d:%d%d]”,hor2,hor1,min2,min1,seg2,seg1);
if(decena==6&&unidad==0){
printf(“//CUPO LLENO”);
}
else{
printf(“//HAY LUGAR”);
}

//PROGRAMA PRINCIPAL_________________________________________

    while(1) {
//RELOJ
lcd_gotoxy(8,1);
sprintf(lcd,”%d%d:%d%d:%d%d”,hor2,hor1,min2,min1,seg2,seg1);
lcd_puts(lcd);
//CUPO
lcd_gotoxy(2,0); //fila,columna
sprintf(cupo,”VEHICULOS=[%d%d]”,decena,unidad);
lcd_puts(cupo);
if(decena>5){
HAY_LUGAR=0;
CUPO_LLENO=1;
}
else{
HAY_LUGAR=1;
CUPO_LLENO=0;
}
while(a==1){
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“INPUT..”);
delay_ms(400);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“NPUT…”);
delay_ms(100);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“PUT….”);
delay_ms(100);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“UT…..”);
delay_ms(100);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“T……”);
delay_ms(100);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“…….”);
delay_ms(100);
lcd_clear();
a=0;
}
while(b==1){
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“OUTPUT.”);
delay_ms(400);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“UTPUT..”);
delay_ms(100);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“TPUT…”);
delay_ms(100);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“PUT….”);
delay_ms(100);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“UT…..”);
delay_ms(100);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“T……”);
delay_ms(50);
lcd_gotoxy(0,1); //fila,columna
lcd_putsf(“…….”);
delay_ms(50);
lcd_clear();
b=0;
}
}
}

//FIN DEL PROGRAMA_____________________________________

//El código es básico, por lo que he omitido algunos comentarios

//Todo comentario empieza con los símbolos //

//Se aprecia sugerencias y comentarios🙂

comentarios
  1. Franklin dice:

    Muy interesante la propuesta, espero que me puedas ayudar para hacer algo parecido a tu proyecto en mi universidad

  2. keisceismary dice:

    y como puedo ver el codigo.-

  3. juan dice:

    disculpa mi ignorante pregunta ,pero tengo un proyecto de fin de curso referente a este tema y pues le entiendo a tu codigo pero no se como se va a implementar una interfaz grafica en Proteus…..??? Te agradeceria de ante mano..

  4. juan dice:

    soy nuevo en esto de proteus y ademas no se mucho de electronica por q no es lo mio pero tengo un proyecto q es de esto mismo pero quisiera q si talvez puedes dar una mejor explicacion de esto….. xfa 🙂

  5. LLANOS FABIO dice:

    MUY BUENA LA PROPUESTA…. espero puedas guiarme….
    como obteng el programa

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s