You are on page 1of 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

You might also like