Sunteți pe pagina 1din 32

http://relojcalendariotemyhum.blogspot.com/ ()tructura basica de programacion.

Por: Byron Ganazhapa

RELOJ,
CODEVISION
AVR

CALENDARI
O,
TEMPERATU
RA Y
HUMEDAD

http://relojcalendariotemyhum.blogspot.com/

Pgina 1

CONTENIDO
INTRODUCCIN........................................................................ 1
QU

NECESITAMOS?................................................................1

D ESARROLLO ........................................................................4
DESPLAZAMIENTO O BARRIDO....................................................................4
BCD A 7 SEGMENTOS................................................................................ 5
HORA Y FECHA.......................................................................................... 5
SENSOR DE TEMPERATURA.........................................................................5
SENSOR DE HUMEDAD................................................................................ 6

ESQUEMTICOS.......................................................................1
DISEO

DE

PCB......................................................................1

DISEO DE LA TARJETA DE CONTROL PARA SU ELABORACIN EN PCB DE PLACA DOBLE


................................................................................................................. 1
DISEO DE LA TARJETA DE DISPLAY Y VISUALIZACIN EN PCB......................2
DISEO EN 3D DE LAS PLACAS PCB...........................................................3

C ODIGO ...............................................................................4
I MGENES

DEL PROYECTO CONCLUIDO .....................................11

INTRODUCCIN
Un visualizador de reloj de tiempo real y variables de clima, se utiliza para
visualizar el tiempo y fecha en curso con temperatura y humedad en el
ambiente seleccionado.
Este proyecto deliberar la visualizacin del tiempo en el formato hh:mm:ss de
24 horas, fecha en un formato de DD:MM:AA, temperatura en grados celcius
[C] y humedad relativa [%H]. El microcontrolador utilizado es el Atmega32A
que enva los datos a visualizar a 16 display de 7 segmentos nodo comn. 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 propsito de ahorrar puertos conectados al Atmega,
mientras que cada comn de los displays son conectados con un transistor
http://relojcalendariotemyhum.blogspot.com/

Pgina 2

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 visualizacin dispone un una funcin para configurar la fecha y hora a
travs de 3 pulsadores.

Q U

NECESITAMOS ?

Para este proyecto es muy indispensable disponer de un conjunto de


herramientas bsicas de un laboratorio de electrnica: un soldador, alambre de
estao, 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 comn (a su color preferido) 6


displays en par pequeos, 2 individuales pequeos 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

http://relojcalendariotemyhum.blogspot.com/

Pgina 3

2 resistencias de 560 Ohms

1 resistencia de 120 Ohms

1 resistencia de 220 Ohms

1 potencimetro lineal de 10 KOhms

16 transistores 2N3904

1 Real Time Clock DS1307

1 cristal 32.768KHZ

1 batera de botn 3V con su porta-pila

2 condensadores electrolticos de 47uF

1 condensador electroltico de 100uF

2 condensadores cermicos de 0.1uF

4 condensadores cermicos 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

http://relojcalendariotemyhum.blogspot.com/

Pgina 4

Atemga32A

Termistor TTC10

HH10D

Displays en par

Display

Display mediano

Decodificadores BCD
a 7 segmentos
74LS47

Resistencias.

Potencimetro lineal

Ttransistores

Real Time Clock

Cristal 32.768KHZ

2N3904

DS1307

http://relojcalendariotemyhum.blogspot.com/

Pgina 5

Batera de botn 3V

Condensadores

con su porta-pila

electrolticos

Led rojo de 3mm

Pulsadores

Jumpers

Espadines hembra y

Regulador de

Jack DC para PCB

macho

voltaje LM317

Condensadores cermicos

D ESARROLLO
DESPLAZAMIENTO O BARRIDO
El barrido de los displays es bsicamente 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 travs de 8 puertos por lo que equivale a utilizar todo un
puerto del uC para poder manejar un solo 7-segmentos.
http://relojcalendariotemyhum.blogspot.com/

Pgina 6

Pero en esta ocasin nos encontramos con la necesidad de utilizar ms de un


