Вы находитесь на странице: 1из 26

FACULTAD DE INGENIERIA ELECTRICA Y

ELECTRONICA
ESCUELA PROFESIONAL DE INGENIERIA
ELECTRONICA
PROYECTO FINAL MICROCONTROLADORES
RELOJ DIGITAL PROGRAMABLE
FECHADOR, TERMOMETRO Y ALARMA CONFIGURABLE POR
BLUETOOTH

CURSO:
MICROCONTROLADORES
PROFESOR:

ALUMNOS:

ING. ZENON CUCHO MENDOZA

CARDENAS FLORES CESAR ANIBAL


ESPINOZA PIMENTEL ALEXANDER F.

BELLAVISTA - CALLAO
2014

040045F
1123220092

RELOJ DIGITAL PROGRAMABLE


FECHADOR / TERMOMETRO / ALARMA CONFIGURABLE POR BLUETOOTH
DESCRIPCION DEL PROYECTO:
Nuestro proyecto consiste en un Reloj Digital programable que, te indica en su
pantalla, la temperatura ambiente, la fecha, adems de poderse programar su
alarma mediante Bluetooth.
Un artefacto as sera muy til en nuestros dormitorios pues nos permitira estar al
tanto de la hora, el calendario, el Clima, adems de poder tener la alarma
despertador distante y solo desactibable, al tacto o con clave bluetooth, desde el
Celular.

METODOLOGIA APLICADA
Se dise el reloj, bajo criterio de experiencias hechas previamente, cada integrante
en sus respectivas funciones, para luego juntar todo en un solo programa dando
algunos cambios finales para garantizar su buen funcionamiento.

COSTOS DEL PROYECTO:


Accesorio

Precio U

Total

Modulo Bluetooth
2 Atmega8
Sensor LM35
Placa Impresa
Speaker
Pantalla LCD 16x2
Accesorios menores

S/. 35
S/. 10

S/. 35
S/. 20

Total:

S/. 98

S/. 6
S/. 10
S/. 2
S/. 15

S/. 6
S/. 10
S/. 2
S/. 15

S/. 10

S/. 10

DIAGRAMA ESQUEMATICO:

DIAGRAMA DE FLUJO DEL PRIMER MICROCONTROLADOR:

CONTINUA

VIENE

CONTINUA

RETORNA

VIENE
RETORNA

CONTINUA

VIENE

RETORNA

DIAGRAMA DE FLUJO INTERRRUPCIONES:

DIAGRAMA DE BLOQUES:

CODIGO COMENTADO
/*
* Reloj Digital con Fechador y Sensor de Tempratura con Alarma Programable Via Bluetooth
* Created: 29/09/2014 04:11:56 p.m.
* Author: Cesar Cardenas Flores y Alexander Espinoza Pimentel
* Universidad Nacional Del Callao Escuela de Ingenieria Electronica
* Curso: Microcontroladores
*/
#include
#include
#include
#include

<avr/io.h>
<util/delay.h>
"avr_compiler.h"
"lcd.h"

