Sunteți pe pagina 1din 13

#include <avr/io.

h>
#define F_CPU 8000000UL
#include <util/delay.h> // retardos
#include <avr/interrupt.h> // interrupciones
#include <compat/deprecated.h>
#include <stdlib.h> // itoa
#include <stdio.h> // sprintf
#include "lcd.h"
#include <math.h>

unsigned int adc_read(unsigned char canal); // lee un canal


void interrupts_init(void); // inicializacion de interrupciones

volatile float lectura;


volatile float voltaje;
volatile double Rs;
volatile double alcohol;
volatile int iniciar=0;
volatile int reinicio=0;
volatile int seguir;

int main(void)
{
DDRA=0b11111100; // pin A1 sensor de gas
PORTA=0b00000011;
DDRB=0b11111110; // pin B0 switch de encendido del sistema ,B1 salida de
activacion del motor, B7 chicharra y led
PORTB=0b00000001;
DDRD=0b11110011; // pin D2 pulsador de start
PORTD=0b00001100;
interrupts_init(); // inicializacion interrupciones para pulsadores
adc_init(); // configuracion del puerto analogico/digital
lcd_init(LCD_DISP_ON); // encendido de display
sei(); // interrupciones
char buff[20];
while(1)
{
if (bit_is_clear(PINB,0)) // switch en ON
{

if (iniciar==0) // sin pulsar start


{
PORTB=PORTB&0b01111111; // apago led
PORTB=PORTB&0b10111111; // apago chicharra
lcd_init(LCD_DISP_ON); // enciendo display
lcd_clrscr(); // borro caracteres de display
lcd_gotoyx(1,1); // posiciono caracteres a
escribir en display
sprintf(buff,"PRESIONE INICIAR"); // mensaje de inicio
lcd_puts(buff); // guardo caracteres
seguir=0; // borro variable que
permite lectura del puerto analogico digital (sensor de gas)
}

if (iniciar==1) // se presiono el pulsador start


{
PORTB=PORTB&0b11111101; // bloqueo motor
PORTB=PORTB&0b01111111; // apago led
PORTB=PORTB&0b10111111; // apago chicharra
lcd_init(LCD_DISP_ON); // enciendo display
lcd_clrscr(); // borro caracteres de
display
if (seguir==0) // desactivo lectura del
sensor para leer una sola vz
{
lectura=adc_read(1);
}

voltaje=lectura*5/1023; //convierto lectura del


analogico/digital a valor de voltaje
Rs=1000*((5-voltaje)/voltaje); //calculo Rs
alcohol=0.4091*pow(Rs/5463, -1.497); // calculo el nivel
de alcohol en mg/L

lcd_gotoyx(2,1); //posiciono en la pantalla


los caracteres
sprintf(buff,"NIVEL=%.2fmg/L",alcohol); //imprimo el
nivel de alcohol
lcd_puts(buff); // guardo caracteres

if (alcohol<0.3) // si el nivel es < 0.3 mg/L


{
lcd_gotoyx(1,1); //posiciono en la pantalla los
caracteres
sprintf(buff,"PUEDE CONDUCIR"); //imprimo mensaje
lcd_puts(buff); // guardo caracteres
PORTB=PORTB|0b00000010; //activo motores
PORTB=PORTB&0b10111111; //apago led y chicharra
reinicio=1;
seguir=1;

if (alcohol>=0.3 && alcohol<0.8) // si el nivel de


alcohol esta entre 0.3 y 0.8 mg/L
{
lcd_gotoyx(1,1); //posiciono en la pantalla
los caracteres
sprintf(buff,"Multa de 1 RBU"); //imprimo mensaje
lcd_puts(buff); // guardo caracteres
PORTB=PORTB&0b11111101; // desactivo motor
PORTB=PORTB|0b10000000; // enciendo chicharra y
led
//PORTB=PORTB&0b10111111;
_delay_ms(10000); // espera de 10 seg
iniciar=0; // inicializo el programa para
siguiente lectura
}
if (alcohol>=0.8 && alcohol<1.2) // si el nivel de
alcohol esta entre 0.8 y 1.2 mg/L
{
lcd_gotoyx(1,1); //posiciono en la pantalla
los caracteres
sprintf(buff,"Multa de 2 RBU"); //imprimo mensaje
lcd_puts(buff); // guardo caracteres
PORTB=PORTB&0b11111101; // desactivo motor
PORTB=PORTB|0b10000000; // enciendo chicharra y
led
//PORTB=PORTB&0b10111111;
_delay_ms(10000); // espera de 10 seg
iniciar=0; // inicializo el programa para
siguiente lectura
}
if (alcohol>=1.2) // si el nivel de alcohol es mayor 1.2
mg/L
{
lcd_gotoyx(1,1); //posiciono en la pantalla los
caracteres
sprintf(buff,"Multa de 3 RBU"); //imprimo mensaje
lcd_puts(buff); // guardo caracteres
PORTB=PORTB&0b11111101; // desactivo motor
PORTB=PORTB|0b10000000; // enciendo chicharra y
led
//PORTB=PORTB|0b01000000;
_delay_ms(10000); // espera de 10 seg
iniciar=0; // inicializo el programa para
siguiente lectura
}

_delay_ms(200); //espera de 200 ms


}

if (bit_is_set(PINB,0)) //switch en OFF


{
lcd_init(LCD_DISP_OFF); //apago LCD
PORTB=PORTB&0b11111101; //desactivo motor
PORTB=PORTB&0b01111111; //apago led y chicharra
//PORTB=PORTB&0b10111111;
iniciar=0; //inicializo programa
//reinicio=0;

}
}
}

void adc_init(void)
{
ADMUX = (1<<REFS0); // Referencia AVCC
ADCSRA = 0b11000101; //clk/64=125Khz
}

unsigned int adc_read(unsigned char canal)


{
ADMUX = (ADMUX & 0xE0)|canal; // selecciono canal
DIDR0 = (1<<canal); // activo puerto
ADCSRA |= (1<<ADSC); //activo conversor analogico digital

while(ADCSRA & (1<<ADSC)); // espero lectura

return ADC; // regreso el valor leido


}

void interrupts_init(void) //configuracion de interrupciones


{
EICRA=(1<<ISC01)|(1<<ISC11); // selecciono interrupciones int0 int1
EIMSK=(1<<0)|(1<<1); //activo interrupciones
EIFR=(1<<0)|(1<<1);
}

ISR(INT1_vect) // pulsador start


{
_delay_us(50);

iniciar=iniciar+1; // menu para reiniciar para nueva lectura si el nivel es


<0.3
if (iniciar==2)
{
iniciar=0;
}
}

//ISR(INT0_vect)
{
_delay_us(50);
iniciar=0;

}
Simulacin

LCD1
LM016L

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
1
2
3

4
5
6

7
8
9
10
11
12
13
14
RV1
LS1

RS

EN

D4
D5
D6
D7
RW
D1

11%
LED-BIRG
U1
SPEAKER 40 37
PB0/XCK0/T0/PCINT8 PA0/ADC0/PCINT0
41 36 1k
MOTOR PB1/T1/CLKO/PCINT9 PA1/ADC1/PCINT1
42 35
PB2/AIN0/INT2/PCINT10 PA2/ADC2/PCINT2
43 34
PB3/AIN1/OC0A/PCINT11 PA3/ADC3/PCINT3
44 33
PB4/SS/OC0B/PCINT12 PA4/ADC4/PCINT4
1 32
PB5/MOSI/PCINT13 PA5/ADC5/PCINT5
2 31
PB6/MISO/PCINT14 PA6/ADC6/PCINT6
3 30
PB7/SCK/PCINT15 PA7/ADC7/PCINT7
9 19
PD0/RXD0/PCINT24 PC0/SCL/PCINT16
10 20
PD1/TXD0/PCINT25 PC1/SDA/PCINT17 RS
11 21
PD2/INT0/RXD1/PCINT26 PC2/TCK/PCINT18 RW
12 22
PD3/INT1/TXD1/PCINT27 PC3/TMS/PCINT19 EN
13 23
PD4/OC1B/XCK1/PCINT28 PC4/TDO/PCINT20 D4
14 24
PD5/OC1A/PCINT29 PC5/TDI/PCINT21 D5
15 25
PD6/ICP/OC2B/PCINT30 PC6/TOSC1/PCINT22 D6
16 26
PD7/OC2A/PCINT31 PC7/TOSC2/PCINT23 D7
29 8
AREF XTAL1
27 7
AVCC XTAL2
4
RESET
ATMEGA164P
R

C2
100n

+88.8

16 8 U2
2 3
IN1 VSS VS OUT1
7 6
IN2 OUT2
1
EN1

9
MOTOR EN2
10 11
IN3 OUT3
15 14
IN4 GND GND OUT4

L293D

+88.8

Men de inicio
LCD1
LM016L

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
1
2
3

4
5
6

7
8
9
10
11
12
13
14
RV1
LS1

RS

EN

D4
D5
D6
D7
RW
D1

11%
LED-BIRG
U1
SPEAKER 40 37
PB0/XCK0/T0/PCINT8 PA0/ADC0/PCINT0
41 36 1k
MOTOR PB1/T1/CLKO/PCINT9 PA1/ADC1/PCINT1
42 35
PB2/AIN0/INT2/PCINT10 PA2/ADC2/PCINT2
43 34
PB3/AIN1/OC0A/PCINT11 PA3/ADC3/PCINT3
44 33
PB4/SS/OC0B/PCINT12 PA4/ADC4/PCINT4
1 32
PB5/MOSI/PCINT13 PA5/ADC5/PCINT5
2 31
PB6/MISO/PCINT14 PA6/ADC6/PCINT6
3 30
PB7/SCK/PCINT15 PA7/ADC7/PCINT7
9 19
PD0/RXD0/PCINT24 PC0/SCL/PCINT16
10 20
PD1/TXD0/PCINT25 PC1/SDA/PCINT17 RS
11 21
PD2/INT0/RXD1/PCINT26 PC2/TCK/PCINT18 RW
12 22
PD3/INT1/TXD1/PCINT27 PC3/TMS/PCINT19 EN
13 23
PD4/OC1B/XCK1/PCINT28 PC4/TDO/PCINT20 D4
14 24
PD5/OC1A/PCINT29 PC5/TDI/PCINT21 D5
15 25
PD6/ICP/OC2B/PCINT30 PC6/TOSC1/PCINT22 D6
16 26
PD7/OC2A/PCINT31 PC7/TOSC2/PCINT23 D7
29 8
AREF XTAL1
27 7
AVCC XTAL2
4
RESET
ATMEGA164P

R
C2
100n

0.00

16 8 U2
2 3
IN1 VSS VS OUT1
7 6
IN2 OUT2
1
EN1

9
MOTOR EN2
10 11
IN3 OUT3
15 14
IN4 GND GND OUT4

L293D

Lectura <0.3
LCD1
LM016L

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
1
2
3

4
5
6

7
8
9
10
11
12
13
14
RV1
LS1

RS

EN

D4
D5
D6
D7
RW
D1

12%
LED-BIRG
U1
SPEAKER 40 37
PB0/XCK0/T0/PCINT8 PA0/ADC0/PCINT0
41 36 1k
MOTOR PB1/T1/CLKO/PCINT9 PA1/ADC1/PCINT1
42 35
PB2/AIN0/INT2/PCINT10 PA2/ADC2/PCINT2
43 34
PB3/AIN1/OC0A/PCINT11 PA3/ADC3/PCINT3
44 33
PB4/SS/OC0B/PCINT12 PA4/ADC4/PCINT4
1 32
PB5/MOSI/PCINT13 PA5/ADC5/PCINT5
2 31
PB6/MISO/PCINT14 PA6/ADC6/PCINT6
3 30
PB7/SCK/PCINT15 PA7/ADC7/PCINT7
9 19
PD0/RXD0/PCINT24 PC0/SCL/PCINT16
10 20
PD1/TXD0/PCINT25 PC1/SDA/PCINT17 RS
11 21
PD2/INT0/RXD1/PCINT26 PC2/TCK/PCINT18 RW
12 22
PD3/INT1/TXD1/PCINT27 PC3/TMS/PCINT19 EN
13 23
PD4/OC1B/XCK1/PCINT28 PC4/TDO/PCINT20 D4
14 24
PD5/OC1A/PCINT29 PC5/TDI/PCINT21 D5
15 25
PD6/ICP/OC2B/PCINT30 PC6/TOSC1/PCINT22 D6
16 26
PD7/OC2A/PCINT31 PC7/TOSC2/PCINT23 D7
29 8
AREF XTAL1
27 7
AVCC XTAL2
4
RESET
ATMEGA164P

R
C2
100n

+137

16 8 U2
2 3
IN1 VSS VS OUT1
7 6
IN2 OUT2
1
EN1

9
MOTOR EN2
10 11
IN3 OUT3
15 14
IN4 GND GND OUT4

L293D

+137

Lectura entre 0.3 y 0.8


LCD1
LM016L

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
1
2
3

4
5
6

7
8
9
10
11
12
13
14
RV1
LS1

RS

EN

D4
D5
D6
D7
RW
D1

18%
LED-BIRG
U1
SPEAKER 40 37
PB0/XCK0/T0/PCINT8 PA0/ADC0/PCINT0
41 36 1k
MOTOR PB1/T1/CLKO/PCINT9 PA1/ADC1/PCINT1
42 35
PB2/AIN0/INT2/PCINT10 PA2/ADC2/PCINT2
43 34
PB3/AIN1/OC0A/PCINT11 PA3/ADC3/PCINT3
44 33
PB4/SS/OC0B/PCINT12 PA4/ADC4/PCINT4
1 32
PB5/MOSI/PCINT13 PA5/ADC5/PCINT5
2 31
PB6/MISO/PCINT14 PA6/ADC6/PCINT6
3 30
PB7/SCK/PCINT15 PA7/ADC7/PCINT7
9 19
PD0/RXD0/PCINT24 PC0/SCL/PCINT16
10 20
PD1/TXD0/PCINT25 PC1/SDA/PCINT17 RS
11 21
PD2/INT0/RXD1/PCINT26 PC2/TCK/PCINT18 RW
12 22
PD3/INT1/TXD1/PCINT27 PC3/TMS/PCINT19 EN
13 23
PD4/OC1B/XCK1/PCINT28 PC4/TDO/PCINT20 D4
14 24
PD5/OC1A/PCINT29 PC5/TDI/PCINT21 D5
15 25
PD6/ICP/OC2B/PCINT30 PC6/TOSC1/PCINT22 D6
16 26
PD7/OC2A/PCINT31 PC7/TOSC2/PCINT23 D7
29 8
AREF XTAL1
27 7
AVCC XTAL2
4
RESET
ATMEGA164P

R
C2
100n

+0.00

16 8 U2
2 3
IN1 VSS VS OUT1
7 6
IN2 OUT2
1
EN1

9
MOTOR EN2
10 11
IN3 OUT3
15 14
IN4 GND GND OUT4

L293D

+0.00

Lectura entre 0.8 y 1.2

RV1
LS1
RS

EN

D4
D5
D6
D7
RW

D1
27%

LED-BIRG
U1
SPEAKER 40 37
PB0/XCK0/T0/PCINT8 PA0/ADC0/PCINT0
41 36 1k
MOTOR PB1/T1/CLKO/PCINT9 PA1/ADC1/PCINT1
42 35
PB2/AIN0/INT2/PCINT10 PA2/ADC2/PCINT2
43 34
PB3/AIN1/OC0A/PCINT11 PA3/ADC3/PCINT3
44 33
PB4/SS/OC0B/PCINT12 PA4/ADC4/PCINT4
1 32
PB5/MOSI/PCINT13 PA5/ADC5/PCINT5
2 31
PB6/MISO/PCINT14 PA6/ADC6/PCINT6
3 30
PB7/SCK/PCINT15 PA7/ADC7/PCINT7
9 19
PD0/RXD0/PCINT24 PC0/SCL/PCINT16
10 20
PD1/TXD0/PCINT25 PC1/SDA/PCINT17 RS
11 21
PD2/INT0/RXD1/PCINT26 PC2/TCK/PCINT18 RW
12 22
PD3/INT1/TXD1/PCINT27 PC3/TMS/PCINT19 EN
13 23
PD4/OC1B/XCK1/PCINT28 PC4/TDO/PCINT20 D4
14 24
PD5/OC1A/PCINT29 PC5/TDI/PCINT21 D5
15 25
PD6/ICP/OC2B/PCINT30 PC6/TOSC1/PCINT22 D6
16 26
PD7/OC2A/PCINT31 PC7/TOSC2/PCINT23 D7
29 8
AREF XTAL1
27 7
AVCC XTAL2
4
RESET
ATMEGA164P
R

C2
100n

+0.00

16 8 U2
2 3
IN1 VSS VS OUT1
7 6
IN2 OUT2
1
EN1

9
MOTOR EN2
10 11
IN3 OUT3
15 14
IN4 GND GND OUT4

L293D

+0.00
Lectura >1.2

RV1
LS1

RS

EN

D4
D5
D6
D7
RW
D1

52%
LED-BIRG
U1
SPEAKER 40 37
PB0/XCK0/T0/PCINT8 PA0/ADC0/PCINT0
41 36 1k
MOTOR PB1/T1/CLKO/PCINT9 PA1/ADC1/PCINT1
42 35
PB2/AIN0/INT2/PCINT10 PA2/ADC2/PCINT2
43 34
PB3/AIN1/OC0A/PCINT11 PA3/ADC3/PCINT3
44 33
PB4/SS/OC0B/PCINT12 PA4/ADC4/PCINT4
1 32
PB5/MOSI/PCINT13 PA5/ADC5/PCINT5
2 31
PB6/MISO/PCINT14 PA6/ADC6/PCINT6
3 30
PB7/SCK/PCINT15 PA7/ADC7/PCINT7
9 19
PD0/RXD0/PCINT24 PC0/SCL/PCINT16
10 20
PD1/TXD0/PCINT25 PC1/SDA/PCINT17 RS
11 21
PD2/INT0/RXD1/PCINT26 PC2/TCK/PCINT18 RW
12 22
PD3/INT1/TXD1/PCINT27 PC3/TMS/PCINT19 EN
13 23
PD4/OC1B/XCK1/PCINT28 PC4/TDO/PCINT20 D4
14 24
PD5/OC1A/PCINT29 PC5/TDI/PCINT21 D5
15 25
PD6/ICP/OC2B/PCINT30 PC6/TOSC1/PCINT22 D6
16 26
PD7/OC2A/PCINT31 PC7/TOSC2/PCINT23 D7
29 8
AREF XTAL1
27 7
AVCC XTAL2
4
RESET
ATMEGA164P
R

C2
100n

0.00

16 8 U2
2 3
IN1 VSS VS OUT1
7 6
IN2 OUT2
1
EN1

9
MOTOR EN2
10 11
IN3 OUT3
15 14
IN4 GND GND OUT4

L293D
Curva de funcionamiento
Ecuacin de funcionamiento
Circuito para control de motor

Tabla de funcionamiento

S-ar putea să vă placă și