display pero a la vez no disponemos de la cantidad suficiente de puertos para
ser utilizados. Por la falta de puertos es imposible conectar y encender todo un
conjunto de 16 dispalys, para ello se utiliza el mtodo 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 tiempo y temperatura), y otros 4 puertos para un conjunto de 8
(displays de fecha y humedad). El propsito de esta divisin es mejorar el
rendimiento durante el proceso de barrido; por ejemplo durante el encendido y
apagado del primer y ltimo display hay que considerar el tiempo que demora
e barrer hasta el ltimo display, en este caso es una frecuencia de
aproximadamente de 8ms sin considerar tiempos muertos del uC.

BCD A 7 SEGMENTOS
Uno de los problemas mencionados anteriormente es el nmero de puertos
limitados del uC, por lo que se utiliza 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 nmero total
de puertos utilizados para la presentacin de datos son de 8 puertos, y para el
barrido de los displays son de 16 puertos uno por display conectado al comn,
por lo tanto los puertos utilizados por el uC son de 24 puertos para un total de
16 displays.

HORA Y FECHA
La presentacin de hora y fecha se la realiza mediante un el dispositivo
DS1307, Por la simple razn de trabajar con eventos ms precisos, puntuales y
exactos a lo largo del tiempo. Este pequeo dispositivo es uno de los ms
populares en relojes RTC (Real Time Clock) por su sencillez de uso y por su

http://relojcalendariotemyhum.blogspot.com/

Pgina 7

confiabilidad a largo plazo. Preparado para ofrecerte la hora hasta el ao 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 aos bisiestos
hasta fin de siglo.

SENSOR DE TEMPERATURA
Uno de los principales objetivos de este proyecto es el uso de un sensor de
temperatura analgica para la visualizacin de temperatura en grados celcius
en dos displays.
El sensor utilizado es el TTC103 de salida de voltaje analgico, por la nica
razn de disponer este dispositivo, la opcin de utilizar otro sensor es opcional,
pero yo dispongo del termistor.
Las caractersticas del termistor son las siguientes:
Caractersticas

Valor

Valor de resistencia nominal 10000 [ohm]


del termistor (NTC) a 25C
Parmetro beta
Frmula

utilizada

4050 [K]
por

el

R ( T )=R 25 exp(B /T B/T 25)

fabricante
Para la lectura de los datos del sensor se utiliza un puerto analgico del uC el
cual es el puerto ADC7, y para obtener la temperatura real se utiliza la frmula
propuesta el fabricante en grados Kelvin, y para obtener en grados celcius
como se lo ha propuesto solo se usa una simple ecuacin C = K - 273.15.

SENSOR DE HUMEDAD
Otro de los objetivos de este proyecto es el uso de un sensor de humedad
para la visualizacin de humedad relativa en dos displays.
El sensor utilizado es el HH10D cuya salida es un valor de frecuencia que
vara entre los 5 y 10 kHz dependiendo de la humedad entre el 1 y 99 %
respectivamente.
http://relojcalendariotemyhum.blogspot.com/

Pgina 8

El modulo del HH10D consiste en un sensor capacitivo tipo CMOS,


convertidor

de

frecuencia

una

memoria

EEPROM

usada

para

el

almacenamiento de los factores de calibracin y para el clculo de la humedad.


Debido a las caractersticas del sensor de humedad de tipo condensador, el
sistema puede responder a los cambios de humedad muy rpido.
Las caractersticas del sensor de humedad son las siguientes:

Parmetro

Mnimo

nominal

Mximo

Rango de humedad

1%

99 %

exactitud

-3 %

+3 %

-10 C

+60 C

Rango

de

temperatura
Voltaje de operacin

2.7 V

estabilidad vs tiempo

3V

3.3 V

1 % por ao

Corriente de consumo

120 uA

150 uA

180 uA

Rango de frecuencia

5 kHz

6.5 kHz

10 kHz

de salida
Para la lectura de humedad correcta, dos factores de calibracin deben ser
ledos desde la EEPROM en la direccin 10 y 12 por un bus i2C para la
sensibilidad y compensacin 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 expresin:
12

HR ()=(compensacionFout )sens/2

La direccin fsica de la EEPROM est fijada a 81.


Direccin de la sensibilidad 10.
Direccin de la compensacin 12.

http://relojcalendariotemyhum.blogspot.com/

Pgina 9

Para la lectura de los factores de calibracin 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 compensacin = 7792.

PULSADORES
Con el objeto de realizar un reloj con funciones bsicas, se incorpor 3
pulsadores con el propsito de igualar la hora o cambiar la fecha.
El pulsador Men realiza la funcin de cambiar de modo normal a modo
minutos, horas, aos, meses y das:

