Implementación de un reloj con termómetro digital Led. Diego Carrera#1 Rodrigo Cueva#2 Alex Guaman#3 Dalton Gallegos#4 #1
Profesionales en formación, Universidad Técnica Particular de Loja Loja, Ecuador 1
dfcarrera@utpl.edu.ec 2 rcueva@utpl.edu.ec 3 apguaman@utpl.edu.ec 4 dmgallegos@utpl.edu.ec Resumen—El presente proyecto se basa en el diseño e implementación de un reloj digital con termómetro, en un micro controlador ATMEGA y su programación en C. El sistema constara con 60 led’s que nos indicaran los segundos y 4 displays que mostraran las horas y segundos (HH:MM), al igual que la temperatura ambiente en grados Celsius y Fahrenheit, el mismo que podrán ser controlados por 4 pulsadores que configuraran las funciones de reloj y temperatura permitiendo al usuario configurarlo. Palabras claves— grados Celsius, grados Fahrenheit.
I. DESCRIPCIÓN El presente trabajo es un reloj de pared bastante especial, además de dar la hora (como todo reloj que se precie como tal), también nos muestra la temperatura ambiente. Pero lo que lo hace diferente a la mayoría de los relojes electrónicos es la forma en que está construido su particular segundero. En efecto, en lugar de indicar el transcurso de los segundos mediante un par de display LED de 7 segmentos como es habitual, lo hace mediante 60 diodos LED dispuestos en forma de circulo a lo largo del borde exterior del circuito impreso que aloja todos los componentes del reloj Figura 1. [1]
Figura 1: Circuito.
El reloj que vamos a construir puede indicar la hora y los minutos mediante 4 display LED de 7 segmentos, en el formato “HH:MM”, donde los “:” centrales están constituidos por los DP de los displays. Además los displays también se utilizan para mostrar la temperatura, que se obtiene mediante un sensor de temperatura LM 35 analógico. [1] El segundero, como decíamos, es una circunferencia formada por 60 LEDs de 5mm, controlados mediante solamente dos pines del Microcontrolador ATMEGA 32. Esto es posible gracias a la utilización de un registro de desplazamiento construido a partir de 8 circuitos integrados 74LS164N. [1] Además hemos dotado al reloj de 4 pequeños pulsadores, que servirán para llevar a cabo las tareas de puesta en hora, selección del modo de funcionamiento y temperatura. [1] Si bien el circuito del Reloj puede resultar intimidante por su tamaño (emplea 9 circuitos integrados y 68 resistores) en realidad no es tan complejo como parece. El esquema se basa en un Microcontrolador ATMEGA 32 que se encarga de llevar a cabo todas las tareas necesarias Figura 2.
Figura 2: Circuito del reloj.
Los pulsadores encargados de la gestión de la puesta en hora B. Registo de desplazamiento: y selección del modo de funcionamiento se encuentran conectados a los pines 15, 16, 17 y 18, del PORTD. Cada uno de Un "registro de desplazamiento" es una configuración estos pines se ha puesto a +V mediante un resistor de 330Ω. circuítal muy utilizada, generalmente para convertir un Cada vez que presiona un pulsador, el pin correspondiente se flujo de datos en forma serial a uno del tipo paralelo, pone a GND. motivo por el cual a menudo los chips encargados de esta tarea son llamados "conversores serie-paralelo". [2] La temperatura se lee desde un sensor LM35, conectado al pin 36 del microcontrolador. Este pin corresponder al PORTA Los datos que son enviados desde el microcontrolador pasan al registro de desplazamiento con cada pulso de reloj ADC4. que envía los datos o el valor a encender los LEDs. [2] Para mostrar tanto la información correspondiente a las horas y minutos como los datos de la temperatura, se emplearon 4 Muchos circuitos de registros de desplazamiento "reales" display LED de 7 segmentos de unos 3.5 centímetros de altura. también incluyen un sistema de RESET, que permite poner El modelo elegido fue el LDS-5161H. Se trata de un display de simultáneamente todas las salidas en "0" o estado bajo, sin cátodo común, donde cada segmento está constituido por dos necesidad de ingresar 8 ceros seguidos. Esto permite LEDs rojos en serie. Los “:” centrales están formados por los limpiar rápidamente el registro de desplazamiento. [2] DP de los dos displays centrales usando el tercer display transpuesto (invertido) de tal forma que nos presente los “:” Cuando decimos "rápidamente" nos referimos a que centrales. como la velocidad de los pulsos del reloj (CLOCK) no puede ser infinita (típicamente el máximo ronda los 10 o 20 Dado que el multiplexar estos displays mediante las técnicas MHz) y cada dato demora el tiempo de un pulso de reloj en tradicionales hubiese exigido un elevado número de pines desplazarse por el registro, introducir 8 "0"s llevaría 800 ns de E/S del microcontrolador ATMEGA32, se utilizó un registro (100 ns * 8 bits), contra los 100 ns que demora en aplicarse de desplazamiento o barrido. Cada una de las salidas está el RESET. No obstante, para obtener los tiempos exactos conectada a los pines 33,34,35,37,38,39,40 del PORTA y pin 29 implicados se debe consultar la hoja de datos del integrado del PORTC, y el barrido que habilita los displays se los hace que estemos utilizando, ya que los límites varían incluso con la tensión de alimentación y la temperatura. [2] con los pines 1,2,3,4 del PORTB. El mismo truco del registro de desplazamiento se utilizó para C. Sensor de Temperatura LM35: controlar los 60 LEDs que conforman el segundero. Esta vez fueron necesarios 8 circuitos integrados 74LS164N. Este El LM35 es un sensor de temperatura con una precisión registro dispone de 64 salidas, de las que se aprovechan solo las calibrada de 1ºC y un rango que abarca desde -55º a primeras 60. +150ºC. [3] Cada una de estas salidas controla uno de los LEDs a través El sensor se presenta en diferentes encapsulados pero el de un resistor de 300Ω que limita la corriente que los atraviesa más común es el to-92 de igual forma que un típico por el mismo. transistor con 3 patas, dos de ellas para alimentarlo y la tercera nos entrega un valor de tensión proporcional a la La etapa de alimentación esta construida alrededor de temperatura medida por el dispositivo. Con el LM35 sobre un regulador de voltaje LM7805 que proporciona la corriente la mesa las patillas hacia nosotros y las letras del necesaria al microcontrolador, los LEDs, los displays y el sensor encapsulado hacia arriba tenemos que de izquierda a de temperatura. [1] derecha los pines son: VCC - Vout - GND. [3] A. Diagrama de Flujo:
La salida es lineal y equivale a 10mV/ºC por lo tanto: +1500mV = 150ºC +250mV = 25ºC -550mV = -55ºC Funcionamiento: Para hacernos un termómetro lo único que necesitamos es un voltímetro bien calibrado y en la escala correcta para que nos muestre el voltaje equivalente a temperatura.
El LM35 funciona en el rango de alimentación comprendido entre 4 y 30 voltios. [3]
La manera más fácil de integrar varias etapas de diseño en un solo circuito y usando un solo microcontrolador.
Podemos conectarlo a un conversor Analógico/Digital y tratar la medida digitalmente, almacenarla o procesarla con el microcontrolador usando la siguiente formula para convertir de Fahrenheit a grados Celsius. [6]
La conversión de la temperatura de analógica a digital por software usando el ADC del microcontrolador.
[6]
Es necesario configurar perfectamente el reloj interno del microprocesador para que el reloj no presente adelantamientos o retardos.
Con esto se facilita mucho en el cálculo de la temperatura en el microcontrolador
Tener bien claro las etapas de diseño o diagrama de flujo para evitar contratiempos en la programación del microcontrolador.
III. COMPONENTES La lista de componentes que empleamos es la siguiente:
V. RECOMENDACIONES
8 circuitos integrados 74LS164N. 60 resistores de 300 ohm, 1/2 de Watt. 4 resistores de 330 ohm, 1/2 de Watt. 1 microcontrolador ATMEGA32. 1 sensor de temperatura LM35 1 condensador electrolítico de 470uF/25V. 4 displays de cátodo común LDS-5161H. 60 LEDs rojos de 5mm. 4 pulsadores de 8mm para circuito impreso. 1 reguladores de voltaje LM7805. 4 resistores de 1K, 1/2 de Watt. 4 transistores 2N3904 NPN. 1 Baquelita de fibra de vidrio.
En el uso del microcontrolador se debe tener en cuenta la cantidad de procesamiento que este va a cargar o alojar pese que este circuito se le quiso incrementar un código para fecha y alarma el microcontrolador se trababa. Se debe tener bien en cuenta a la hora de asignar los puertos del microcontrolador antes de empezar la etapa de programación. VI. REFERENCIAS [1] [2]
[3] [4] [5] [6]
Figura 3: Circuito PCB.
La presente figura 3 nos muestra el diseño de la baquéla que fue quemada para muestro circuito del reloj. IV. CONCLUSINES El uso y aplicación básica de un microcontrolador ATMEGA32 en la implementación de un reloj.
[En línea] <http://www.ucontrol.com.ar/wiki/index.php?title=El_relojito> [Consultada: 21 de enero 2011] [En línea] <http://www.ucontrol.com.ar/wiki/index.php?title=Registro_de_desplazamie nto> [Consultada: 21 de enero 2011] [En línea] <http://www.x-robotics.com/sensores.htm> [Consultada: 21 de enero 2011] [Software] <CodeVision AVR C Compiler> Versión 2.05. 2010. [Software] <Proteus> Versión 7.7. Labcenter Electronics 2009. Embedded C Programming and the Atmel AVR - Barnett, Cox and O’Cull, Thomson 2006.
modo++; if(modo>3) { modo=0; } }
VII. ANEXOS C贸digo Reloj.c El presente c贸digo realiza las funciones de reloj y presentaci贸n de temperatura
//UNIDADES Y DECENAS uni_seg++; //Segundos if (uni_seg>9) { uni_seg=0; dec_seg++; if(dec_seg>5) { dec_seg=0; uni_min++; //Minutos if(uni_min>9) { uni_min=0; dec_min++; if (dec_min>5) { dec_min=0; uni_hor++; //Horas if(uni_hor>9) { uni_hor=0; dec_hor++; }
/***************************************************** This program was produced by the CodeWizardAVR V2.04.4a Automatic Program Generator 漏 Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Reloj Version : 1.0 Date : 13/11/2010 Author : Company : UTPL Comments: Free Comments
Chip type : ATmega32 Program type : Application AVR Core Clock frequency: 4,000000 MHz Memory model : Small External RAM size :0 Data Stack size : 512 *****************************************************/ #include <mega32.h> #include <delay.h> #include <stdlib.h> #include <stdio.h> #define ADC_VREF_TYPE 0x00 static unsigned int cont_timer, cont_timer1; /* .5 second varible del conteo*/ int uni_seg, dec_seg, uni_min, dec_min, uni_hor, dec_hor, modo, modo1, barrid; unsigned char valor_vin [6]; char u, d, uf, df; /* variables de unidades y decenas del termometro*/ // ADC interrupt service routine char ADC_Vin; char ADC_Vin_F; interrupt [TIM0_OVF] void timer0_ovf_isr(void) { TCNT0 = 6; ++cont_timer1; if (cont_timer1 == 349) { PORTC.1 = (PORTC.1 ^ 1); cont_timer1 = 0; barrid++; //medio segundos if (barrid>120) { barrid=0; } } ++cont_timer; /*contador*/ if (cont_timer == 700) { PORTA.7 =(PORTA.7 ^ 1); // para que parpadee cada segundo cont_timer = 0; /*reset time counter for next .5 second*/ if(PIND.4==0) {
} } } } } if((dec_hor==2 && uni_hor==3) && (dec_min==5 uni_min==9)&& (dec_seg==5 && uni_seg==9)) { uni_seg=dec_seg=uni_min=dec_min=uni_hor=dec_hor=0; //INICIALIZA EL RELOJ }
&&
} // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) //INT0 SIRVE PARA INCREMENTAR { //INCREMENTO DEL RELOJ if (modo==2)/*INCREMENTA MINUTOS*/ { uni_min++; if(uni_min>9) { uni_min=0; dec_min++; if (dec_min>5) { dec_min=0; } } } if (modo==3) //INCREMENTA HORAS// { uni_hor++; if(uni_hor>9) { uni_hor=0;
dec_hor++; }
modo1=0; } }
if((dec_hor==2 && uni_hor==4)) { dec_hor=uni_hor=0; } } }
} void deco(int i) { if(i==0 || i==2 || i==3 || (i>4 && i<11)|| i==12 || i==15) /*a*/ PORTA.0=1; else PORTA.0=0;
// External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { //DECREMENTO DEL RELOJ if (modo==2)/*DECREMENTA MINUTOS*/ { uni_min--; if(uni_min<0) { uni_min=9; dec_min--; }
if(i<5 || (i>6 && i<10)) PORTA.1=1; else PORTA.1=0; if(i==0 || i==1 || (i>2 && i<10)) PORTA.2=1; else PORTA.2=0;
if(i==0 || i==2 || i==6 || i==8 || i==12 || i==15) PORTC.7=1; else PORTC.7=0;
} } interrupt [ADC_INT] void adc_isr(void) {
/*e*/
if(i==0 || (i>3 && i<7) || (i>7 && i<10) || i==12 || i==15) /*f*/ PORTA.5=1; else PORTA.5=0;
}
if((dec_hor==0 && uni_hor==0)) { dec_hor=2; uni_hor=3; }
/*c*/
if(i==0 || i==2 || i==3 || i==5 || i==6 || i==8 || i==12) /*d*/ PORTA.3=1; else PORTA.3=0;
if((dec_min==0 && uni_min==0)) { dec_min=5; uni_min=9; }
if (modo==3)/*DECREMENTA HORAS*/ { uni_hor--; if(uni_hor<0) { uni_hor=9; dec_hor--; }
/*b*/
if((i>1 && i<7) || (i>7 && i<10) || i==15) PORTA.6=1; else PORTA.6=0;
/*g*/
}
void main(void) { DDRA = 0xEF; //puerto A como salida de fuente a displays y entrada del sensor DDRD = 0x00; //puerto D como entrada de interrupciones DDRC = 0xFF; //puerto C como señal de leds y entrada de señal de sensor DDRB = 0xFF; //puerto B como salida a los displays GICR = 0b11000000;//Activar las interrupciones MCUCR= 10; // Detenciòn de las interrupciones (INT0,INT1) por flanco de bajada /*set timer 0 prescaler to clk/8*/ TCCR0=0x02; TCNT0=6; OCR0=0x00;
unsigned int adc_data; adc_data=ADCW; ADC_Vin=adc_data*0.00495*100; ADC_Vin_F=adc_data*((0.00495*100)*1.8)+32; // Read the AD conversion result d = ADC_Vin/10; u = ADC_Vin%10; df = ADC_Vin_F/10; uf = ADC_Vin_F%10; ftoa(ADC_Vin,2,valor_vin); ADCSRA= ADCSRA|0x40; if(PIND.1==0) { modo1++; if(modo1>2) {
/* unmask Timer 0 overflow interrupt*/ TIMSK=0x01; // ADC initialization // ADC Clock frequency: 1000,000 kHz // ADC Voltage Reference: AREF pin ADMUX=0x04; //CANAL 4 ADCSRA=0xCE|0x04;
UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0xCF; /* enable interrupts */ //HABILITA INTERRUPCIONES #asm("sei")
while (1)
{
else PORTC.0=1; if (modo==0)/*PRESENTA RELOJ*/ { //BARRIDO DE DISPLAY PORTB=1; deco(uni_min); delay_ms(1); PORTB=2; deco(dec_min); delay_ms(1); PORTB=4; deco(uni_hor); delay_ms(1); PORTB=8; deco(dec_hor); delay_ms(1); } if (modo==1)/*PRESENTA SEGUNDOS*/ { PORTB=1; deco(uni_seg); delay_ms(1); PORTB=2; deco(dec_seg); delay_ms(1); } if (modo==2) /*PRESENTA MINUTOS PARA IGUALAR*/ { PORTB=1; deco(uni_min); delay_ms(1); PORTB=2; deco(dec_min); delay_ms(1); } if (modo==3) /*PRESENTA HORAS PARA IGUALAR*/ { PORTB=4; deco(uni_hor); delay_ms(1); PORTB=8; deco(dec_hor); delay_ms(1); } if (modo1==1)/*PRESENTA GRADOS CELSIUS O CENTÍGRADOS*/ { PORTB=2; deco(12); delay_ms(50); PORTB=4; deco(u); delay_ms(50); PORTB=8; deco(d); delay_ms(50); } if (modo1==2)/*PRESENTA GRADOS FAHRENHEIT*/ { PORTB=2; deco(15); delay_ms(50); PORTB=4; deco(uf); delay_ms(50); PORTB=8; deco(df); delay_ms(50); } if(barrid==120) /*Barrido de Leds*/ PORTC.0=0;
} }
Datasheets
Figura 1: ATMEGA32 1
Figura 2: Sensor de temperatura LM35 1
Memoria del proyecto:
Figura 3: Reloj en diseño.
Figura 4: Reloj en uso. Referencias anexos: 1.- En LĂnea: <http://www.datasheetcatalog.com/>