27
FACULTAD DE INGENIERIA ELECTRICA Y FACULTAD DE INGENIERIA ELECTRICA Y ELECTRONICA ELECTRONICA ESCUELA PROFESIONAL DE INGENIERIA ESCUELA PROFESIONAL DE INGENIERIA ELECTRONICA ELECTRONICA PROYECTO FINAL MICROCONTROLADORES PROYECTO FINAL MICROCONTROLADORES “RELOJ DIGITAL PROGRAMABLE” “RELOJ DIGITAL PROGRAMABLE” FECHADOR, TERMOMETRO Y ALARMA CONFIGURABLE POR BLUETOOTH FECHADOR, TERMOMETRO Y ALARMA CONFIGURABLE POR BLUETOOTH CURSO: CURSO: MICROCONTROLADORES MICROCONTROLADORES PROFESOR: PROFESOR: ING. ZENON CUCHO MENDOZA ING. ZENON CUCHO MENDOZA ALUMNOS: ALUMNOS: CARDENAS FLORES CESAR ANIBAL CARDENAS FLORES CESAR ANIBAL 040045F 040045F ESPINOZA PIMENTEL ALEXANDER F. ESPINOZA PIMENTEL ALEXANDER F. 1123220092 1123220092

Informe Reloj Digital Configurable

Embed Size (px)

DESCRIPTION

m

Citation preview

Page 1: Informe Reloj Digital Configurable

FACULTAD DE INGENIERIA ELECTRICA YFACULTAD DE INGENIERIA ELECTRICA Y ELECTRONICAELECTRONICA

ESCUELA PROFESIONAL DE INGENIERIAESCUELA PROFESIONAL DE INGENIERIA ELECTRONICAELECTRONICA

PROYECTO FINAL MICROCONTROLADORESPROYECTO FINAL MICROCONTROLADORES“RELOJ DIGITAL PROGRAMABLE”“RELOJ DIGITAL PROGRAMABLE”

FECHADOR, TERMOMETRO Y ALARMA CONFIGURABLE PORFECHADOR, TERMOMETRO Y ALARMA CONFIGURABLE POR BLUETOOTHBLUETOOTH

CURSO: CURSO:

MICROCONTROLADORESMICROCONTROLADORES

PROFESOR:PROFESOR:ING. ZENON CUCHO MENDOZAING. ZENON CUCHO MENDOZA

ALUMNOS: ALUMNOS: CARDENAS FLORES CESAR ANIBAL CARDENAS FLORES CESAR ANIBAL 040045F040045FESPINOZA PIMENTEL ALEXANDER F.ESPINOZA PIMENTEL ALEXANDER F. 11232200921123220092

BELLAVISTA - CALLAOBELLAVISTA - CALLAO

20142014

Page 2: Informe Reloj Digital Configurable

RELOJ DIGITAL PROGRAMABLEFECHADOR / 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, además de poderse programar su alarma mediante Bluetooth.

Un artefacto así sería muy útil en nuestros dormitorios pues nos permitiría estar al tanto de la hora, el calendario, el Clima, además 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 S/. 35 S/. 352 Atmega8 S/. 10 S/. 20Sensor LM35 S/. 6 S/. 6Placa Impresa S/. 10 S/. 10Speaker S/. 2 S/. 2Pantalla LCD 16x2 S/. 15 S/. 15Accesorios menores S/. 10 S/. 10

Total: S/. 98

Page 3: Informe Reloj Digital Configurable

DIAGRAMA ESQUEMATICO:

Page 4: Informe Reloj Digital Configurable

DIAGRAMA DE FLUJO DEL PRIMER MICROCONTROLADOR:

CONTINUA

Page 5: Informe Reloj Digital Configurable

RETORNA VIENE

CONTINUA

Page 6: Informe Reloj Digital Configurable

RETORNA VIENE

CONTINUA

Page 7: Informe Reloj Digital Configurable

RETORNA VIENE

Page 8: Informe Reloj Digital Configurable

DIAGRAMA DE FLUJO INTERRRUPCIONES:

DIAGRAMA DE BLOQUES:

Page 9: Informe Reloj Digital Configurable

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 <avr/io.h>#include <util/delay.h>#include "avr_compiler.h"#include "lcd.h"

long t=0;long tf=86400; //Comparador finallong 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 bufferunsigned int vadc,vadc_min=15,vadc_max=30; //variables de temperatura

//Variables Alarma 1int alarm1;int ha1,ma1;long ta1xx;long ha1x,ma1x;long ta1x;

//variables usadas para bluetoothint 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 escrituralcd_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)

Page 10: Informe Reloj Digital Configurable