Menu
Menu
Menu
Menu
Menu
Menu
Menu

=
=
=
=
=
=
=

0;
1;
2;
3;
4;
5;
6;

modo
modo
modo
modo
modo
modo
modo

normal
de igualar minutos
de igualar horas
de igualar Aos
de igualar meses
de igualar das
de guardar en memoria tiempo y fecha actualizada

Los pulsadores de disminuir (-) y aumentar (+) realizar la simple funcin de


cambiar los valores de los datos para obtener los deseados o igualados con
respecto a un reloj o calendario actual.

ESQUEMTICOS
Esquema del reloj calendario, temperatura y humedad.

http://relojcalendariotemyhum.blogspot.com/

Pgina 10

30
32

CONN-H2

DS1307

SCL
SDA

SCL
SDA

X1

C2

0.1u

0.1u

R4

1k

CRYSTAL

SOUT
2

VBAT X2
DS1307

1 - 74LS47N
7
1
2
6
4
5
3

BCD_1_A
BCD_1_B
BCD_1_C
BCD_1_D

Bloque del Sensor de Humedad

A
B
C
D
BI/RBO
RBI
LT

QA
QB
QC
QD
QE
QF
QG

13
12
11
10
9
15
14

R27
R28
R29
R30
R31
R32
R33

13
12
11
10
9
15
14

R34
R35
R36
R37
R38
R39
R40

A_1
B_1
C_1
D_1
E_1
F_1
G_1

330
330
330
330
330
330
330

7447

HH10D

2 - 74LS47N

HH10D

R25

7
1
2
6
4
5
3

BCD_2_A
BCD_2_B
BCD_2_C
BCD_2_D

R24
560

R23

10uF

330

120

C1

C9

47uF

32.768KHZ

3 VOLTS

C8

R42

1
1

6
5

DISPLAY_2_MES
DISPLAY_1_DIA
INCREMENTO
DECREMENTO
DISPLAY_2_DIA
DISPLAY_1_TEMPERATURA
DISPLAY_2_TEMPERATURA
DISPLAY_1_HUMEDAD

DISPLAY_2_HORA

LED-RED

R1
AVCC
AREF

D1

R3

4.7k

NTC-TT103

1
2

TERMISTOR

ATMEGA32

14
15
16
17
18
19
20
21

4.7k

Refe_comparador

560

A
B
C
D
BI/RBO
RBI
LT

QA
QB
QC
QD
QE
QF
QG

A_2
B_2
C_2
D_2
E_2
F_2
G_2

330
330
330
330
330
330
330

DISPLAY_2_DIA

PB0/XCK/T0
PB1/T1
PB2/INT2/AIN0
PB3/OC0/AIN1
PB4/SS
PB5/MOSI
PB6/MISO
PB7/SCK

PD0/RXD
PD1/TXD
PD2/INT0
PD3/INT1
PD4/OC1B
PD5/OC1A
PD6/ICP
PD7/OC2

R2

CONN-H2

DISPLAY_2_HUMEDAD
MENU
HH10D
Refe_comparador
BCD_2_A
BCD_2_B
BCD_2_C
BCD_2_D

1
2
3
4
5
6
7
8

PA0/ADC0
PA1/ADC1
PA2/ADC2
PA3/ADC3
PA4/ADC4
PA5/ADC5
PA6/ADC6
PA7/ADC7

SCL-RTC
CONN-H2 SDA-RTC

40
39
38
37
36
35
34
33

SCL
SDA
DISPLAY_2_MIN
DISPLAY_1_HORA
DISPLAY_2_HORA
DISPLAY_1_AO
DISPLAY_2_AO
DISPLAY_1_MES

BCD_1_A
BCD_1_B
BCD_1_C
BCD_1_D
DISPLAY_1_SEG
DISPLAY_2_SEG
DISPLAY_1_MIN
TERMISTOR

XTAL1
XTAL2

22
23
24
25
26
27
28
29

1
2

13
12

PC0/SCL
PC1/SDA
PC2/TCK
PC3/TMS
PC4/TDO
PC5/TDI
PC6/TOSC1
PC7/TOSC2

1
2

RESET

ATMEGA32A
9

Reset

R10

7447

1k

10k

SCL-HH10D
CONN-H2 SDA-HH10D

LM317T
LM317T

CONN-H2
2

VO

R26
220

C3
100uF

