31
http://relojcalendariotemyhum.blogspot.com/ 5-2-2015 Por: Byron Ganazhapa CODEVISIONAVR RELOJ, CALENDARIO, TEMPERATURA Y HUMEDAD

Reloj calendario con temperatura y humedad

Embed Size (px)

Citation preview

Page 1: Reloj calendario con temperatura y humedad

http://relojcalendariotemyhum.blogspot.com/ Página 0

http://relojcalendariotemyhum.blogspot.com/

5-2-2015

Por: Byron Ganazhapa

CODEVISIONAVR

RELOJ, CALENDARIO,

TEMPERATURA

Y HUMEDAD

Page 2: Reloj calendario con 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

Page 3: Reloj calendario con temperatura y humedad

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.

Page 4: Reloj calendario con temperatura y humedad

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

Page 5: Reloj calendario con temperatura y humedad

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

Page 6: Reloj calendario con temperatura y humedad

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

Page 7: Reloj calendario con temperatura y humedad

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

Page 8: Reloj calendario con temperatura y humedad

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.

Page 9: Reloj calendario con temperatura y humedad

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:

Page 10: Reloj calendario con temperatura y humedad

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.

Page 11: Reloj calendario con temperatura y humedad

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.

Page 12: Reloj calendario con temperatura y humedad

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

Page 13: Reloj calendario con temperatura y 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.

Page 14: Reloj calendario con temperatura y humedad

http://relojcalendariotemyhum.blogspot.com/ Página 2

DISEÑO DE LA TARJETA DE DISPLAY Y VISUALIZACIÓN EN PCB.

Placa superior de la PCB.

Page 15: Reloj calendario con temperatura y humedad

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.

Page 16: Reloj calendario con temperatura y humedad

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

Page 17: Reloj calendario con temperatura y humedad

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

Page 18: Reloj calendario con temperatura y humedad

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;

}

Page 19: Reloj calendario con temperatura y humedad

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;

Page 20: Reloj calendario con temperatura y humedad

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

Page 21: Reloj calendario con temperatura y humedad

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

Page 22: Reloj calendario con temperatura y humedad

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;

Page 23: Reloj calendario con temperatura y humedad

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

Page 24: Reloj calendario con temperatura y humedad

http://relojcalendariotemyhum.blogspot.com/ Página 12

Page 25: Reloj calendario con temperatura y humedad

http://relojcalendariotemyhum.blogspot.com/ Página 13

Page 26: Reloj calendario con temperatura y humedad

http://relojcalendariotemyhum.blogspot.com/ Página 14

Page 27: Reloj calendario con temperatura y humedad

http://relojcalendariotemyhum.blogspot.com/ Página 15

Page 28: Reloj calendario con temperatura y humedad

http://relojcalendariotemyhum.blogspot.com/ Página 16

Page 29: Reloj calendario con temperatura y humedad

http://relojcalendariotemyhum.blogspot.com/ Página 17

Page 30: Reloj calendario con temperatura y humedad

http://relojcalendariotemyhum.blogspot.com/ Página 18

Page 31: Reloj calendario con temperatura y humedad

http://relojcalendariotemyhum.blogspot.com/ Página 19

Si deseas descargar el proyecto completa visita el siguiente blog: http://relojcalendariotemyhum.blogspot.com/