{//////////////////CALCULO DE

HORA/////////////////////////////////////////////HORAif (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:MMif ((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;

Page 11: Informe Reloj Digital Configurable

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) PB6if((PINB&0x40)==0x40){

a++;b=1; //Resetea SUBMENUwhile((PINB&0x40)==0x40){}

if (a==6) //En el ultimo cambio de submenu se guardan los cambios.

{t=ti;

ta1xx=ta1x;}

}

Page 12: Informe Reloj Digital Configurable

//Boton << PB5if((PINB&0x20)==0x20){

b--;while((PINB&0x20)==0x20){}

}

//Boton >> PB4if((PINB&0x10)==0x10){

b++;while((PINB&0x10)==0x10){}

}

//////////////////COMPARACION DE ALARMAS/////////////////////////////////////////ALARMA if ((alarm1==1)&&(t==ta1xx)) {PORTB|=0b00000001;alarm1=0;}

///////APAGA ALARMASif((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;//retornocase 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;//retornocase 1:lcd_menu_dias();break;case 2:lcd_menu_meses();break;case 3:lcd_menu_anos();break;case 4:b=1;break; //retorno

}break;

Page 13: Informe Reloj Digital Configurable

case 4: //alarma1switch (b){

case 0:b=2;break;//retornocase

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;//retornocase 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, AÑO, 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 AÑO

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);}

Page 14: Informe Reloj Digital Configurable

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 temperaturasprintf(buffer,"%d C ",vadc);lcd_gotorc(1,11);lcd_puts(buffer);

/////////////////////////////////////ENCENDIENDO LEDS///////////////////

if (vadc_max<vadc){

PORTC|=(1<<PC4); //RojoPORTC&=0b11011111;PORTD&=0b11110111;

}else if (vadc_min>vadc){

PORTD|=(1<<PD3); //AmarilloPORTC&=0b11001111;

}else{PORTC|=(1<<PC5); //verdePORTC&=0b11101111;PORTD&=0b11110111;

}

/////////////////////////////////////ESCRIBIENDO ALARMA/////////////

//Mostrar en pantalla alarmasprintf(buffer,"ALAR %d ",alarm1);lcd_gotorc(2,11);lcd_puts(buffer);

}

void lcd_menu_horas(){

//Boton (Arriba) PB2if((PINB&0x04)==0x04){

hi++;if(hi==24){hi=0;}while((PINB&0x04)==0x04){}

}

//Boton (Abajo) PB3if((PINB&0x08)==0x08){

if(hi==0){hi=24;}hi--;

Page 15: Informe Reloj Digital Configurable

while((PINB&0x08)==0x08){}}

sprintf(buffer,"%d:%d:%d ",hi,mi,si);lcd_gotorc(1,1);lcd_puts(buffer);

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

}

void lcd_menu_minutos(){

//Boton (Arriba) PB2if((PINB&0x04)==0x04){

mi++;if(mi==60){mi=0;}while((PINB&0x04)==0x04){}

}

//Boton (Abajo) PB3if((PINB&0x08)==0x08){

if(mi==0){mi=60;}mi--;while((PINB&0x08)==0x08){}

}

sprintf(buffer,"%d:%d:%d ",hi,mi,si);lcd_gotorc(1,1);lcd_puts(buffer);

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

}

void lcd_menu_segundos(){

//Boton (Arriba) PB2if((PINB&0x04)==0x04){

si++;if(si==60){si=0;}while((PINB&0x04)==0x04){}

}

//Boton (Abajo) PB3if((PINB&0x08)==0x08){

if(si==0){si=60;}si--;while((PINB&0x08)==0x08){}

}

sprintf(buffer,"%d:%d:%d ",hi,mi,si);lcd_gotorc(1,1);lcd_puts(buffer);

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

Page 16: Informe Reloj Digital Configurable

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) PB3if((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 ",dia,mes,ano);lcd_gotorc(1,1);lcd_puts(buffer);

sprintf(buffer,"FECHA-DIAS ");lcd_gotorc(2,1);lcd_puts(buffer);

}

void lcd_menu_meses(){

//Boton (Arriba) PB2if((PINB&0x04)==0x04){

mes++;if (mes==13){mes=1;}while((PINB&0x04)==0x04){}

}

Page 17: Informe Reloj Digital Configurable

//Boton (Abajo) PB3if((PINB&0x08)==0x08){

if (mes==1){mes==13;}mes--;while((PINB&0x08)==0x08){}

}

sprintf(buffer,"%d:%d:%d ",dia,mes,ano);lcd_gotorc(1,1);lcd_puts(buffer);

sprintf(buffer,"FECHA-MESES ");lcd_gotorc(2,1);lcd_puts(buffer);

}