long t=0;
long tf=86400; //Comparador final
long h,m,s;
long ti;
int hx,mx,sx;
int hi,mi,si;
long hix,mix,six;
int a=0,b=1;
int dia=1,mes=1,ano=1;
char buffer[300]; //variable buffer
unsigned int vadc,vadc_min=15,vadc_max=30; //variables de temperatura
//Variables Alarma 1
int alarm1;
int ha1,ma1;
long ta1xx;
long ha1x,ma1x;
long ta1x;
//variables usadas para bluetooth
int bluedato[9];
int hd,hu,md,mu,hal,mal;
int k=1;
int main(void)
{
config_puertos();
config_interrupt();
config_timer();
config_usart();
configura_ADC();
lcd_init(); //Llamamos escritura
lcd_clear(); //Reseteamos pantalla
////////PANTALLA INICIAL UNAC/////////////
while((PINB&0x40)==0x00)
{
imprime_entrada();

}
while((PINB&0x40)==0x10){}
lcd_clear(); //Reseteamos pantalla
sei(); //Habilitamos interrupciones
while(1)
{
//////////////////CALCULO DE HORA/////////////////////////////////////////////HORA
if (t>=tf){t=0;dia++;}//reseteo de hora por fin de Dia
h=t/3600;
m=(t-h*3600)/60;
s=t-h*3600-m*60;
//Pasando de long a int (para realizar el calculo en long sin alterar los int)
hx=h;
mx=m;
sx=s;
//Pasando de long a int (para realizar el calculo en long sin alterar los int)
hix=hi;
mix=mi;
six=si;
ti=hix*3600+mix*60+six;
//Pasando de long a int (para realizar el calculo en long sin alterar los int)
ha1x=ha1;
ma1x=ma1;
ta1x=ha1x*3600+ma1x*60;
/////////////////COMPARACION BLUETOOTH/////////////////////////////////////////USART ALARMA
//INTRODUCIMOS 5 DATOS CON FORMATO HH:MM
if ((UCSRA&0x80)==0x80)
{
bluedato[k]=UDR;
if(bluedato[k]=='n')
{
k=0;
PORTB&=11111110;
alarm1=0;
}
k++;
}
//SI LOS DATOS SON CORRECTOS, SI LO SON ACTIVAMOS VARIABLES DE
ALARMA///////ALARMA
if(k==6)
{
if ((bluedato[1]>='0')&&(bluedato[1]<='9'))
{

if ((bluedato[2]>='0')&&(bluedato[2]<='9'))
{
if ((bluedato[4]>='0')&&(bluedato[4]<='9'))
{
if ((bluedato[5]>='0')&&(bluedato[5]<='9'))
{
hd=bluedato[1]-48;
hu=bluedato[2]-48;
md=bluedato[4]-48;
mu=bluedato[5]-48;
hal=hd*10+hu;
mal=md*10+mu;
alarm1=1;
ha1=hal; ///////
ma1=mal; ///////
ha1x=ha1;
ma1x=ma1;
ta1x=ha1x*3600+ma1x*60;
ta1xx=ta1x;
}
}
}
}
k=1;
}
////////////////CALCULO DE FECHA/////////////////////////////////////////////
switch(mes) //////////////////CAMBIO DE MESES
{
case 1:if(dia>31){mes++;dia=1;}break;
case 2:if(dia>28){mes++;dia=1;}break;
case 3:if(dia>31){mes++;dia=1;}break;
case 4:if(dia>30){mes++;dia=1;}break;
case 5:if(dia>31){mes++;dia=1;}break;
case 6:if(dia>30){mes++;dia=1;}break;
case 7:if(dia>31){mes++;dia=1;}break;
case 8:if(dia>31){mes++;dia=1;}break;
case 9:if(dia>30){mes++;dia=1;}break;
case 10:if(dia>31){mes++;dia=1;}break;
case 11:if(dia>30){mes++;dia=1;}break;
case 12:if(dia>31){mes++;dia=1;}break;
}
if (mes==13)
{
mes=1;
ano++;
if (ano==100){ano=1;}

}
//////////////////ACCION DE LOS BOTONES (MENU Y SUBMENUS) /////////////////////////
//Boton (menu) PB6
if((PINB&0x40)==0x40)
{
a++;
b=1; //Resetea SUBMENU
while((PINB&0x40)==0x40){}
if (a==6) //En el ultimo cambio de submenu se guardan los cambios.
{
t=ti;
ta1xx=ta1x;
}
}
//Boton << PB5
if((PINB&0x20)==0x20)
{
b--;
while((PINB&0x20)==0x20){}
}
//Boton >> PB4
if((PINB&0x10)==0x10)
{
b++;
while((PINB&0x10)==0x10){}
}
//////////////////COMPARACION DE ALARMAS/////////////////////////////////////////ALARMA
if ((alarm1==1)&&(t==ta1xx))
{PORTB|=0b00000001;alarm1=0;}

///////APAGA ALARMAS
if((PINB&0x80)==0x80)
{
PORTB=0x00;
while((PINB&0x80)==0x80){}
}
/////////////////////////CALCULO DE TEMPERATURA (ADC)
ADCSRA|=(1<<ADSC); // Iniciamos conversion
while((ADCSRA&(1<<ADIF))==(0<<ADIF))
//Tansformando ADC a 6 bits (256 valores para temperatura)
vadc=ADCL+256*ADCH;
vadc=(vadc*63)/1023;

//////////////////SELECCION DE MENUS//////////////////////////////////
switch (a)
{
case 1:escribe_lcd();break;
case 2: //horas
switch (b)
{
case 0:b=3;break;//retorno
case 1:lcd_menu_horas();break;
case 2:lcd_menu_minutos();break;
case 3:lcd_menu_segundos();break;
case 4:b=1;break;//retorno
}
break;
case 3: //fechas
switch (b)
{
case 0:b=3;break;//retorno
case 1:lcd_menu_dias();break;
case 2:lcd_menu_meses();break;
case 3:lcd_menu_anos();break;
case 4:b=1;break; //retorno
}
break;
case 4: //alarma1
switch (b)
{
case 0:b=2;break;//retorno
case 1:lcd_menu_alarma1_horas();break;
case 2:lcd_menu_alarma1_minutos();break;
case 3:b=1;break; //retorno
}
break;
case 5: //temperatura
switch (b)
{
case 0:b=2;break;//retorno
case 1:lcd_menu_tempmin();break;
case 2:lcd_menu_tempmax();break;
case 3:b=1;break; //retorno
}
break;
case 6:a=1;break;
}
}
}
//////////////////FUNCION ESCRIBE LCD (HORA, AO, TEMPERATURA, ALARMA)////////////////////////
void escribe_lcd()
{
//lcd_clear();//para borrar la pantalla LCD

///////////////////////////////ESCRIBIENDO HORA
if (h<10)
{
sprintf(buffer,"0%d:",hx); lcd_gotorc(1,1); lcd_puts(buffer);
}else{
sprintf(buffer,"%d:",hx); lcd_gotorc(1,1); lcd_puts(buffer);
}
if (m<10)
{
sprintf(buffer,"0%d:",mx); lcd_gotorc(1,4); lcd_puts(buffer);
}else{
sprintf(buffer,"%d:",mx); lcd_gotorc(1,4); lcd_puts(buffer);
}
if (s<10)
{
sprintf(buffer,"0%d ",sx); lcd_gotorc(1,7); lcd_puts(buffer);
}else{
sprintf(buffer,"%d ",sx); lcd_gotorc(1,7); lcd_puts(buffer);
}
/////////////////////////////ESCRIBIENDO AO
if (dia<10)
{
sprintf(buffer,"0%d/",dia); lcd_gotorc(2,1); lcd_puts(buffer);
}else{
sprintf(buffer,"%d/",dia); lcd_gotorc(2,1); lcd_puts(buffer);
}
if (mes<10)
{
sprintf(buffer,"0%d/",mes); lcd_gotorc(2,4); lcd_puts(buffer);
}else{
sprintf(buffer,"%d/",mes); lcd_gotorc(2,4); lcd_puts(buffer);
}
if (ano<10)
{
sprintf(buffer,"0%d ",ano); lcd_gotorc(2,7); lcd_puts(buffer);
}else{
sprintf(buffer,"%d ",ano); lcd_gotorc(2,7); lcd_puts(buffer);
}
///////////////////////////////ESCRIBIENDO TEMPERATURA
//Mostrar en pantalla temperatura
sprintf(buffer,"%d C
",vadc);
lcd_gotorc(1,11);
lcd_puts(buffer);

/////////////////////////////////////ENCENDIENDO LEDS///////////////////
if (vadc_max<vadc)
{
PORTC|=(1<<PC4); //Rojo
PORTC&=0b11011111;
PORTD&=0b11110111;
}else if (vadc_min>vadc)
{
PORTD|=(1<<PD3); //Amarillo
PORTC&=0b11001111;
}else{
PORTC|=(1<<PC5); //verde
PORTC&=0b11101111;
PORTD&=0b11110111;
}
/////////////////////////////////////ESCRIBIENDO ALARMA/////////////
//Mostrar en pantalla alarma
sprintf(buffer,"ALAR %d
",alarm1);
lcd_gotorc(2,11);
lcd_puts(buffer);
}
void lcd_menu_horas()
{
//Boton (Arriba) PB2
if((PINB&0x04)==0x04)
{
hi++;
if(hi==24){hi=0;}
while((PINB&0x04)==0x04){}
}
//Boton (Abajo) PB3
if((PINB&0x08)==0x08)
{
if(hi==0){hi=24;}
hi--;
while((PINB&0x08)==0x08){}
}
sprintf(buffer,"%d:%d:%d
lcd_gotorc(1,1);
lcd_puts(buffer);
sprintf(buffer,"TIEMPO-HORA
lcd_gotorc(2,1);
lcd_puts(buffer);
}
void lcd_menu_minutos()

",hi,mi,si);

");

{
//Boton (Arriba) PB2
if((PINB&0x04)==0x04)
{
mi++;
if(mi==60){mi=0;}
while((PINB&0x04)==0x04){}
}
//Boton (Abajo) PB3
if((PINB&0x08)==0x08)
{
if(mi==0){mi=60;}
mi--;
while((PINB&0x08)==0x08){}
}
sprintf(buffer,"%d:%d:%d
lcd_gotorc(1,1);
lcd_puts(buffer);

",hi,mi,si);

sprintf(buffer,"TIEMPO-MINUTOS
lcd_gotorc(2,1);
lcd_puts(buffer);

");

}
void lcd_menu_segundos()
{
//Boton (Arriba) PB2
if((PINB&0x04)==0x04)
{
si++;
if(si==60){si=0;}
while((PINB&0x04)==0x04){}
}
//Boton (Abajo) PB3
if((PINB&0x08)==0x08)
{
if(si==0){si=60;}
si--;
while((PINB&0x08)==0x08){}
}
sprintf(buffer,"%d:%d:%d
lcd_gotorc(1,1);
lcd_puts(buffer);

",hi,mi,si);

sprintf(buffer,"TIEMPO-SEGUNDOS
lcd_gotorc(2,1);
lcd_puts(buffer);
}
void lcd_menu_dias()

");

{
//Boton (Arriba) PB2
if((PINB&0x04)==0x04)
{
if ((mes%2)==1)
{
dia++;
if(dia==32){dia=1;}
}else if (mes==2)
{
dia++;
if(dia==29){dia=1;}
}else{
dia++;
if(dia==31){dia=1;}
}
while((PINB&0x04)==0x04){}
}
//Boton (Abajo) PB3
if((PINB&0x08)==0x08)
{
if ((mes%2)==1)
{
if(dia==1){dia=32;}
dia--;
}else if (mes==2)
{
if(dia==1){dia=29;}
dia--;
}else{
if(dia==1){dia=31;}
dia--;
}
while((PINB&0x08)==0x08){}
}
sprintf(buffer,"%d:%d:%d
lcd_gotorc(1,1);
lcd_puts(buffer);
sprintf(buffer,"FECHA-DIAS
lcd_gotorc(2,1);
lcd_puts(buffer);
}
void lcd_menu_meses()
{
//Boton (Arriba) PB2
if((PINB&0x04)==0x04)
{
mes++;

",dia,mes,ano);

");

if (mes==13)
{mes=1;}
while((PINB&0x04)==0x04){}
}
//Boton (Abajo) PB3
if((PINB&0x08)==0x08)
{
if (mes==1)
{mes==13;}
mes--;
while((PINB&0x08)==0x08){}
}
sprintf(buffer,"%d:%d:%d
lcd_gotorc(1,1);
lcd_puts(buffer);
sprintf(buffer,"FECHA-MESES
lcd_gotorc(2,1);
lcd_puts(buffer);

",dia,mes,ano);

");

}
void lcd_menu_anos()
{
//Boton (Arriba) PB2
if((PINB&0x04)==0x04)
{
ano++;
if (ano==100)
{ano=1;}
while((PINB&0x04)==0x04){}
}
//Boton (Abajo) PB3
if((PINB&0x08)==0x08)
{
if (ano==1)
{
ano==100;
}
ano--;
while((PINB&0x08)==0x08){}
}
sprintf(buffer,"%d:%d:%d
lcd_gotorc(1,1);
lcd_puts(buffer);
sprintf(buffer,"FECHA-ANOS");
lcd_gotorc(2,1);
lcd_puts(buffer);
}

",dia,mes,ano);

void lcd_menu_alarma1_horas()
{
if (alarm1==0)
{
sprintf(buffer,"APAGADA");
lcd_gotorc(1,1);
lcd_puts(buffer);
}
if (alarm1==1)
{
sprintf(buffer,"%d:%d
",ha1,ma1);
lcd_gotorc(1,1);
lcd_puts(buffer);
}
//Boton (Arriba) PB2
if((PINB&0x04)==0x04)
{
alarm1=1;
ha1++;
if(ha1==24){ha1=0;}
while((PINB&0x04)==0x04){}
}
//Boton (Abajo) PB3
if((PINB&0x08)==0x08)
{
alarm1=1;
if(ha1==0){ha1=24;}
ha1--;
while((PINB&0x08)==0x08){}
}
//Boton (OFF) PB7
if((PINB&0x80)==0x80)
{
alarm1=0;
while((PINB&0x80)==0x80){}
}
sprintf(buffer,"AL1-HORA");
lcd_gotorc(2,1);
lcd_puts(buffer);
}
void lcd_menu_alarma1_minutos()
{
if (alarm1==0)
{
sprintf(buffer,"APAGADA");
lcd_gotorc(1,1);
lcd_puts(buffer);
}
if (alarm1==1)
{
sprintf(buffer,"%d:%d
lcd_gotorc(1,1);
lcd_puts(buffer);

",ha1,ma1);

}
//Boton (Arriba) PB2
if((PINB&0x04)==0x04)
{
alarm1=1;
ma1++;
if(ma1==60){ma1=0;}
while((PINB&0x04)==0x04){}
}
//Boton (Abajo) PB3
if((PINB&0x08)==0x08)
{
alarm1=1;
if(ma1==0){ma1=60;}
ma1--;
while((PINB&0x08)==0x08){}
}
//Boton (OFF) PB7
if((PINB&0x80)==0x80)
{
alarm1=0;
while((PINB&0x80)==0x80){}
}
sprintf(buffer,"AL1-MINU");
lcd_gotorc(2,1);
lcd_puts(buffer);
}
void lcd_menu_tempmin()
{
//Boton (Arriba) PB2
if((PINB&0x04)==0x04)
{
vadc_min++;
if (vadc_min==256){vadc_min=0;}
while((PINB&0x04)==0x04){}
}
//Boton (Abajo) PB3
if((PINB&0x08)==0x08)
{
if (vadc_min==0){vadc_min==256;}
vadc_min--;
while((PINB&0x08)==0x08){}
}
sprintf(buffer,"%d C
lcd_gotorc(1,1);
lcd_puts(buffer);

",vadc_min);

sprintf(buffer,"TEMP MIN");
lcd_gotorc(2,1);
lcd_puts(buffer);

}
void lcd_menu_tempmax()
{
//Boton (Arriba) PB2
if((PINB&0x04)==0x04)
{
vadc_max++;
if (vadc_max==256){vadc_max=0;}
while((PINB&0x04)==0x04){}
}
//Boton (Abajo) PB3
if((PINB&0x08)==0x08)
{
if (vadc_max==0){vadc_max==256;}
vadc_max--;
while((PINB&0x08)==0x08){}
}
sprintf(buffer,"%d C
lcd_gotorc(1,1);
lcd_puts(buffer);

",vadc_max);

sprintf(buffer,"TEMP MAX");
lcd_gotorc(2,1);
lcd_puts(buffer);
}
/////////////////////////////CONFIGURACIONES/////////////////
ISR (TIMER1_COMPA_vect)
{
t++;
}
void config_puertos(void)
{
DDRB=0b00000011;
DDRC=0b01111110;
DDRD=0x11111110;
}
void config_timer(void)
{
OCR1A=15624;
TCCR1A=0b00000000;
TCCR1B=0b00001011;
TIMSK=0b00010000;
}
void config_interrupt(void)
{
MCUCR=0b00000000;
GICR=0b00000000;

}
void configura_ADC(void)
{
ADMUX=0b00000000;// refrencia AREF, ajuste a la derecha, 0100, canal ADC0
ADCSRA=0b10000010;// ADC Activado, modo conversion nica, pres escalador 4
}
void config_usart(void)
{//9600 BAUDIOS,NO PARIDAD,8 BITS,1 BIT STOP
UBRRL=0x0C;
UBRRH=0x00;
UCSRA=0x03;
UCSRB=0x18;
UCSRC=0x86;
}
void imprime_entrada(void)
{
sprintf(buffer,"UNIVERSIDAD NAC.");
lcd_gotorc(1,1);
lcd_puts(buffer);
sprintf(buffer," DEL CALLAO ");
lcd_gotorc(2,1);
lcd_puts(buffer);
}

RESULTADOS:
FOTOS DEL PROYECTO

CONCLUSIONES

Con las interrupciones del Timer se nos hiso ms fcil controlar el tiempo
del Reloj, se dio uso de las interrupciones del timer para poder controlar
el tiempo a un segundo sin retraso.
Utilizando el Timer1 en modo PWM y variando las frecuencias segn las
notas musicales se pudo construir la meloda de Mario Bross como alarma
para el Reloj.
Con el ADC del micro controlador y usando un sensor externo el LM35
fue posible hacer la medicin de temperatura del ambiente por medio del
micro controlador.
Para calibrar la temperatura ambiente medida por el sensor LM35 se
utiliz un potencimetro de 1K conectado al voltaje de referencia.
Se us pulsadores Pull Down para la interfaz amigable usuario de
configuracin del Reloj.
Mediante libreras de LCD fue posible mostrar datos y controlar lo que se
muestra.
Pudimos observar que cuando las variables asignadas son demasiadas o
se usa variables de bits de mayor capacidad de lo que se necesita, se
llega a saturar la memoria rpidamente, indicndote un error que debes
de solucionar ajustando el tamao de las variables.
Usando la comunicacin Usart y un mdulo bluetooth hc-06 fue posible
transmitir datos desde un mvil distante al reloj.
Para poder transmitir datos usando el Modulo Bluetooth hc06 es
necesario conocer su configuracin USART de fbrica y trabajar en ese
Rango.
No todos los software Androird Bluetoth son adecuados para comunicar
datos al Mdulo Bluetoth, recomendamos ampliamente el Blueterm que
es el que menos problemas nos ocasiono.
Como utilizamos el Micro controlador en muestreo contante para
actualizar la pantalla lcd, no podramos usarlo el mismo para emitir una

secuencia de meloda midi, porque este sonara distorsionado,


adicionalmente ya tenamos saturados todos los pines de nuestro
Microcontrolador, decidimos utilizar un Atmega8 adicional para la
transmisin del meloda de alarma.
BIBLIOGRAFIA
1. Video Reloj Digital Youtube
https://www.youtube.com/watch?v=jrbqZ51Ymww
2. Data Sheet Atmega8
3. Guia_de_VideoTutoriales_HeTPro-libre
4. Apuntes Profesor Zenon Chucho Mendoza

Video de nuestro proyecto subido a Youtube


Link del Video: http://youtu.be/mOjV77WnVpU

Вам также может понравиться