Upload
byron-ganazhapa
View
77
Download
2
Embed Size (px)
Citation preview
http://relojcalendariotemyhum.blogspot.com/ Página 0
http://relojcalendariotemyhum.blogspot.com/
5-2-2015
Por: Byron Ganazhapa
CODEVISIONAVR
RELOJ, CALENDARIO,
TEMPERATURA
Y HUMEDAD
http://relojcalendariotemyhum.blogspot.com/ Página 1
CONTENIDO INTRODUCCIÓN .................................................................................................................. 1
¿QUÉ NECESITAMOS? ........................................................................................................ 1
DESARROLLO.................................................................................................................... 4
DESPLAZAMIENTO O BARRIDO .............................................................................................4
BCD A 7 SEGMENTOS ........................................................................................................5
HORA Y FECHA .................................................................................................................5
SENSOR DE TEMPERATURA ..................................................................................................5
SENSOR DE HUMEDAD .......................................................................................................6
ESQUEMÁTICOS .................................................................................................................. 1
DISEÑO DE PCB ................................................................................................................. 1
DISEÑO DE LA TARJETA DE CONTROL PARA SU ELABORACIÓN EN PCB DE PLACA DOBLE .......................1
DISEÑO DE LA TARJETA DE DISPLAY Y VISUALIZACIÓN EN PCB. ......................................................2
DISEÑO EN 3D DE LAS PLACAS PCB .......................................................................................3
CODIGO........................................................................................................................... 4
IMÁGENES DEL PROYECTO CONCLUIDO ..................................................................... 11
http://relojcalendariotemyhum.blogspot.com/ Página 1
INTRODUCCIÓN
Un visualizador de reloj de t iempo real y variables de clima, se ut iliza
para visualizar el t iempo y fecha en curso con temperatura y humedad
en el ambiente seleccionado.
Este proyecto deliberará la visualización del t iempo en el formato
hh:mm:ss de 24 horas, fecha en un formato de DD:MM:AA, temperatura
en grados celcius [°C] y humedad relat iva [%H]. El microcontrolador
ut ilizado es el Atmega32A que envía los datos a visualizar a 16 display de
7 segmentos Ánodo común. Los 16 displays son encendidos
individualmente uno seguido de otro y cada conjunto de 8 displays son
conectados a un chip decodificador BCD a 7 segmentos (7447) con el
propósito de ahorrar puertos conectados al Atmega, mientras que cada
común de los displays son conectados con un transistor 2N3904 a un
puerto del Atmega. Para la hora y fecha se usa una RTC (DS1307), para
la temperatura un termistor (TTC103) y humedad un sensor HH10D cuya
salida es un valor de frecuencia. El programa del microcontrolador
dispone una velocidad de desplazamiento o de barrido entre displays
por cada 1ms, así como los datos a visualizar que vamos de mostrar.
Para la visualización dispone un una función para configurar la fecha y
hora a través de 3 pulsadores.
http://relojcalendariotemyhum.blogspot.com/ Página 1
¿QUÉ NECESITAMOS?
Para este proyecto es muy indispensable disponer de un conjunto de
herramientas básicas de un laboratorio de electrónica: un soldador,
alambre de estaño, unos alicates de punta de aguja y cables.
Para el desarrollo de nuestro proyecto dispondremos de los siguientes
materiales:
1 Atmega32A
1 termistor TTC103
1 sensor de Humedad HH10D
16 displays de 7 segmentos Ánodo común (a su color preferido) 6
displays en par pequeños, 2 individuales pequeños y 2 individuales
medianos.
2 Decodificadores BCD a 7 segmentos 74LS47.
15 resistencias de 330 Ohms.
16 resistencias de 1 KOhms
5 resistencias de 10 KOhms
2 resistencias de 4.7 KOhms
2 resistencias de 560 Ohms
1 resistencia de 120 Ohms
1 resistencia de 220 Ohms
1 potenciómetro lineal de 10 KOhms
16 transistores 2N3904
1 Real Time Clock DS1307
1 cristal 32.768KHZ
http://relojcalendariotemyhum.blogspot.com/ Página 2
1 batería de botón 3V con su porta-pila
2 condensadores electrolít icos de 47uF
1 condensador electrolít ico de 100uF
2 condensadores cerámicos de 0.1uF
4 condensadores cerámicos de 10nF
1 Led rojo de 3mm
3 pulsadores
4 jumpers.
1 regleta de espadines hembra y macho
1 regulador de voltaje LM317
Jack DC para PCB.
Placa doble PCB
Atemga32A
Termistor TTC10
HH10D
Displays en par
Display
Display mediano
http://relojcalendariotemyhum.blogspot.com/ Página 3
Decodificadores BCD
a 7 segmentos 74LS47
Resistencias.
Potenciómetro lineal
Ttransistores 2N3904
Real Time Clock
DS1307
Cristal 32.768KHZ
Batería de botón 3V
con su porta-pila
Condensadores
electrolít icos
Condensadores cerámicos
Led rojo de 3mm
Pulsadores
Jumpers
http://relojcalendariotemyhum.blogspot.com/ Página 4
Espadines hembra y
macho
Regulador de
voltaje LM317
Jack DC para PCB
DESARROLLO
DESPLAZAMIENTO O BARRIDO
El barrido de los displays es básicamente una manera de activar uno
por uno en un instante a una frecuencia elevada.
Un display de 7-segmentos es una manera de visualizar datos
obtenidos por el uC enviados a través de 8 puertos por lo que equivale
a ut ilizar todo un puerto del uC para poder manejar un solo 7-
segmentos.
Pero en esta ocasión nos encontramos con la necesidad de ut ilizar
más de un display pero a la vez no disponemos de la cantidad
suficiente de puertos para ser ut ilizados. Por la falta de puertos es
imposible conectar y encender todo un conjunto de 16 dispalys, para
ello se ut iliza el método de barrido que consiste en encender y apagar
cada display seguido de otro cada 1ms, entonces no la vemos
encenderse y apagarse, porque la frecuencia de es imperceptible al
ojo humano.
Consideramos encender y apagar en 4 puertos del uC para un
conjunto de 8 (displays de t iempo y temperatura), y otros 4 puertos para
un conjunto de 8 (displays de fecha y humedad). El propósito de esta
http://relojcalendariotemyhum.blogspot.com/ Página 5
división es mejorar el rendimiento durante el proceso de barrido; por
ejemplo durante el encendido y apagado del primer y últ imo display
hay que considerar el t iempo que demora e barrer hasta el últ imo
display, en este caso es una frecuencia de aproximadamente de 8ms
sin considerar t iempos muertos del uC.
BCD A 7 SEGMENTOS
Uno de los problemas mencionados anteriormente es el número de
puertos limitados del uC, por lo que se ut iliza un chip para decodificar
datos BCD de 4 bits a 7 segmentos correspondiente a cada display,
Cada conjunto de 8 displays son conectados a un chip
decodificador BCD a 7-segmentos, por lo que es necesario el uso de 2
chip 74LS47. El número total de puertos ut ilizados para la presentación
de datos son de 8 puertos, y para el barrido de los displays son de 16
puertos uno por display conectado al común, por lo tanto los puertos
ut ilizados por el uC son de 24 puertos para un total de 16 displays.
HORA Y FECHA
La presentación de hora y fecha se la realiza mediante un el
disposit ivo DS1307, Por la simple razón de trabajar con eventos más
precisos, puntuales y exactos a lo largo del t iempo. Este pequeño
disposit ivo es uno de los más populares en relojes RTC (Real Time Clock)
por su sencillez de uso y por su confiabilidad a largo plazo. Preparado
para ofrecerte la hora hasta el año 2100 y bisiestos.
Para la lectura de hora y fecha se usa el bus I2C entre el uC y RTC
que brinda hora con minutos y segundos y calendario que contempla
los años bisiestos hasta fin de siglo.
SENSOR DE TEMPERATURA
Uno de los principales objet ivos de este proyecto es el uso de un
sensor de temperatura analógica para la visualización de temperatura
en grados celcius en dos displays.
http://relojcalendariotemyhum.blogspot.com/ Página 6
El sensor ut ilizado es el TTC103 de salida de voltaje analógico, por la
única razón de disponer este disposit ivo, la opción de ut ilizar otro sensor
es opcional, pero yo dispongo del termistor.
Las característ icas del termistor son las siguientes:
Característ icas Valor
Valor de resistencia nominal del
termistor (NTC) a 25ºC
10000 [ohm]
Parámetro beta 4050 [K]
Fórmula utilizada por el fabricante 𝑅 ( 𝑇 ) = 𝑅25 𝑒𝑥𝑝 (𝐵/𝑇 − 𝐵/𝑇25)
Para la lectura de los datos del sensor se ut iliza un puerto analógico
del uC el cual es el puerto ADC7, y para obtener la temperatura real se
ut iliza la fórmula propuesta el fabricante en grados Kelvin, y para
obtener en grados celcius como se lo ha propuesto solo se usa una
simple ecuación °C = °K - 273.15.
SENSOR DE HUMEDAD
Otro de los objet ivos de este proyecto es el uso de un sensor de
humedad para la visualización de humedad relat iva en dos displays.
El sensor ut ilizado es el HH10D cuya salida es un valor de frecuencia
que varía entre los 5 y 10 kHz dependiendo de la humedad entre el 1 y
99 % respectivamente.
El modulo del HH10D consiste en un sensor capacit ivo t ipo CMOS,
convert idor de frecuencia y una memoria EEPROM usada para el
almacenamiento de los factores de calibración y para el cálculo de la
humedad. Debido a las característ icas del sensor de humedad de t ipo
condensador, el sistema puede responder a los cambios de humedad
muy rápido.
Las característ icas del sensor de humedad son las siguientes:
http://relojcalendariotemyhum.blogspot.com/ Página 7
Parámetro Mínimo nominal Máximo
Rango de humedad 1 % 99 %
exactitud -3 % +3 %
Rango de temperatura -10 °C +60 °C
Voltaje de operación 2.7 V 3 V 3.3 V
estabilidad vs tiempo 1 % por año
Corriente de consumo 120 uA 150 uA 180 uA
Rango de frecuencia de
salida
5 kHz 6.5 kHz 10 kHz
Para la lectura de humedad correcta, dos factores de calibración
deben ser leídos desde la EEPROM en la dirección 10 y 12 por un bus i2C
para la sensibilidad y compensación respectivamente. Una vez
calibrado el modulo, se mide la frecuencia de salida del sensor,
entonces el valor de humedad correcto puede ser calculada mediante
la siguiente expresión:
𝐻𝑅(%) = (𝑐𝑜𝑚𝑝𝑒𝑛𝑠𝑎𝑐𝑖𝑜𝑛 − 𝐹𝑜𝑢𝑡) ∗ 𝑠𝑒𝑛𝑠/2^12
La dirección física de la EEPROM está fijada a 81.
Dirección de la sensibilidad 10.
Dirección de la compensación 12.
Para la lectura de los factores de calibración puedes usar otro programa en el
mismo circuito del proyecto o como prefieras para saber qué factores corresponden a
tu sensor. Para mi sensor son: sens = 377 y compensación = 7792.
http://relojcalendariotemyhum.blogspot.com/ Página 8
PULSADORES
Con el objeto de realizar un reloj con funciones básicas, se incorporó
3 pulsadores con el propósito de igualar la hora o cambiar la fecha.
El pulsador Menú realiza la función de cambiar de modo normal a
modo minutos, horas, años, meses y días:
Menu = 0; modo normal
Menu = 1; modo de igualar minutos
Menu = 2; modo de igualar horas
Menu = 3; modo de igualar Años
Menu = 4; modo de igualar meses
Menu = 5; modo de igualar días
Menu = 6; modo de guardar en memoria t iempo y fecha
actualizada
Los pulsadores de disminuir (-) y aumentar (+) realizar la simple función
de cambiar los valores de los datos para obtener los deseados o
igualados con respecto a un reloj o calendario actual.
http://relojcalendariotemyhum.blogspot.com/ Página 1
ESQUEMÁTICOS
Esquema del reloj calendario, temperatura y humedad.
Nota: no existe una librería en Proteus para el HH10D por lo que se usa un generador de onda cuadrada y se lo conecta con espadines.
Se usa un Lm317 por la razón de utilizar componentes disponibles a mi alcance, si prefieres puedes usar un Lm1117 y modificar el esquema para obtener 3.3V.
SERVOMOTOR _COMUNICACION SERIAL
SCL
SDA
BCD_1_A
BCD_1_B
BCD_1_C
BCD_1_D
DISPLAY_1_SEG
DISPLAY_2_SEG
DISPLAY_1_MIN
TERMISTOR
RTC
R2
4.7k
R3
4.7k
SCL
SDA
VBAT3
X11
X22
SCL6
SDA5
SOUT7
DS1307
DS1307
12
32.768KHZCRYSTAL
12
3 VOLTS3
A7
QA13
B1
QB12
C2
QC11
D6
QD10
BI/RBO4
QE9
RBI5
QF15
LT3
QG14
1 - 74LS47N
7447
R41k
Q12N3904
PA0/ADC040
PA1/ADC139
PA2/ADC238
PA3/ADC337
PA4/ADC436
PA5/ADC535
PA6/ADC634
PB0/XCK/T01
PB1/T12
PB2/INT2/AIN03
PB3/OC0/AIN14
PB4/SS5
PB5/MOSI6
PB6/MISO7
PB7/SCK8
PA7/ADC733
RESET9
XTAL113
XTAL212
PC0/SCL22
PC1/SDA23
PC2/TCK24
PC3/TMS25
PC4/TDO26
PC5/TDI27
PC6/TOSC128
PC7/TOSC229
PD0/RXD14
PD1/TXD15
PD2/INT016
PD3/INT117
PD4/OC1B18
PD5/OC1A19
PD6/ICP20
PD7/OC221
AVCC30
AREF32
ATMEGA32A
ATMEGA32
DISPLAY_2_MIN
DISPLAY_1_HORA
DISPLAY_2_HORA
DISPLAY_1_AÑO
DISPLAY_2_AÑO
DISPLAY_1_MES
DISPLAY_2_MES
DISPLAY_1_DIA
DISPLAY_2_DIA
DISPLAY_1_TEMPERATURA
DISPLAY_2_TEMPERATURA
DISPLAY_1_HUMEDAD
BCD_2_A
BCD_2_B
BCD_2_C
BCD_2_D
DISPLAY_2_HUMEDAD
HH10D
Refe_comparador
INCREMENTO
DECREMENTO
MENU
C10.1u
C20.1u
R1
120
BCD_1_A
BCD_1_B
BCD_1_C
BCD_1_D
A_1
B_1
C_1
D_1
E_1
F_1
G_1
A7
QA13
B1
QB12
C2
QC11
D6
QD10
BI/RBO4
QE9
RBI5
QF15
LT3
QG14
2 - 74LS47N
7447
BCD_2_A
BCD_2_B
BCD_2_C
BCD_2_D
A_2
B_2
C_2
D_2
E_2
F_2
G_2
A_1
B_
1
C_1
D_1
E_
1
F_
1
G_
1
TIM
E_
1
R51k
Q22N3904
TIM
E_
2
R61k
Q32N3904
TIM
E_
3
R71k
Q42N3904
TIM
E_
4
R81k
Q52N3904
TIM
E_
5
R91k
Q62N3904
TIM
E_
6
TIM
E_
1
TIM
E_
2
TIM
E_
3
TIM
E_
4
TIM
E_
5
TIM
E_
6
R101k
Q72N3904
DA
TA
_1
R111k
Q82N3904
DA
TA
_2
R121k
Q92N3904
DA
TA
_3
R131k
Q102N3904
DA
TA
_4
R141k
Q112N3904
DA
TA
_5
R151k
Q122N3904
DA
TA
_6
DA
TA
_1
DA
TA
_2
DA
TA
_3
DA
TA
_4
DA
TA
_5
DA
TA
_6
R161k
Q132N3904
TE
MP
_1
R171k
Q142N3904
TE
MP
_2
R181k
Q152N3904
HU
ME
_1
R191k
Q162N3904
HU
ME
_2
TE
MP
_1
TE
MP
_2
A_2
B_
2
C_2
D_2
E_
2
F_
2
G_
2
HU
ME
_1
HU
ME
_2
DIS
PL
AY
_1
_S
EG
DIS
PL
AY
_2
_S
EG
DIS
PL
AY
_1
_M
IN
DIS
PL
AY
_2
_M
IN
DIS
PL
AY
_1
_H
OR
A
DIS
PL
AY
_2
_H
OR
A
DIS
PL
AY
_1
_A
ÑO
DIS
PL
AY
_2
_A
ÑO
DIS
PL
AY
_1
_M
ES
DIS
PL
AY
_2
_M
ES
DIS
PL
AY
_1
_D
IA
DIS
PL
AY
_2
_D
IA
DIS
PL
AY
_1
_T
EM
PE
RA
TU
RA
DIS
PL
AY
_2
_T
EM
PE
RA
TU
RA
DIS
PL
AY
_1
_H
UM
ED
AD
DIS
PL
AY
_2
_H
UM
ED
AD
12
MENU
R2010k
MENU
12
INCRE
R2110k
INCREMENTO
12
DECRE
R2210k
DECREMENTO
A_2
B_
2
C_2
D_2
E_
2
F_
2
G_
2
A_1
B_
1
C_1
D_1
E_
1
F_
1
G_
1
12
RESET
R4110k
Reset
Reset
HH10D
HH10D
R23
10k
TE
RM
IST
OR
R24
560
R25
560
Refe_comparador
VI3
VO2
AD
J1
LM317TLM317T
R26220
C3100uF
C410nF
R27330R28330R29330R30330R31330R32330R33330
R34330R35330R36330R37330R38330R39330R40330
1 3
2
RV1
10k
1
2
3
4
5
HH10D
CONN-H5
HH10D
3Vcc
3Vcc
SCL
SDA
1 2
SCL-HH10DCONN-H2
1 2
SDA-HH10DCONN-H2
1 2
SCL-RTCCONN-H2
1 2
SDA-RTCCONN-H2
C5
10nF
C6
10nF
C7
10nF
1 2
NTC-TT103CONN-H2
AK
D1LED-RED
R42330
C847uF
C910uF
BYRON GANAZHAPA
Bloque del Sensor de Humedad
http://relojcalendariotemyhum.blogspot.com/ Página 1
DISEÑO DE PCB
DISEÑO DE LA TARJETA DE CONTROL PARA SU ELABORACIÓN EN PCB
DE PLACA DOBLE
Placa superior de la PCB.
Placa inferior de la PCB.
http://relojcalendariotemyhum.blogspot.com/ Página 2
DISEÑO DE LA TARJETA DE DISPLAY Y VISUALIZACIÓN EN PCB.
Placa superior de la PCB.
http://relojcalendariotemyhum.blogspot.com/ Página 3
Placa inferior de la PCB.
DISEÑO EN 3D DE LAS PLACAS PCB
Se fabricarán 2 placas para evitar realizar una sola grande y para
empotrar una sobre otra. Si prefieres puedes usar componentes superficiales o SMD y modificando el diseño en PCB.
http://relojcalendariotemyhum.blogspot.com/ Página 4
CODIGO
El programa fue desarrollado en CodevisionAVR versión 2.05.0
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : Reloj, Temperatura y Humedad
Version : 1.0
Date : 30/09/2014
Author : Byron Ganazhapa
Company : UTPL
Comments:
Chip type : ATmega32A
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*****************************************************/
#include <mega32a.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <delay.h>
#include <bcd.h>
// Variables de tiempo y fecha
unsigned char hora;
unsigned char minu;
unsigned char seg;
unsigned char dia;
unsigned char mes;
unsigned char anyo;
unsigned char hora_BCD;
unsigned char minu_BCD;
unsigned char seg_BCD;
unsigned char dia_BCD;
unsigned char mes_BCD;
unsigned char anyo_BCD;
unsigned char dig_2_seg, dig_1_seg;
unsigned char dig_2_min, dig_1_min;
unsigned char dig_2_hora, dig_1_hora;
unsigned char dig_2_dia, dig_1_dia;
unsigned char dig_2_mes, dig_1_mes;
unsigned char dig_2_anyo, dig_1_anyo;
unsigned char get_hora, get_minu, get_seg;
unsigned char get_dia, get_mes, get_anyo;
#define DISPLAY_1_SEG 0x01
http://relojcalendariotemyhum.blogspot.com/ Página 5
#define DISPLAY_2_SEG 0x01
#define DISPLAY_1_MIN 0x01
#define DISPLAY_2_MIN 0x01
#define DISPLAY_1_HORA 0x01
#define DISPLAY_2_HORA 0x01
#define DISPLAY_1_DIA 0x01
#define DISPLAY_2_DIA 0x01
#define DISPLAY_1_MES 0x01
#define DISPLAY_2_MES 0x01
#define DISPLAY_1_ANYO 0x01
#define DISPLAY_2_ANYO 0x01
#define DISPLAY_1_TEMPERATURA 0x01
#define DISPLAY_2_TEMPERATURA 0x01
#define DISPLAY_1_HUMEDAD 0x01
#define DISPLAY_2_HUMEDAD 0x01
int Menu=0;
int dig_1_temp, dig_2_temp;
int dig_1_hum, dig_2_hum;
// variables para sensor de humedad
unsigned int count = 0;
float temp;
float frecuencia;
float H = 0.0;
int Humedad;
// variables para sensor de tempoeratura
float Vin = 5.0; // [V] Voltage de entrada en el divisor
de tension
float Raux = 10000; // [ohm] Valor de la resistencia
secundaria del divisor de tension
float R0 = 10000; // [ohm] Valor de resistencia nominal
del termistor (NTC) a 25ºC
float T0 = 298.15; // [K] (25ºC)
float Vout = 0.0; // [V] Voltage given by the Voltage-
Divider
float Rout = 0.0; // [ohm] Resistencia actual del
Termistor (NTC)
float beta = 4050.0; // [K] Parametro Beta
float TempK = 0.0; // [K] Temperatura de salida en grados
Kelvin
int TempC = 0; // [ºC] Temperatura de salida en grados
Celsius
float Rinf; // [ohm] Parametros Rinf
long iCont = 0; // Contador de ciclos, par el calculo de la
temperatura media
float cTemp1; // Variable temporal para acumular las
temperaturas leidas
// variables para ADC
unsigned int adc_data;
#define ADC_VREF_TYPE 0x40 //47
// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=1
.equ __scl_bit=0
http://relojcalendariotemyhum.blogspot.com/ Página 6
#endasm
#include <i2c.h>
// DS1307 Real Time Clock functions
#include <ds1307.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(Menu == 1){ // igualar minutos
minu = minu + 1;
delay_ms(100);
if(minu>59) minu = 0;
}
if(Menu == 2){ // igualar horas
hora = hora + 1;
delay_ms(100);
if(hora>24) hora = 0;
}
if(Menu == 3){ // igualar año
anyo = anyo + 1;
delay_ms(100);
if(anyo>99) anyo = 0;
}
if(Menu == 4){ // igualar mes
mes = mes + 1;
delay_ms(100);
if(mes>12) mes = 0;
}
if(Menu == 5){ // igualar dia
dia = dia + 1;
delay_ms(100);
if(dia>31) dia = 0;
}
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if(Menu == 1){ // igualar minutos
minu = minu - 1;
delay_ms(100);
if((signed char)minu<0) minu = 59;
}
if(Menu == 2){ // igualar horas
hora = hora - 1;
delay_ms(100);
if((signed char)hora<0) hora = 23;
}
if(Menu == 3){ // igualar año
anyo = anyo - 1;
delay_ms(100);
if((signed char)anyo<0) anyo = 99;
}
http://relojcalendariotemyhum.blogspot.com/ Página 7
if(Menu == 4){ // igualar mes
mes = mes - 1;
delay_ms(100);
if((signed char)mes<0) mes = 12;
}
if(Menu == 5){ // igualar dia
dia = dia - 1;
delay_ms(100);
if((signed char)dia<0) dia = 31;
}
}
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H = 0x00;
TCNT1L = 0x00;
temp = (float)count;
frecuencia = temp*1.02554; //constante de calibración =
1.02354. Cálculo de humedad
H = (7792-frecuencia)*(0.09204);
Humedad = (int)H;
count = 0;
}
// Analog Comparator interrupt service routine
interrupt [ANA_COMP] void ana_comp_isr(void)
{
count = count+1; // Cálculo de frecuencia.
}
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
PORTA=0x00;
DDRA=0x7F;
PORTB=0x00;
DDRB=0xF1;
PORTC=0x00;
http://relojcalendariotemyhum.blogspot.com/ Página 8
DDRC=0xFC;
PORTD=0x00;
DDRD=0xF3;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0C;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1A=(31250-1);
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
// INT2: Off
GICR|=0xC0;
MCUCR=0x0A;
MCUCSR=0x00;
GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Analog Comparator initialization
// Analog Comparator: On
// Interrupt on Rising Output Edge
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x0B;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 500,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
// I2C Bus initialization
i2c_init();
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
http://relojcalendariotemyhum.blogspot.com/ Página 9
rtc_init(0,0,0);
rtc_get_time(&get_hora,&get_minu,&get_seg);
rtc_get_date(&get_dia,&get_mes,&get_anyo);
delay_ms(100);
hora = get_hora;
minu = get_minu;
seg = get_seg;
dia = get_dia;
mes = get_mes;
anyo = get_anyo;
rtc_set_time(hora,minu,seg);
rtc_set_date(dia,mes,anyo);
// Global enable interrupts
#asm("sei")
while (1){
/*
Menu = 0; modo normal
Menu = 1; modo de igualar minutos
Menu = 2; modo de igualar horas
Menu = 3; modo de igualar Años
Menu = 4; modo de igualar meses
Menu = 5; modo de igualar días
Menu = 6; modo de guardar en memoria tiempo y fecha actualizada
*/
if (PINB.1 == 1){ // Botón de Menú
Menu = Menu + 1; // menu en modo de igualar hora y fecha
delay_ms(500); // retrazo para evitar rebotes
}
if (Menu == 6){
rtc_set_time(hora,minu,seg); // menu en modo de grabar en
memoria del DS1307 el tiempo y fecha actualizada.
rtc_set_date(dia,mes,anyo);
delay_ms(1000);
Menu = 0;
}
PORTD.6 = DISPLAY_2_TEMPERATURA & 0x00;
PORTB.0 = DISPLAY_2_HUMEDAD & 0x00;
if(Menu == 0){ // obtener el tiempo y fecha en modo normal
rtc_get_time(&hora,&minu,&seg);
rtc_get_date(&dia,&mes,&anyo);
}
cTemp1=0;
if (iCont<=50000){
Rinf=R0*exp(-beta/T0); // = 0.0126079
adc_data=read_adc(7); // leo el canal ADC 7
// Cálculo del valor de la resistencia termistor (NTC)
actual (a través de Vout)
Vout = Vin*(adc_data)/1023.0;
Rout = (Raux*Vout/(Vin-Vout));
// Calculo de la temperatura en grados Kelvin
http://relojcalendariotemyhum.blogspot.com/ Página 10
TempK=log(Rout/Rinf);
TempK=(beta/TempK);
// Calculo de la temperatura en grados Celsius
TempC=TempK-273.15;
// Almacenamos la temperatura (grados Celsuis) actual para
despues obtener la media
cTemp1 = cTemp1 + TempC;
delay_us(10);
iCont ++;
}
else{
// Calculamos la temperatura media
TempC = (int)(cTemp1/iCont);
delay_us(10);
iCont=0;
}
// Convierto los digitos a BCD y los divido en dos partes de 4
bits para cada display.
seg_BCD = bin2bcd(seg); dig_2_seg = (seg_BCD&0xF0)>>4;
dig_1_seg = seg_BCD&0x0F;
minu_BCD = bin2bcd(minu); dig_2_min = (minu_BCD&0xF0)>>4;
dig_1_min = minu_BCD&0x0F;
hora_BCD = bin2bcd(hora); dig_2_hora = (hora_BCD&0xF0)>>4;
dig_1_hora = hora_BCD&0x0F;
TempC = bin2bcd(TempC); dig_2_temp = (TempC&0xF0)>>4;
dig_1_temp = TempC&0x0F;
dia_BCD = bin2bcd(dia); dig_2_dia = dia_BCD&0xF0;
dig_1_dia = (dia_BCD&0x0F)<<4;
mes_BCD = bin2bcd(mes); dig_2_mes = mes_BCD&0xF0;
dig_1_mes = (mes_BCD&0x0F)<<4;
anyo_BCD = bin2bcd(anyo); dig_2_anyo = anyo_BCD&0xF0;
dig_1_anyo = (anyo_BCD&0x0F)<<4;
Humedad = bin2bcd(H); dig_2_hum = Humedad&0xF0;
dig_1_hum = (Humedad&0x0F)<<4;
// Realizo la miltiplexación de displays.
PORTA = dig_1_seg;
PORTB = dig_1_anyo;
PORTA.4 = DISPLAY_1_SEG;
PORTC.5 = DISPLAY_1_ANYO;
delay_ms(1);
PORTA.4 = DISPLAY_1_SEG & 0x00;
PORTC.5 = DISPLAY_1_ANYO & 0x00;
PORTA = dig_2_seg;
PORTB = dig_2_anyo;
PORTA.5 = DISPLAY_2_SEG;
PORTC.6 = DISPLAY_2_ANYO;
delay_ms(1);
PORTA.5 = DISPLAY_2_SEG & 0x00;
PORTC.6 = DISPLAY_2_ANYO & 0x00;
PORTA = dig_1_min;
PORTB = dig_1_mes;
PORTA.6 = DISPLAY_1_MIN;
PORTC.7 = DISPLAY_1_MES;
delay_ms(1);
PORTA.6 = DISPLAY_1_MIN & 0x00;
PORTC.7 = DISPLAY_1_MES & 0x00;
PORTA = dig_2_min;
PORTB = dig_2_mes;
PORTC.2 = DISPLAY_2_MIN;
http://relojcalendariotemyhum.blogspot.com/ Página 11
PORTD.0 = DISPLAY_2_MES;
delay_ms(1);
PORTC.2 = DISPLAY_2_MIN & 0x00;
PORTD.0 = DISPLAY_2_MES & 0x00;
PORTA = dig_1_hora;
PORTB = dig_1_dia;
PORTC.3 = DISPLAY_1_HORA;
PORTD.1 = DISPLAY_1_DIA;
delay_ms(1);
PORTC.3 = DISPLAY_1_HORA & 0x00;
PORTD.1 = DISPLAY_1_DIA & 0x00;
PORTA = dig_2_hora;
PORTB = dig_2_dia;
PORTC.4 = DISPLAY_2_HORA;
PORTD.4 = DISPLAY_2_DIA;
delay_ms(1);
PORTC.4 = DISPLAY_2_HORA & 0x00;
PORTD.4 = DISPLAY_2_DIA & 0x00;
PORTA = dig_1_temp;
PORTB = dig_1_hum;
PORTD.5 = DISPLAY_1_TEMPERATURA;
PORTD.7 = DISPLAY_1_HUMEDAD;
delay_ms(1);
PORTD.5 = DISPLAY_1_TEMPERATURA & 0x00;
PORTD.7 = DISPLAY_1_HUMEDAD & 0x00;
PORTA = dig_2_temp;
PORTB = dig_2_hum;
PORTD.6 = DISPLAY_2_TEMPERATURA;
PORTB.0 = DISPLAY_2_HUMEDAD;
delay_ms(1);
}
}
IMÁGENES DEL PROYECTO CONCLUIDO
http://relojcalendariotemyhum.blogspot.com/ Página 12
http://relojcalendariotemyhum.blogspot.com/ Página 13
http://relojcalendariotemyhum.blogspot.com/ Página 14
http://relojcalendariotemyhum.blogspot.com/ Página 15
http://relojcalendariotemyhum.blogspot.com/ Página 16
http://relojcalendariotemyhum.blogspot.com/ Página 17
http://relojcalendariotemyhum.blogspot.com/ Página 18
http://relojcalendariotemyhum.blogspot.com/ Página 19
Si deseas descargar el proyecto completa visita el siguiente blog: http://relojcalendariotemyhum.blogspot.com/