3Vcc
1
2

ADJ

VI

SCL
SDA

C4

10k

HH10D
3Vcc

10nF

HH10D

1
2

RV1

5
4
3
2
1

MENU

R41

TIME_1
TIME_2
TIME_3
TIME_4
TIME_5
TIME_6

A_1
B_1
C_1
D_1
E_1
F_1
G_1

TEMP_1
TEMP_2

A_1
B_1
C_1
D_1
E_1
F_1
G_1

CONN-H5

INCRE

DECRE
2

10k

MENU

INCREMENTO

DECR

Reset

RESET

C5

R20

C6

10k

R21

C7

10k
10nF

R22
10k

10nF

DATA_1
DATA_2
DATA_3
DATA_4
DATA_5
DATA_6

A_2
B_2
C_2
D_2
E_2
F_2
G_2

HUME_1
HUME_2

A_2
B_2
C_2
D_2
E_2
F_2
G_2

10nF

RTC

BYRON
GANAZHAPA
SERVOMOTOR
_COMUNICACION

Nota: no existe una librera 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 razn de utilizar componentes disponibles a mi alcance, si prefieres
puedes usar un Lm1117 y modificar el esquema para obtener 3.3V.

http://relojcalendariotemyhum.blogspot.com/

Pgina 11

DISEO DE PCB
DISEO

DE LA TARJETA DE CONTROL PARA SU ELABORACIN EN

PLACA DOBLE

Placa superior de la PCB.

Placa inferior de la PCB.

http://relojcalendariotemyhum.blogspot.com/

Pgina 12

PCB

DE

DISEO DE LA TARJETA DE DISPLAY Y VISUALIZACIN EN PCB.

Placa superior de la PCB.

http://relojcalendariotemyhum.blogspot.com/

Pgina 13

Placa inferior de la PCB.

DISEO EN 3D DE LAS PLACAS PCB


Se fabricarn 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 diseo en PCB.

http://relojcalendariotemyhum.blogspot.com/

Pgina 14

C ODIGO
El programa fue desarrollado en CodevisionAVR versin 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 :
Version :
Date
:
Author :
Company :
Comments:

Reloj, Temperatura y Humedad


1.0
30/09/2014
Byron Ganazhapa
UTPL

Chip type
:
Program type
:
AVR Core Clock frequency:
Memory model
:
External RAM size
:
Data Stack size
:

ATmega32A
Application
8,000000 MHz
Small
0
512

http://relojcalendariotemyhum.blogspot.com/

Pgina 15

*****************************************************/
#include
#include
#include
#include
#include
#include

<mega32a.h>
<math.h>
<stdio.h>
<stdlib.h>
<delay.h>
<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
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

DISPLAY_1_SEG
DISPLAY_2_SEG
DISPLAY_1_MIN
DISPLAY_2_MIN
DISPLAY_1_HORA
DISPLAY_2_HORA
DISPLAY_1_DIA
DISPLAY_2_DIA
DISPLAY_1_MES
DISPLAY_2_MES
DISPLAY_1_ANYO
DISPLAY_2_ANYO

0x01
0x01
0x01
0x01
0x01
0x01
0x01
0x01
0x01
0x01
0x01
0x01

#define
#define
#define
#define

DISPLAY_1_TEMPERATURA
DISPLAY_2_TEMPERATURA
DISPLAY_1_HUMEDAD
DISPLAY_2_HUMEDAD

0x01
0x01
0x01
0x01

int Menu=0;
int dig_1_temp, dig_2_temp;
int dig_1_hum, dig_2_hum;
// variables
unsigned int
float
float
float
int

para sensor de humedad


count
= 0;
temp;
frecuencia;
H
= 0.0;
Humedad;

http://relojcalendariotemyhum.blogspot.com/

Pgina 16

// variables para sensor


float Vin
= 5.0;
tension
float Raux
= 10000;
divisor de tension
float R0
= 10000;
termistor (NTC) a 25C
float T0
= 298.15;
float Vout
= 0.0;
float Rout
= 0.0;
float beta
= 4050.0;
float TempK = 0.0;
int
TempC = 0;
float Rinf;
long iCont = 0;
media
float cTemp1;
leidas

de tempoeratura
// [V]
Voltage de entrada en el divisor de
// [ohm]
// [ohm]
//
//
//
//
//
//
//
//

Valor de la resistencia secundaria del


Valor de resistencia nominal del

