Bueno pues hace poco hice un termómetro digital y lo postee en otro foro (aunque es de modding, hay mucho relacionado con la electronica), y me gustaria hacerlo aquí tb, puesto que este me tiene enamorado
El realidad el proyecto es motivo por la reciente adquisicion de mi hermana de un acuario con peces de agua fria y como el tipico termómetro de mercurio no me llama la atencion me puesto manos a la obra con uno digital que usara un PIC16F84A con un lm35, con el que podremos visualizar la temperatura por medio de 2 display de 7 segmentos.
Es economico, divertido y facil de hacer ... aqui dejo el esquema:
<a href="
http://img277.echo.cx/my.php?image=termometro2et.jpg" target="_blank"><img src="
http://img277.echo.cx/img277/9494/termometro2et.th.jpg" border="0" alt="Free Image Hosting at
www.ImageShack.us" />[/url]
Lleba 2 sondas, una que marcara para el exterior (el aire) y otra el interior (para el agua), quien lo quiera usar para otros fines puede añadir mas sonas puesto que quedan patillas del puerto A (el del conversor A/D) libres. Decir tb que tiene la precision de 1 grado (Vref+ = 2.5V, para valores entre 0 y 255).
El sensor, cada uno lo hará como pueda, yo he metido el LM35 en un tubito relleno de aceite de oliva (que transmite muy bien el calor) y lo he sellado con la pistola de pegamento termica. Los que lo useis para el PC nos hace falta (a no ser que lo querais dentro del deposito de la RL jeje, que esta buena la idea).
<a href="
http://img276.echo.cx/my.php?image=sensor1ov.jpg" target="_blank"><img src="
http://img276.echo.cx/img276/8766/sensor1ov.th.jpg" border="0" alt="Free Image Hosting at
www.ImageShack.us" />[/url]
Que más ... weno llebara 2 pulsadores (aparte del de reset) que será para conmutar las temperaturas de los sensores y otro para encender y apagar el zumbador (que pitara cuando las temp este fuera del rango que yo adjudique -pa los peces de 22 a 27º C supongo-, ademas de la señalización luminosa con 2 leds).
Ahh ... por cierto, hay lm35 mas pequeño en encapsulado del tipico transistor solo que en la tienda donde los compro solo hay este, asi que ... consultar el datasheet que según el encapsulado tb varia el patillaje de Vs, GND y Vout.
Si usais el sprint-layout he hecho el fotolito en
http://usuarios.lycos.es/r4don/termometro.LAYSi no, podeis haceros el mismo partiendo del esquema del 1er post
Bueno tal como prometi, hoy he acabado la pcb del termometro digital y ha quedado algo así:
La pcb por la cara de las pistas:
La pcb por delante sin pinchar algunos componentes en los zócalos:
Y la pcb completa:
Como se puede obserbar (más arriba hay un post donde indique la causa de meter la sonda en un "recipiente" con aceite (es para el acuario), los que la dispongais en el PC no hace falta (es más, seria una gilipollez), el encapsulado del lm35 que escojido viene de fabula por ejemplo para aquellos que querais medir la temp del HD (y con el otro lm35 mediria la temp ambiente en la caja), o incluso tal como lo tengo para el deposito de una RL.
(queda claro ke estaria bien atornillarlo al HD).
Me pienso hacer otro para el PC, jeje espero que os guste, ahora queda el soft
Weno, terminado el soft, queda hacerle un poco de modding al acuario, y con dremel en mano practicamos unos abujeritos por aquí y otros por allí ... y queda algo como esto:
Espero que os guste, y me deis vuestra opinión
Bueno en la pagina uno teneis el esquema y fotolito para el Sprint Layout, os dejo el codigo que podeis modificar a vuestro antojo (por ejemplo a no ser que tengais un acuario de agua fria y querais mantenerlo dentro de 15-30º
lo cambiareis
Siento el codigo un poco engorroso, en realidad es sencillo, pero como ido probando pa hacer varias cosas hasta que lo deje así al final parece un poco feo jeje. Lo que hace es conmutar los 2 canales, y en caso que este el canal de la sonda del agua (la de la foto de la pagina uno), si no esta dentro del intervalo indicado se ilumina parpadeando un led, y en caso de que lo quieras con el otro pulsador se conmuta el zumbador que "parpadea" a ritmo del led. Todo se indica en el display, los canales y el estado del zumbador mas o menos como postee arriba.
Codigo:
//***********************************************
//* Termometro digital
//* Por Daniel G - by RaDoN (30/4/05)
//* *********************************************
//* - Conección Display C.C.:
//* * RC0 -> Led (punto), RC1 -> G ... RC7 -> A
//* - Multiplexado displays 7 seg:
//* * RB4 -> 1er Dígito, RB3 -> 2o Dígito
//* RB0 -> Led Inidicador, RB5 -> Zumbador
//* RB7 -> 1er pulsador, RB6 -> 2o pulsador
//* - Entradas analogicas RA0 & RA1
//***********************************************
#include "16F876.h"
#fuses NOLVP,XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#byte port_a = 5
#byte port_b = 6
#byte port_c = 7
int i, zumbador=1, canal=0, flag_estado=1;
const int estado[4] = {0x1C,0xFC,0x6E,0x60};
#int_RB
void control_rb(void) {
const int c = 0x1A;
const int canales[2] = {0x60, 0xDA};
output_bit(PIN_B0,0);
output_bit(PIN_B5,0);
if(input(PIN_B7) == 0) {
if(canal == 0) {canal = 1;}
else {canal = 0;}
for(i=1;i<=100;++i) {
port_c = c;
output_bit(PIN_B4,1);
delay_ms(10);
output_bit(PIN_B4,0);
port_c = canales[canal];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0); }
set_adc_channel(canal);
delay_us(30);} // Tiempo de adquisición
if(input(PIN_B6) == 0) {
if(flag_estado == 0) {
flag_estado = 1;
for(i=1;i<=100;++i) {
port_c = estado[2];
output_bit(PIN_B4,1);
delay_ms(10);
output_bit(PIN_B4,0);
port_c = estado[3];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0); }
set_adc_channel(canal);
delay_us(30);}
else {
flag_estado = 0;
for(i=1;i<=100;++i) {
port_c = estado[0];
output_bit(PIN_B4,1);
delay_ms(10);
output_bit(PIN_B4,0);
port_c = estado[1];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0); }
set_adc_channel(canal);
delay_us(30);} }
}
void main(void) {
int sw=1, temperatura, unidades, decenas;
const int digitos[10]={0xFD,0x61,0xDB,0xF3,0x67,0xB7,0xBF,0xE1,0xFF,0xF7};
set_tris_a(0x0B); // RA0,RA1 y RA3 como entradas
port_b_pullups(TRUE); // Resistencias de polarización del puerto B
set_tris_b(0xC0); // RB7,RB6,RB2 & RB1 como entradas, RB3:5 & RB0 salidas
set_tris_c(0x00); // Puerto C entero como salida
setup_adc_ports(AN0_AN1_VSS_VREF); // RA0 y RA1 entradas analógicas
// RA3 referencia voltaje de entrada (2.5V)
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(30); // Tiempo de adquisición
while(1) {
temperatura = read_adc();
decenas = (int)temperatura/10;
unidades = (int)temperatura-(decenas*10);
if(canal == 0) {
if(temperatura < 15) {
if(sw == 1) { sw = 0;}
else { sw = 1;}
if(flag_estado == 1 && sw == 1) {
output_bit(PIN_B5,1);}
if(sw ==1) { output_bit(PIN_B0,1);}
for(i=1;i<=15;++i) {
if(decenas != 0) {
port_c = digitos[decenas];
output_bit(PIN_B4,1);
delay_ms(10);}
else {delay_ms(10);}
output_bit(PIN_B4,0);
port_c = digitos[unidades];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0);}
output_bit(PIN_B0,0);
output_bit(PIN_B5,0);}
if(temperatura >= 15 & temperatura <= 30) {
for(i=1;i<=15;++i) {
if(decenas != 0) {
port_c = digitos[decenas];
output_bit(PIN_B4,1);
delay_ms(10);}
output_bit(PIN_B4,0);
port_c = digitos[unidades];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0); }}
if(temperatura > 30) {
if(sw == 1) { sw = 0;}
else { sw = 1;}
if(flag_estado == 1 && sw == 1) {
output_bit(PIN_B5,1);}
if(sw ==1) { output_bit(PIN_B0,1);}
for(i=1;i<=15;++i) {
if(decenas != 0) {
port_c = digitos[decenas];
output_bit(PIN_B4,1);
delay_ms(10);}
else {delay_ms(10);}
output_bit(PIN_B4,0);
port_c = digitos[unidades];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0);}
output_bit(PIN_B0,0);
output_bit(PIN_B5,0);}
} // fin: if(canal == 0);
if(canal == 1) {
for(i=1;i<=15;++i) {
if(decenas != 0) {
port_c = digitos[decenas];
output_bit(PIN_B4,1);
delay_ms(10);}
output_bit(PIN_B4,0);
port_c = digitos[unidades];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0); }}
}} // fin while