void lcd_menu_anos(){

//Boton (Arriba) PB2if((PINB&0x04)==0x04){

ano++;if (ano==100){ano=1;}while((PINB&0x04)==0x04){}

}

//Boton (Abajo) PB3if((PINB&0x08)==0x08){

if (ano==1){

ano==100;}ano--;while((PINB&0x08)==0x08){}

}

sprintf(buffer,"%d:%d:%d ",dia,mes,ano);lcd_gotorc(1,1);lcd_puts(buffer);

sprintf(buffer,"FECHA-ANOS");lcd_gotorc(2,1);lcd_puts(buffer);

}

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);

}

Page 18: Informe Reloj Digital Configurable

//Boton (Arriba) PB2if((PINB&0x04)==0x04){

alarm1=1;ha1++;if(ha1==24){ha1=0;}while((PINB&0x04)==0x04){}

}//Boton (Abajo) PB3if((PINB&0x08)==0x08){

alarm1=1;if(ha1==0){ha1=24;}ha1--;while((PINB&0x08)==0x08){}

}//Boton (OFF) PB7if((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 ",ha1,ma1);lcd_gotorc(1,1);lcd_puts(buffer);

}//Boton (Arriba) PB2if((PINB&0x04)==0x04){

alarm1=1;ma1++;if(ma1==60){ma1=0;}while((PINB&0x04)==0x04){}

}//Boton (Abajo) PB3if((PINB&0x08)==0x08){

alarm1=1;if(ma1==0){ma1=60;}ma1--;while((PINB&0x08)==0x08){}

}//Boton (OFF) PB7if((PINB&0x80)==0x80){

alarm1=0;while((PINB&0x80)==0x80){}

Page 19: Informe Reloj Digital Configurable

}

sprintf(buffer,"AL1-MINU");lcd_gotorc(2,1);lcd_puts(buffer);

}

void lcd_menu_tempmin(){

//Boton (Arriba) PB2if((PINB&0x04)==0x04){

vadc_min++;if (vadc_min==256){vadc_min=0;}while((PINB&0x04)==0x04){}

}

//Boton (Abajo) PB3if((PINB&0x08)==0x08){

if (vadc_min==0){vadc_min==256;}vadc_min--;while((PINB&0x08)==0x08){}

}

sprintf(buffer,"%d C ",vadc_min);lcd_gotorc(1,1);lcd_puts(buffer);

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

}

void lcd_menu_tempmax(){

//Boton (Arriba) PB2if((PINB&0x04)==0x04){

vadc_max++;if (vadc_max==256){vadc_max=0;}while((PINB&0x04)==0x04){}

}

//Boton (Abajo) PB3if((PINB&0x08)==0x08){

if (vadc_max==0){vadc_max==256;}vadc_max--;while((PINB&0x08)==0x08){}

}

sprintf(buffer,"%d C ",vadc_max);lcd_gotorc(1,1);lcd_puts(buffer);

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

}

/////////////////////////////CONFIGURACIONES/////////////////ISR (TIMER1_COMPA_vect)

Page 20: Informe Reloj Digital Configurable

{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

Page 21: Informe Reloj Digital Configurable
Page 22: Informe Reloj Digital Configurable

CONCLUSIONES

Con las interrupciones del Timer se nos hiso más fácil 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 según las notas musicales se pudo construir la melodía 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 medición de temperatura del ambiente por medio del micro controlador.

Para calibrar la temperatura ambiente medida por el sensor LM35 se utilizó un potenciómetro de 1K conectado al voltaje de referencia.

Se usó pulsadores Pull Down para la interfaz amigable usuario de configuración del Reloj. Mediante librerías 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 rápidamente, indicándote un error que debes de solucionar ajustando el tamaño de las variables.

Usando la comunicación Usart y un módulo bluetooth hc-06 fue posible transmitir datos desde un móvil distante al reloj.

Para poder transmitir datos usando el Modulo Bluetooth hc06 es necesario conocer su configuración USART de fábrica y trabajar en ese Rango.

No todos los software Androird Bluetoth son adecuados para comunicar datos al Módulo 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 podríamos usarlo el mismo para emitir una secuencia de melodía midi, porque este sonaría distorsionado, adicionalmente ya teníamos saturados todos los pines de nuestro Microcontrolador, decidimos utilizar un Atmega8 adicional para la transmisión del melodía de alarma.

Page 23: Informe Reloj Digital Configurable

BIBLIOGRAFIA

1. Video Reloj Digital Youtubehttps://www.youtube.com/watch?v=jrbqZ51Ymww

2. Data Sheet Atmega83. Guia_de_VideoTutoriales_HeTPro-libre4. Apuntes Profesor Zenon Chucho Mendoza

Video de nuestro proyecto subido a Youtube

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