[K] (25C)
[V]
Voltage given by the Voltage-Divider
[ohm]
Resistencia actual del Termistor (NTC)
[K]
Parametro Beta
[K]
Temperatura de salida en grados Kelvin
[C]
Temperatura de salida en grados Celsius
[ohm]
Parametros Rinf
Contador de ciclos, par el calculo de la temperatura

// Variable temporal para acumular las temperaturas

// 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
#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 ao
anyo = anyo + 1;
delay_ms(100);
if(anyo>99) anyo = 0;
}
if(Menu == 4){ // igualar mes
mes = mes + 1;
delay_ms(100);

http://relojcalendariotemyhum.blogspot.com/

Pgina 17

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 ao
anyo = anyo - 1;
delay_ms(100);
if((signed char)anyo<0) anyo = 99;
}
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 calibracin = 1.02354. Clculo
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)
{

http://relojcalendariotemyhum.blogspot.com/

Pgina 18

count = count+1; // Clculo 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;
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

http://relojcalendariotemyhum.blogspot.com/

Pgina 19

// 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
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
minu
seg
dia
mes
anyo

=
=
=
=
=
=

get_hora;
get_minu;
get_seg;
get_dia;
get_mes;
get_anyo;

rtc_set_time(hora,minu,seg);
rtc_set_date(dia,mes,anyo);
// Global enable interrupts
#asm("sei")
while (1){
/*
Menu = 0;
Menu = 1;
Menu = 2;
Menu = 3;
Menu = 4;
Menu = 5;

modo
modo
modo
modo
modo
modo

normal
de igualar
de igualar
de igualar
de igualar
de igualar

minutos
horas
Aos
meses
das

http://relojcalendariotemyhum.blogspot.com/

Pgina 20

Menu = 6; modo de guardar en memoria tiempo y fecha actualizada


*/

if (PINB.1 == 1){
// Botn 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
// Clculo del valor de la resistencia termistor (NTC) actual (a
travs de Vout)
Vout = Vin*(adc_data)/1023.0;
Rout = (Raux*Vout/(Vin-Vout));
// Calculo de la temperatura en grados Kelvin
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;

http://relojcalendariotemyhum.blogspot.com/

Pgina 21

dia_BCD = bin2bcd(dia);
(dia_BCD&0x0F)<<4;
mes_BCD = bin2bcd(mes);
(mes_BCD&0x0F)<<4;
anyo_BCD = bin2bcd(anyo);
(anyo_BCD&0x0F)<<4;
Humedad = bin2bcd(H);
(Humedad&0x0F)<<4;

dig_2_dia

= dia_BCD&0xF0;

dig_1_dia

dig_2_mes

= mes_BCD&0xF0;

dig_1_mes

dig_2_anyo = anyo_BCD&0xF0;

dig_1_anyo =

dig_2_hum

dig_1_hum

= Humedad&0xF0;

// Realizo la miltiplexacin 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;
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;

http://relojcalendariotemyhum.blogspot.com/

Pgina 22

PORTB
= dig_2_hum;
PORTD.6 = DISPLAY_2_TEMPERATURA;
PORTB.0 = DISPLAY_2_HUMEDAD;
delay_ms(1);
}

I MGENES

DEL PROYECTO CONCLUIDO

http://relojcalendariotemyhum.blogspot.com/

Pgina 23

http://relojcalendariotemyhum.blogspot.com/

Pgina 24

http://relojcalendariotemyhum.blogspot.com/

Pgina 25

http://relojcalendariotemyhum.blogspot.com/

Pgina 26

http://relojcalendariotemyhum.blogspot.com/

Pgina 27

http://relojcalendariotemyhum.blogspot.com/

Pgina 28

RELOJ TEMPERATURA Y HUMEDAD


RTC-DS1307

Time
Hora
Dia

Minu.
Mes

Seg.
Ao

H[%]

Date
Byron O.
Ganazhapa J.

Men

http://relojcalendariotemyhum.blogspot.com/

ON

Pgina 29

http://relojcalendariotemyhum.blogspot.com/

Pgina 30

http://relojcalendariotemyhum.blogspot.com/

Pgina 31

Si deseas descargar el proyecto completa visita el siguiente blog:


http://relojcalendariotemyhum.blogspot.com/

http://relojcalendariotemyhum.blogspot.com/

Pgina 32

S-ar putea să vă placă și