Sensor de Temperatura Exterior

Hola, estoy diseñando un circuito con el que debo medir la temperatura ambiente de el exterior (temperatura de una ciudad), pero no tengo idea de que sensor deba usar, el único que conozco es la sonda PT100 y no se si sea la mas adecuada. Supongo que se debe usar un sensor que soporte cualquier tipo de clima y/o polución.

Espero que me puedan asesorar, muchas gracias
 
Hola:

Hay muchos sensores de temperatura, de los cuales es muy conocido tres.

El DS1624, es el más caro de todo, pero muy usado y su formato suele ser DIP de 8 pines como un NE555 o un PIC16F509 por poner ejemplos.

ASM:
Código:
;**************************** Librería "DS1624.INC" *************************************
;
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
;
; Estas subrutinas permiten realizar las tareas de manejo del sensor de temperatura 
; DS1624. Este sensor transmite la información vía serie a través de un bus I2C.
;
; ZONA DE DATOS **********************************************************************

    CBLOCK
    DS1624_Temperatura                    ; Parte entera de la temperatura medida.
    DS1624_Decimal                        ; Parte decimal de la temperatura medida.
    DS1624_Signo                        ; Signo de la temperatura medida.
    ENDC

DS1624_DIR_ESCRITURA    EQU    b'10010000'
DS1624_DIR_LECTURA        EQU    b'10010001'

COMANDO_ReadTemperature    EQU    0AAh    ; Comandos del DS1624.
COMANDO_StartConvert_T    EQU    0EEh
COMANDO_AccessConfig    EQU    0ACh

; Subrutina "DS1624_RedondeaDecimal" ----------------------------------------------------
;
; Esta subrutina redondea el valor del contenido del registro de trabajo W al valor más cercano
; con un decimal indicado en una tabla.
;
DS1624_RedondeoDecimal
    addwf    PCL,F    
    retlw    d'0'    ; (DS1624_Decimal)=b'0000'. Mide 0,0000ºC. Redondeado a 0,0ºC.
    retlw    d'1'    ; (DS1624_Decimal)=b'0001'. Mide 0,0625ºC. Redondeado a 0,1ºC.
    retlw    d'1'    ; (DS1624_Decimal)=b'0010'. Mide 0,1250ºC. Redondeado a 0,1ºC.
    retlw    d'2'    ; (DS1624_Decimal)=b'0011'. Mide 0,1875ºC. Redondeado a 0,2ºC.
    retlw    d'3'    ; (DS1624_Decimal)=b'0100'. Mide 0,2500ºC. Redondeado a 0,3ºC.
    retlw    d'3'    ; (DS1624_Decimal)=b'0101'. Mide 0,3125ºC. Redondeado a 0,3ºC.    
    retlw    d'4'    ; (DS1624_Decimal)=b'0110'. Mide 0,3750ºC. Redondeado a 0,4ºC.
    retlw    d'4'    ; (DS1624_Decimal)=b'0111'. Mide 0,4375ºC. Redondeado a 0,4ºC.
    retlw    d'5'    ; (DS1624_Decimal)=b'1000'. Mide 0,5000ºC. Redondeado a 0,5ºC.
    retlw    d'6'    ; (DS1624_Decimal)=b'1001'. Mide 0,5625ºC. Redondeado a 0,6ºC.
    retlw    d'6'    ; (DS1624_Decimal)=b'1010'. Mide 0,6250ºC. Redondeado a 0,6ºC.
    retlw    d'7'    ; (DS1624_Decimal)=b'1011'. Mide 0,6875ºC. Redondeado a 0,7ºC.    
    retlw    d'8'    ; (DS1624_Decimal)=b'1100'. Mide 0,7500ºC. Redondeado a 0,8ºC.
    retlw    d'8'    ; (DS1624_Decimal)=b'1101'. Mide 0,8125ºC. Redondeado a 0,8ºC.
    retlw    d'9'    ; (DS1624_Decimal)=b'1110'. Mide 0,8750ºC. Redondeado a 0,9ºC.
    retlw    d'9'    ; (DS1624_Decimal)=b'1111'. Mide 0,9375ºC. Redondeado a 0,9ºC.
DS1624_FinTablaRedondeo

    IF (DS1624_FinTablaRedondeo > 0xFF)
        ERROR    "¡CUIDADO!: La tabla ha superado el tamaño de la página de los"
        MESSG    "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
    ENDIF

; Subrutina "DS1624_Inicializa" ---------------------------------------------------------
;
; Configura el DS1624 para que trabaje en modo One-Shot.

DS1624_Inicializa
    call    I2C_EnviaStart
    movlw    DS1624_DIR_ESCRITURA        ; Apunta al dispositivo.
    call    I2C_EnviaByte
    movlw    COMANDO_AccessConfig        ; Comando indicando que el próximo byte es la
    call    I2C_EnviaByte                ; palabra de control.
    movlw    b'01001011'                    ; Carga la palabra de control para modo One-Shot.
    call    I2C_EnviaByte
    call    I2C_EnviaStop
;    call    DS1624_IniciaConversion        ; Inicia la conversión de temperatura.
;    return

; Subrutina "DS1624_IniciaConversion" ---------------------------------------------------------
;
; Inicializa el DS1624 para que comience la conversión de temperatura.
;
DS1624_IniciaConversion
    call    I2C_EnviaStart                ; Configura el DS1624.
    movlw    DS1624_DIR_ESCRITURA        ; Apunta al dispositivo.
    call    I2C_EnviaByte
    movlw    COMANDO_StartConvert_T        ; Comando que ordena el comienzo de la conversión 
    call    I2C_EnviaByte                ; de la temperatura.
    call    I2C_EnviaStop
    return

; Subrutina "DS1624_LeeTemperatura" -----------------------------------------------------
;
; El DS1624 lee la temperatura en un formato ejemplificado como sigue:
;
; +125.0000 ºC    01111101 00000000
; + 25.0625 ºC    00011001 00010000
; +  0.5000 ºC    00000000 10000000
; +  0.0000 ºC    00000000 00000000
; -  0.5000 ºC    11111111 10000000
; - 25.0625 ºC    11100110 11110000
; - 55.0000 ºC    11001001 00000000
;
; Se observa que:
;    -    El formato es de dos bytes. El primer byte es la parte entera y el segundo la 
;        parte decimal.
;    -    Las temperaturas vienen dadas en complemento a 2.
;    -    Las temperaturas positivas comienzan con el bit MSB a cero: b'0xxxxxxx xxxxxxxx'.
;    -    Las temperaturas negativas comienzan con e1 bit MSB a uno:  b'1xxxxxxx xxxxxxxx'.
;
; Esta subrutina lee la temperatura, proporcionando tres datos: 
; Salida:    - En (DS1624_Temperatura) la parte entera del valor de la temperatura medida.
;            - En (DS1624_Decimal) la parte decimal del valor de la temperatura.
;            - En (DS1624_Signo)=b'11111111' si la temperatura es negativa y 
;                (DS1624_Signo)=b'00000000' si es positiva.
;
DS1624_LeeTemperatura
    bcf        I2C_UltimoByteLeer
    call    I2C_EnviaStart
    movlw    DS1624_DIR_ESCRITURA        ; Apunta al dispositivo.
    call    I2C_EnviaByte
    movlw    COMANDO_ReadTemperature        ; Comando de lectura de la temperatura.
    call    I2C_EnviaByte
    call    I2C_EnviaStart                ; Comienza a leer.
    movlw    DS1624_DIR_LECTURA            ; Apunta al dispositivo.
    call    I2C_EnviaByte
    call    I2C_LeeByte                    ; Lee el primer byte
    movwf    DS1624_Temperatura            ; y lo guarda.
    bsf        I2C_UltimoByteLeer            ; El próximo es el último byte a leer.
    call    I2C_LeeByte                    ; Lee el segundo byte
    movwf    DS1624_Decimal                ; y lo guarda.
    call    I2C_EnviaStop
;
; Ahora deduce si la temperatura es positiva o negativa y halla su valor absoluto.
;
    clrf    DS1624_Signo                ; Supone que la temperatura es positiva.
    btfss    DS1624_Temperatura,7        ; Si el bit MSB es "1", la temperatura es negativa.
    goto    DS1624_FinLeeTemperatura    ; La temperatura es positiva y salta.
DS1624_TemperaturaNegativa
    comf    DS1624_Signo,F                ; Indica que la temperatura es negativa.
    comf    DS1624_Decimal,F            ; Para hallar el valor absoluto de la
    comf    DS1624_Temperatura,F        ; temperatura invierte los dos registros y le
    movlw    .1                            ; suma una unidad.
    addwf    DS1624_Decimal,F
    btfsc    STATUS,C                    ; Si hay acarreo tiene que llevarlo al byte superior.
    incf    DS1624_Temperatura,F        ; Le suma 1.
DS1624_FinLeeTemperatura        
    swapf    DS1624_Decimal,W            ; Para las temperaturas es suficiente trabajar
    andlw    b'00001111'                    ; con un solo digito decimal, por lo que
    call    DS1624_RedondeoDecimal        ; primero se queda con los 4 bits menos 
    movwf    DS1624_Decimal                ; significativo y pasa a redondear su valor.
    movf    DS1624_Temperatura,W        ; En (W) la parte entera del valor absoluto de la
    return                                ; temperatura.
    
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================

El LM35, es el analógico, funciona con un pin en una entrada analógica de un PIc, aquí hay ejemplos en ASM y C.

ASM para el LM35
Código:
;El módulo convertidor ADC. Termómetro digital
;
;Este ejemplo visualiza sobre la pantalla LCD la temperatura ambiente captada por el sensor LM35DZ
;conectado con la entrada RA0/AN0 y cuya precisión es de 10mV/ºC. La resolución del convertidor
;ADC, con una tensión de referencia de 5V, es de 0.00488. En estas condiciones cada ºC supone 
;dos incrementos en la salida del convertidor (0.00976V=10mV) aproximadamente. Es por ello que
;al resultado de la conversión se le divide entre 2.
;
;Se emplea el Timer 1 que provoca una interrupción cada 0.1 seg. Cuando se produzcan n interrupciones
;se procede a tomar una muestra de la tempreatura. En este ejemplo se toman cada 1 segundo.

        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

Tiempo            equ    .10                ;Nº de interrupciones de 0.1 seg. para tomar una muestra (p.e. 1 segundo)

            cblock    0x20            ;Inicio de variables de la aplicación
                Byte_L                ;Parte baja del byte a convertir
                Byte_H                ;Parte alta del byte a convertir
                BCD_2                ;Byte 2 de conversión a BCD
                BCD_1                ;Byte 1 de conversión a BCD
                BCD_0                ;Byte 0 de conversión a BCD
                Contador            ;Variable de contaje
                Int_Cont            ;Contador de interrupciones
                Temporal            
                Temporal_1
                Temporal_2            ;Variables temporales
            endc        

Lcd_var            equ    0x70            ;Variables de las rutinas LCD
    
                org    0x00
                goto    Inicio        ;Vector de reset
                org    0x04
                goto    Inter        ;Vector de interrupción
                org    0x05

;******************************************************************************************
;Según el valor contenido en el registro W, se devuelve el carácter a visualizar

Tabla_Mensajes    movwf    PCL        ;Calcula el desplazamiento sobre la tabla

;***********************************************************************************
;La directiva DT genera tantas intsrucciones RETLW como bytes o caracteres contenga

Mens_0            equ    $        ;Mens_0 apunta al primer carácter del mensaje 0
                dt    "  Temp.=    ",0xdf,"C",0x00

        include    "LCD4bitsPIC16.inc"        ;Incluye rutinas de manejo del LCD

;*************************************************************************************
;Mensaje: Esta rutina envía a la pantalla LCD el mensaje cuyo inicio está  indicado en
;el acumulador. El fin de un mensaje se determina mediante el código 0x00

Mensaje            movwf      Temporal_1         ;Salva posición de la tabla
Mensaje_1          movf       Temporal_1,W       ;Recupera posición de la tabla
                   call       Tabla_Mensajes     ;Busca caracter de salida
                   movwf      Temporal_2         ;Guarda el caracter
                movf       Temporal_2,F
                btfss      STATUS,Z           ;Mira si es el último
                goto       Mensaje_2
                return
Mensaje_2       call    LCD_DATO           ;Visualiza en el LCD
                incf    Temporal_1,F       ;Siguiente caracter
                goto    Mensaje_1

;****************************************************************************************************
;Visualizar: Visualiza sobre la pantalla LCD, en la posición actual del cursor, los dos 
;dígitos situados en la variable BCD_2
Visualizar        swapf    BCD_2,W
                andlw    0x0f
                iorlw    0x30            ;Convierte a ASCII el nible de más peso
                call    LCD_DATO        ;Lo visualiza
                movf    BCD_2,W
                andlw    0x0f
                iorlw    0x30            ;Convierte a ASCII el nible de menos peso
                call    LCD_DATO        ;Lo visualiza
                return

;***************************************************************************************************
;16Bits_BCD: Esta rutina convierte un número binario de 16 bits situado en Cont_H y
;Cont_L y, lo convierte en 5 dígitos BCD que se depositan en las variables BCD_0, BCD_1
;y BCD_2, siendo esta última la de menos peso.
;Está presentada en la nota de aplicación AN544 de MICROCHIP y adaptada por MSE
Bits16_BCD        bcf        STATUS,C
                clrf    Contador    
                bsf        Contador,4        ;Carga el contador con 16        
                clrf    BCD_0
                clrf    BCD_1
                clrf    BCD_2            ;Puesta a 0 inicial

Loop_16            rlf        Byte_L,F
                rlf        Byte_H,F
                rlf        BCD_2,F
                rlf        BCD_1,F
                rlf        BCD_0,F            ;Desplaza a izda. (multiplica por 2)
                decfsz    Contador,F
                goto    Ajuste
                return

Ajuste            movlw    BCD_2
                movwf    FSR                ;Inicia el índice
                call    Ajuste_BCD        ;Ajusta el primer byte
                incf    FSR,F
                call    Ajuste_BCD        ;Ajusta el segundo byte
                incf    FSR,F
                call    Ajuste_BCD
                goto    Loop_16

Ajuste_BCD        movf    INDF,W        
                addlw    0x03
                movwf    Temporal    
                btfsc    Temporal,3        ;Mayor de 7 el nibble de menos peso ??
                movwf    INDF            ;Si, lo acumula
                movf    INDF,W        
                addlw    0x30
                movwf    Temporal
                btfsc    Temporal,7        ;Mayor de 7 el nibble de menos peso ??
                movwf    INDF            ;Si, lo acumula
                return

;***************************************************************************************
;Inter:    Tratamiento de la interrupción que provoca el Timer 1 cada 0.1 seg. Espera a que 
;se produzcan tantas interrupciones como se indique en "Tiempo" para conseguir una temporización
;total determinada. Inicia una conversión del canal seleccionado, realiza los cálculos
;apropiados y visualiza sobre el LCD
Inter:            decfsz    Int_Cont,F        ;Han pasado n interrupciones ??
                goto    Inter_Fin        ;No, fin de tratamiento
;Inicia la conversión
                bsf        ADCON0,GO_DONE    ;Inicia la conversión ADC
Inter_1            btfss    PIR1,ADIF        ;Fin de conversión ??
                goto    Inter_1            ;No, esperar
                bcf        PIR1,ADIF        ;Si, reponer el flag
;Lee el resultado
                movf    ADRESH,W
                movwf    Byte_H            ;Lee y salva la parte alta de la conversión
                bsf        STATUS,RP0        ;Banco 1
                rrf        ADRESL,W        ;Divide entre 2 la parte baja de la conversión
                bcf        STATUS,RP0        ;Banco 0
                movwf    Byte_L            ;Lee y salva la parte baja/2 de la conversión
;Convierte y visualiza
                call    Bits16_BCD        ;Convierte a BCD
                movlw    0x89
                call    LCD_REG            ;Coloca el cursor
                call    Visualizar        ;Visualiza sobre el LCD
;Fin del tratamiento
                movlw    Tiempo
                movwf    Int_Cont        ;Repone el contador para otras 10 interrupciones (1 seg)
Inter_Fin        movlw    low ~.12500
                movwf    TMR1L            ;Carga la parte de menos peso de 12500 en TMR1L
                movlw    high ~.12500
                movwf    TMR1H            ;Repone el TMR1 con el valor 12500.
                bcf        PIR1,TMR1IF        ;Desconecta el flag del TMR1
                retfie

;*****************************************************************************************
;Programa principal
Inicio               clrf    PORTA
                clrf    PORTB            ;Borra salidas
                bsf        STATUS,RP0
                bsf        STATUS,RP1        ;Banco 3
                movlw    b'00000001'
                movwf    ANSEL            ;RA0/AN0/C12IN0- entrada analógica, resto digitales
                clrf    ANSELH            ;Puerta B digital
                bcf        STATUS,RP1        ;Banco 1
                clrf    TRISB            ;Puerta B se configura como salida
                movlw    b'11110001'
                movwf    TRISA            ;RA3:RA1 salidas
                bcf        STATUS,RP0        ;Selecciona banco 0
                movlw    Tiempo
                movwf    Int_Cont        ;Nº de interrupciones (10) para que transcurra 1 seg.

;Inicio de la pantalla LCD y visualiza mensaje inicial
                call    UP_LCD            ;Configura E/S para el LCD
                call    LCD_INI            ;Secuencia de inicio del LCD
                movlw    b'00001100'
                call    LCD_REG            ;LCD On, cursor y blink Off
                movlw    Mens_0
                call    Mensaje            ;Visualiza "Temp.      ºC"

;Se activa el ADC y se selecciona el canal RA0/AN0.    Frec. de conversión = Fosc/32.         
                bsf        STATUS,RP0        ;Selecciona página 1
                movlw    b'10000000'
                movwf    ADCON1            ;Alineación dcha. Vref= VDD
                bcf        STATUS,RP0        ;Selecciona página 0
                movlw    b'10000001'
                movwf    ADCON0            ;ADC en On, seleciona canal RA0/AN0 y Fosc/32

;El TMR1 trabaja con oscilador interno y un preescaler de 1:8. Si se trabaja a una frecuencia
;de 4 MHz, el TMR1 deberá ser cargado con 12500 para que provoque interrupción al de 0.1s
;(12500 * 8 * 1 =100000uS=0.1")
                bcf        PIR1,TMR1IF        ;Restaura el flag del Timer 1
                bsf        STATUS,RP0        ;Selecciona página 1
                bsf        PIE1,TMR1IE        ;habilita interrupción del TMR1
                bcf        STATUS,RP0        ;Selecciona página 0
                movlw    low ~.12500
                movwf    TMR1L
                movlw    high ~.12500
                movwf    TMR1H            ;Carga el TMR1 con el valor 12500.
                movlw    b'00110001'        ;Selecciona reloj interno y preescaler de 8
                movwf    T1CON            ;Habilita el TMR1
                movlw    b'11000000'
                movwf    INTCON            ;Habilitación global de interrupciones

;Bucle principal
            
Loop            nop
                goto    Loop            ;Repetir la lectura

                end                        ;Fin del programa fuente
C para el LM35:
Código:
/*

El módulo convertidor ADC. Termómetro digital

Este ejemplo visualiza sobre la pantalla LCD la temperatura ambiente captada por el sensor LM35DZ
conectado con la entrada RA0/AN0 y cuya precisión es de 10mV/ºC. La resolución del convertidor
ADC, con una tensión de referencia de 5V, es de 0.00488. En estas condiciones cada ºC supone 
dos incrementos en la salida del convertidor (0.00976V=10mV) aproximadamente. Es por ello que
al resultado de la conversión se le divide entre 2.

Se emplea el Timer 1 que provoca una interrupción cada 0.1 seg. Cunado se produzcan n interrupciones
se procede a tomar una muestra de la tempreatura. En este ejemplo se toman cada 1 segundo. 

En este caso visualizamos en centígrados (ºC) y en Fahrenheit (ºF), donde (ºF = ºC*1.8+32)*/

#include <16f886.h>

/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */

#fuses     NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT    //Palabra 1 de configuración
#fuses    NOWRT,BORV40                                //Palabra 2 de configuración

/* Con estas directivas las funciones "input" y "output_bit" no reprograman
el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */

#device ADC=10                                    //Conversor ADC/ de 10 bits de resolución
#use fast_io (A)
#use fast_io (B)
#use delay(clock=4000000)                        //Frecuencia de trabajo

#include <lcd4bitsPIC16.h>                        //Incluye funciones de manejo del LCD

#define Tiempo    10                                //Nº de interrupciones de 0.1 seg. para tomar una muestra (p.e. 1 segundo)
int Int_Cont;                                    //Contador de interrupciones
int16 Temperatura;                                //Variable con la temperatura medida    
int Centigrados;                                //Variable con la medida en ºC
float Fahrenheit;                                //Variable con la medida en ºFahrenheit

/****************************************************************************************
Tratamiento de la interrupción que provoca el Timer 1 cada 0.1 seg. Espera a que se produzcan
tantas interrupciones como se indique en "Tiempo" para conseguir una temporización total determinada.
Inicia una conversión del canal seleccionado, realiza los cálculos apropiados y visualiza sobre el LCD*/
#int_timer1                
tratamiento()
{    
    Int_Cont--;    
    if(Int_Cont==0)                                //Han pasado n interrupciones
    {
        lcd_gotoxy(10,1);                        //Coloca el cursor        
        Temperatura=read_adc();                    //Inicia la conversión y lee el resultado (temperatura)
        Centigrados=Temperatura/2;                //Calcula los grados centígrados
        Fahrenheit=Centigrados*1.8+32;            //Calcula los grados Fahrenheit
        printf(lcd_putc,"%2u",Centigrados);        //Visualiza en grados centígrados
        lcd_gotoxy(8,2);                        //Coloca el cursor
        printf(lcd_putc,"%3.1f",Fahrenheit);    //Visualiza en grados Fahrenheit
        Int_Cont=Tiempo+1;                        //Repone el contador para otras 10 interrupciones (1 seg)
    }
    set_timer1(~12500);                            //Repone TMR1 con 12500
}
                    
main()
{  
    delay_ms(50);    
    lcd_init();                                    //Inicia la pantalla LCD
    printf(lcd_putc,"Temp.=      %cC",0xdf);    //Visualiza "Temp.      ºC"                        
    lcd_gotoxy(13,2);
    printf(lcd_putc,"%cF",0xdf);                //Visualiza "ºF"        
    Int_Cont=Tiempo+1;                            //Nº de interrupciones (10) para que transcurra 1 seg.

//Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
    setup_adc(adc_clock_div_32);                //Ajusta frecuencia de muestreo del ADC
    setup_adc_ports(sAN0);                        //RA0 entrada analógica
    set_adc_channel(0);                            //Selección del canal RA0/AN0

/*El TMR1 trabaja con oscilador interno y un preescaler de 1:8. Si se trabaja a una frecuencia
de 4 MHz, el TMR1 deberá ser cargado con 12500 para que provoque interrupción al de 0.1s
(12500 * 8 * 1 =100000uS=0.1")*/
    set_timer1(~12500);                            //Carga TMR1 con 12500
    setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);    //TMR1 ON y 1:8    
    enable_interrupts(int_timer1);                //Activa interrupción del Timer1    
    enable_interrupts(global);                    //Habilita interrupciones

    while(1)
    {
    }
}
El DS1820, es otro muy usado y dicen que es más preciso, lo que se diferencia del LM35 que este es digital One-Wire de un único hilo. En resumen. LM35 analógico y el DS1820 digital, aunque sea el mismo encapsulado.

Código en ASM del DS1820:
Fig2808_DS18B20.gif

Código:
;********************************* DS1820_Termostato.asm ******************************
;
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
;
; Programa de control para un termómetro y termostato digital. Utiliza el sensor de
; temperatura DS1820 que transmite la información vía serie a través de un bus de una
; sola línea según un protocolo del fabricante de semiconductores Dallas Semiconductors.
;
; El ajuste de la temperatura a la que conmuta el termostato se logra mediante dos
; pulsadores: "MODO" e "INCREMENTAR", que se conectan a pines del Puerto B y cuyo
; funcionamiento se basa en interrupción por cambio en la línea del Puerto B.
;
; Se maneja de la siguiente forma:
; -    En estado de reposo funciona sólo como termómetro. Aparece la temperatura en pantalla
;    del módulo LCD. La salida del termostato está apagada.
; -    Pulsa "MODO" y se ajusta la temperatura deseada mediante el pulsador "INCREMENTAR".
; -    Vuelve a pulsar "MODO", se activa el termostato. Si la temperatura medida es menor
;    que la deseada enciende la carga, que puede ser un calefactor. Si la temperatura 
;    medida es mayor que la deseada, apaga la carga.
; -    Si se vuelve a pulsar "MODO", apaga la carga y pasa a funcionar sólo como termómetro.
;
; Así pues, en el circuito se distinguen tres modos de funcionamiento que se identifican
; mediante tres flags:
; A)    Modo "Termostato_OFF", donde funciona como termómetro normal sin termostato. Se
;        reconoce por el flag F_Termostato_OFF.
; B)    Modo "Termostato_Ajuste", donde se ajusta la temperatura deseada cuando funcione
;        como termostato. Se reconoce por el flag F_Termostato_Ajuste.
; C)    Modo "Termostato_ON", donde funciona como termómetro normal con termostato. Se
;        reconoce por el flag F_Termostato_ON.
;
; El programa consigue que esté activado uno solo de los flags anteriores.
;
; Al apagar el sistema debe conservar el valor de la temperatura deseada en el termostato
; para la próxima vez que se encienda.
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    CBLOCK    0x0C
    TemperaturaDeseada
    Registro50ms                            ; Guarda los incrementos cada 50 ms.
    FlagsModos                                ; Guarda los flags para establecer los
    ENDC                                    ; modos de trabajo.

    ORG    0x2100                                ; Corresponde a la dirección 0 de la zona
                                            ; EEPROM de datos. Aquí se va a guardar el
    DE    .24                                    ; la temperatura deseada. En principio 24 ºC.

#DEFINE  SalidaTermostato         PORTB,1        ; Carga controlada por el termostato.
#DEFINE  Zumbador                 PORTB,2        ; Aquí se conecta el zumbador.
#DEFINE  ModoPulsador            PORTB,7        ; Los pulsadores se conectan a estos
#DEFINE  IncrementarPulsador    PORTB,6        ; pines del puerto B.
#DEFINE  F_Termostato_ON        FlagsModos,2    ; Flags utilizados en el ajuste de la
#DEFINE  F_Termostato_Ajuste    FlagsModos,1    ; temperatura del termostato.
#DEFINE  F_Termostato_OFF        FlagsModos,0

TMR0_Carga50ms    EQU    d'256'-d'195'            ; Para conseguir interrupción cada 50 ms.
CARGA_2s        EQU    d'40'                    ; Leerá cada 2s = 40 x 50ms = 2000ms.    

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0
    goto    Inicio
    ORG    4
    goto    ServicioInterrupcion

Mensajes
    addwf    PCL,F
MensajePublicitario
    DT "IES. ISAAC PERAL", 0x00
MensajeTermostato_ON
    DT "Termostato: ", 0x00
MensajeTermostato_Ajuste
    DT "Temper. deseada", 0x00
MensajeGradoCentigrado
    DT "ºC  ", 0x00                    ; En pantalla LCD: "ºC  "

Inicio    
    call    LCD_Inicializa
    bsf        STATUS,RP0
    movlw    b'00000111'                ; Prescaler de 256 para el TMR0 y habilita
    movwf    OPTION_REG                ; resistencias de Pull-Up del Puerto B.
    bsf        ModoPulsador            ; Se configuran como entrada.
    bsf        IncrementarPulsador
    bcf        SalidaTermostato        ; Se configuran como salida.
    bcf        Zumbador
    bcf        STATUS,RP0
    call    LCD_Linea1                ; Se sitúa al principio de la primera línea.
    movlw    MensajePublicitario
    call    LCD_Mensaje
    call    DS1820_Inicializa        ; Comienza la conversión del termómetro y pone
    call    ModoTermostato_OFF        ; este modo de funcionamiento.
    movlw    TMR0_Carga50ms            ; Carga el TMR0 en complemento a 2.
    movwf    TMR0
    movlw    CARGA_2s                    ; Y el registro cuyo decremento contará los 2 s.
    movwf    Registro50ms
    clrw                            ; Lee la posición 0x00 de memoria EEPROM de datos
    call    EEPROM_LeeDato            ; donde se guarda la temperatura deseada de la última
    movwf    TemperaturaDeseada        ; vez que se ajustó.
    movlw    b'10101000'                ; Activa interrupción del TMR0 (T0IE), por cambio de
    movwf    INTCON                    ; líneas del Puerto B (RBIE) y la general (GIE)
;
; La sección "Principal" es mantenimiento. Sólo espera las interrupciones.
; No se puede poner en modo de bajo consumo porque la instrucción "sleep" detiene el Timer 0.

Principal
    goto    Principal

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Detecta qué ha producido la interrupción y ejecuta la subrutina de atención correspondiente.

ServicioInterrupcion
    btfsc    INTCON,T0IF                ; Si es una interrupción producida por el Timer 0
    call    Termometro                ; lee el termómetro y actualiza termostato.
    btfss    INTCON,RBIF                ; Si es una interrupción RBI lee los pulsadores.
    goto    FinInterrupcion
    btfss    ModoPulsador            ; ¿Está presionado el pulsador de "AJUSTE"?
    call    CambiarModo                ; Sí. Ajusta la temperatura deseada en el termostato.
    btfss    IncrementarPulsador        ; ¿Pulsado "INCREMENTAR"?
    call    IncrementarTempDeseada    ; Sí, pasa a incrementar la temperatura deseada.
FinInterrupcion
    bcf        INTCON,RBIF                ; Limpia los flags de reconocimiento.
    bcf        INTCON,T0IF
    retfie

; Subrutina "Termometro" ----------------------------------------------------------------
;
; Esta subrutina lee y visualiza el termómetro cada 2 segundos aproximadamente. Se ejecuta
; debido a la petición de interrupción del Timer 0, cada 50 ms. Para conseguir una
; temporización de 2 s, habrá que repetir 40 veces el lazo de 50 ms (40x50ms=2000ms=2s).
;
; También actúa sobre la salida del termostato posicionándola adecuadamente.

Termometro
    movlw    TMR0_Carga50ms
    movwf    TMR0                    ; Recarga el TMR0.
    decfsz    Registro50ms,F            ; Decrementa el contador.
    goto    FinInterrupcion            ; No han pasado 2 segundos, por tanto sale.
    movlw    CARGA_2s                ; Repone este contador nuevamente.
    movwf    Registro50ms
    call    DS1820_LeeTemperatura    ; Lee la temperatura.
    call    DS1820_Inicializa        ; Comienza conversión para la siguiente lectura.
    call    Termostato                ; Actúa sobre el termostato.
;    call    Visualiza                ; Como esta subrutina se escribe a continuación
;    return                            ; se ahorra estas dos instrucciones y ahorra 
                                    ; también espacio en la pila.
; Subrutina "Visualiza" -----------------------------------------------------------------
;
; Visualiza el termómetro en tres formatos posibles:
; A)    Con el termostato desactivado, modo "Termostato_OFF". Por ejemplo:
;                 "IES. Isaac Peral" (Primera línea)
;                "       24.5ºC   " (Segunda línea).
;        Donde en la primera línea se visualiza un mensaje publicitario y en la
;        segunda línea la temperatura medida actual.
; B)    Ajuste del termostato, modo "Termostato_Ajuste". Por ejemplo:
;                 "Temper. deseada" (Primera línea)
;                "        25ºC     " (Segunda línea).
;         Donde en la segunda línea visualiza la temperatura que se desea ajustar.
; C)    Con el termostato activado, modo "Termostato_ON". Por ejemplo:
;                 "Termostato: 25ºC" (Primera línea)
;                "      23.5ºC    " (Segunda línea).
;         Donde en la primera línea se visualiza la temperatura que se desea
;        ajustar y en la segunda línea la temperatura medida actual.
Visualiza
    btfsc    F_Termostato_OFF
    goto    VisualizaTermometro
    btfsc    F_Termostato_Ajuste
    goto    VisualizaTermostato_Ajuste
    btfsc    F_Termostato_ON
    goto    VisualizaTermostato_ON
    return

; "VisualizaTermostato_ON" --------------------------------------------------------------
;
; Visualiza el valor de la temperatura deseada en la primera línea y el valor de la
; temperatura medida en la segunda línea.
; 
VisualizaTermostato_ON
    call    LCD_Linea1
    movlw    MensajeTermostato_ON
    call    LCD_Mensaje
    call    VisualizaTemperaturaDeseada
    call    VisualizaTemperaturaMedida
    return

; "VisualizaTermostatoAjuste" y "VisualizaTemperaturaDeseada" ---------------------------
;
; Visualiza en la pantalla el formato propio de este modo.
; 
; Entradas:    (TemperaturaDeseada) temperatura ajustada en la subrutina Incrementar.

VisualizaTermostato_Ajuste
    call    LCD_Linea1                    ; Se sitúa al principio de la primera línea.
    movlw    MensajeTermostato_Ajuste    ; Visualiza mensaje en la primera línea.
    call    LCD_Mensaje
    movlw    .6                            ; Se coloca para centrar visualización en la 
    call    LCD_PosicionLinea2            ; segunda línea.
VisualizaTemperaturaDeseada
    movf    TemperaturaDeseada,W
    call    BIN_a_BCD                    ; La pasa a BCD.
    call    LCD_Byte                    ; Visualiza, apagando los ceros no significativos.
    movlw    MensajeGradoCentigrado        ; En pantalla aparece "ºC  ".
    call    LCD_Mensaje
    return

; "VisualizaTermometro" y ""VisualizaTemperaturaMedida" ---------------------------------
;
; En la primera línea se visualiza un mensaje publicitario y en la segunda línea la
; temperatura medida
;
; Entradas:
;      -    (DS1820_Temperatura), temperatura medida en valor absoluto.
;     -    (DS1820_TemperaturaDecimal), parte decimal de la temperatura medida.
;     -    (DS1820_Signo), registro con el signo de la temperatura. Si es igual a
;        b'00000000' la temperatura es positiva. Si es b'11111111' resulta que
;        la temperatura es negativa.
;
VisualizaTermometro
    call    LCD_Linea1                ; Se sitúa al principio de la primera línea.
    movlw    MensajePublicitario
    call    LCD_Mensaje
VisualizaTemperaturaMedida
    movlw    .5                        ; Se coloca para centrar visualización en la
    call    LCD_PosicionLinea2        ; segunda línea.
    btfss    DS1820_TemperaturaSigno,7 ; ¿Temperatura negativa?
    goto    TemperaturaPositiva        ; No, es positiva.
TemperaturaNegativa:
    movlw     '-'                        ; Visualiza el signo "-" de temperatura negativa.
    call    LCD_Caracter
TemperaturaPositiva
    movf    DS1820_Temperatura,W
    call    BIN_a_BCD                ; La pasa a BCD.
    call    LCD_Byte                ; Visualiza apagando los ceros no significativos.
    movlw    '.'                        ; Visualiza el punto decimal.
    call    LCD_Caracter
    movf    DS1820_TemperaturaDecimal,W ; Visualiza la parte decimal.
    call    LCD_Nibble
    movlw    MensajeGradoCentigrado    ; En pantalla LCD aparece "ºC  ".
    call    LCD_Mensaje
    return

; Subrutina "Termostato" ----------------------------------------------------------------
;
; Controla una carga en función del valor de la temperatura medida respecto de la temperatura
; deseada. Para evitar inestabilidad en la salida, tendrá un pequeño ciclo de histéresis.
; Así por ejemplo, si la temperatura deseada es 24 ºC la carga se activará cuando la
; temperatura baje o sea igual a 23,5 ºC y se apagará cuando la supere o sea igual a 25ºC.
; Si la temperatura medida está entre esos márgenes (23,5 y 25ºC), se queda en el estado
; anterior, tanto si está encendida como apagada.
;
; Para temperaturas negativas la salida se debe activar siempre.
;
; Entradas:
;         -    (DS1820_Temperatura), temperatura medida en valor absoluto.
;         -    (TemperaturaDeseada), temperatura a partir de la cual se tomarán
;            decisiones sobre la salida.
;         -    (DS1820_Signo), registro con el signo de la temperatura medida. Si es cero
;            la temperatura es positiva y todos sus bits son "1", es negativa.
;
; Salida:    -    Su funcionamiento:
;              -    Estando apagada, si la temperatura medida desciende por debajo de la
;                temperatura deseada la salida se activará.
;             -    Estando encendida, si la temperatura medida supera la deseada la
;                salida se apagará.
;             -    Si las temperaturas medidas y deseada son iguales se queda en estado
;                anterior, tanto si está encendida como si está apagada.
;             -    Para temperaturas negativas la salida se debe activar siempre.
Termostato
    btfss    F_Termostato_ON            ; Si el termostato no está activado salta a
    goto    ApagaCarga                ; apagar la carga.
    btfsc    DS1820_TemperaturaSigno,7    ; Con temperaturas negativas pasa a activar
    goto    EnciendeCarga            ; la carga.
    btfss    SalidaTermostato        ; Comprueba el estado actual de la salida para
    goto    SalidaEstabaApagada        ; actuar en consecuencia.
SalidaEstabaActivada                ; Pasa a comprobar si tiene que apagar la carga.
    movf    DS1820_Temperatura,W
    subwf    TemperaturaDeseada,W    ; (W)=(TemperaturaDeseada)-(DS1820_Temperatura).
    btfsc    STATUS,C                ; ¿(TemperaturaDeseada)<(DS1820_Temperatura)?    
    goto    FinTermostato            ; Sí, por tanto, lo deja encendido y sale.
    call    Pitido                    ; Pitido cada vez que conmuta la carga.
ApagaCarga
    bcf        SalidaTermostato        ; Apaga la salida y sale.
    goto    FinTermostato
SalidaEstabaApagada                    ; Pasa a comprobar si tiene que encender la carga
    movf    TemperaturaDeseada,W
    subwf    DS1820_Temperatura,W    ; (W)=(DS1820_Temperatura)-(TemperaturaDeseada).
    btfsc    STATUS,C                ; ¿(DS1820_Temperatura)<(TemperaturaDeseada)?    
    goto    FinTermostato            ; Sí, la deja apagada y sale.
EnciendeCarga
    call    Pitido                    ; Pitido cada vez que activa la carga.
    bsf        SalidaTermostato
FinTermostato
    return

; Subrutinas "CambiarModo" y "ModoTermostato_OFF" -----------------------------------------
;
; Subrutina de atención a la interrupción producida por el pulsador "MODO" que cambia el modo
; de funcionamiento. Cada vez que pulsa pasa por los modos "Termostato_Ajuste", "Termostato_ON",
; "Termostato_OFF" y vuelta repetir.
;
; El ajuste de la temperatura deseada en el termostato se logra mediante dos pulsadores: "MODO"
; e "INCREMENTAR" conectados a pines del Puerto B.

; Al principio aparecerá sólo el termómetro y el termostato estará desactivado: modo
; "Termostato_OFF"
;
; Para comprender el funcionamiento de esta subrutina, hay que saber que el registro FlagsModos
; contiene 3 flags que permiten diferenciar cada uno de los modos de funcionamiento:
; A)    Modo "Termostato_OFF", donde funciona como termómetro normal sin termostato. Se
;        reconoce por el flag F_Termostato_OFF, que es el bit 0 del registro FlagsModos.
; B)    Modo "Termostato_Ajuste", donde se ajusta la temperatura deseada cuando funcione
;        como termostato. Se reconoce por el flag F_Termostato_Ajuste, que es el bit 1 del
;        registro FlagsModos.
; C)    Modo "Termostato_ON", donde funciona como termómetro normal y, además, como termostato.
;        Se reconoce por el flag F_Termostato_ON, que es el bit 2 del registro FlagsModos.
;
; Así pues, el contenido del registro (FlagsModos) identifica los siguientes modos de
; funcionamiento:
; - (FlagsModos)=b'00000001'. Está en el modo "Termostato_OFF".
; - (FlagsModos)=b'00000010'. Está en el modo "Termostato_Ajuste".
; - (FlagsModos)=b'00000100'. Está en el modo "Termostato_ON".

; Pueden darse dos casos:
; -    Que pulse "AJUSTE" estando en el modo más alto, "Termostato_ON",
;    (FlagsModos)=b'00000100'. En este caso debe pasar al modo inicial 
;    "Termostato_OFF" poniendo (FlagsModos)=b'00000001'.
; -    Que pulse "AJUSTE" estando ya en cualquiera de los otros dos modos, en cuyo caso debe
;    pasar al siguiente modo. Esto lo hace mediante un desplazamiento a izquierdas. Así, por
;    ejemplo, si antes estaba en modo "Termostato_OFF", (FlagsModos)=b'00000001', pasará a
;    (FlagsModos)=b'00000010' que identifica al modo "Termostato_Ajuste".
;
CambiarModo
    call    Retardo_20ms            ; Espera a que se estabilicen niveles de tensión.
    btfsc    ModoPulsador            ; Si es un rebote, sale fuera.
    goto    FinCambiarModo
    call    PitidoCorto                ; Cada vez que pulsa se oye un pitido.
    btfss    F_Termostato_ON            ; Detecta si está en el último modo.
    goto    ModoSiguiente            ; Si no, pasa al modo siguiente.
ModoTermostato_OFF
    call    Pitido                    ; Pitido cada vez que conmuta la carga.
    bcf        SalidaTermostato        ; Apaga la carga.
    movlw    b'00000001'                ; Actualiza el registro FlagsModos pasando al
    movwf    FlagsModos                ; modo inicial "Termostato_OFF".
    goto    BorraPantalla
ModoSiguiente                        ; Desplaza un "1" a la izquierda del registro
    bcf        STATUS,C                ; FlagsModos para ajustar secuencialmente
    rlf        FlagsModos,F            ; cada uno de los modos de funcionamiento.
BorraPantalla
    call    LCD_Borra                ; Borra la pantalla anterior.
FinCambiarModo
    call    Visualiza
    btfss    ModoPulsador            ; Ahora espera a que deje de pulsar.
    goto    FinCambiarModo
    return

; Subrutina "IncrementarTempDeseada" ----------------------------------------------------
;
; Subrutina de atención a la interrupción por cambio de la línea RB6 a la cual se ha conectado
; el pulsador "INCREMENTAR". Estando en el modo "Termostato_Ajustar" incrementa el valor de
; la temperatura deseada entre unos valores máximo y mínimo.
;
; Al final debe guardar el valor de la temperatura deseada en memoria EEPROM de datos para
; preservar su valor en caso que desaparezca la alimentación.
;
TemperaturaMinima   EQU    .20
TemperaturaMaxima   EQU    .36

IncrementarTempDeseada
    call    Retardo_20ms            ; Espera a que se estabilicen niveles de tensión.    
    btfsc    IncrementarPulsador        ; Si es un rebote sale fuera.
    goto    FinIncrementar
    btfss    F_Termostato_Ajuste        ; Si no está en modo "Termostato_Ajuste" sale
    goto    FinIncrementar            ; fuera.
    call    PitidoCorto                ; Pitido cada vez que pulsa.
    incf    TemperaturaDeseada,F    ; Incrementa el valor de la temperatura deseada.
    movlw    TemperaturaMaxima        ; ¿Ha llegado a la temperatura máxima de ajuste?.
    subwf    TemperaturaDeseada,W    ; (W) = (TemperaturaDeseada) - TemperaturaMaxima.
    btfss    STATUS,C                ; ¿(TemperaturaDeseada)>=TemperaturaMaxima?
    goto    VisualizaIncremento        ; No, pasa a visualizarlo.
    movlw    TemperaturaMinima        ; Sí, entonces inicializa el registro.
    movwf    TemperaturaDeseada
VisualizaIncremento
    call    Visualiza                ; Visualiza mientras espera a que deje
    call    Retardo_200ms            ; de pulsar.
    btfss    IncrementarPulsador        ; Mientras permanezca pulsado,
    goto    IncrementarTempDeseada    ; incrementa el dígito.
    clrw                            ; Salva el valor de la temperatura deseada en la 
    movwf    EEADR                    ; posición 00h de la EEPROM de datos. Se conserva
    movf    TemperaturaDeseada,W    ; aunque se apague la alimentación.
    call    EEPROM_EscribeDato
FinIncrementar
    return

; Subrutina de pitidos ------------------------------------------------------------------
;
PitidoLargo
    bsf        Zumbador
    call    Retardo_500ms
Pitido
    bsf        Zumbador
    call    Retardo_200ms
PitidoCorto
    bsf        Zumbador
    call    Retardo_20ms
    bcf        Zumbador
    return
;
    INCLUDE  <BUS_1LIN.INC>            ; Subrutinas de control del bus de 1 línea.
    INCLUDE  <DS1820.INC>            ; Subrutinas de control del termómetro digital.
    INCLUDE  <RETARDOS.INC>
    INCLUDE  <BIN_BCD.INC>
    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <EEPROM.INC>
    END
    
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
No cincluyo las librerías ya que solo vas a mirar.

Un cordial saludo.
 
Última edición:
Gracias por tu aporte Meta, pero esos integrados, hasta donde se son para medir temperaturas de circuitos internos, como por ejemplo, la caja de una CPU o una fuente de poder, pero lo que necesito es medir la temperatura del aire en exteriores, por eso menciono la pt100, aunque creo que tampoco es la mas adecuada...

espero sugerencias
 
También miden temperaturas externas. Lo tengo comprobado.

Por ahora así sin más no conozco otra más y eso que hay muchas.

Espero que alguien lo sepa y nos guíe mejor.
 
Si no lo protege si, ejjejeje. Pensé más en interiores, y si es exterior que sea bajo techo,

1335158-blanco-techo-balc-n-en-key-west-florida.jpg


Por San Google me cuestra encontrarlos el que dices, vi el PT100. Haber habrá muchos y no se ninguno para tal fin. Por ahora, de paso, usas el de mercurio, ejejejjejejee.

Bormas a parte.
Me pica el gusanillo para hacer cosas de estas en el futuro. Si busco algo, me salen cosas como estas que no tienen nada que ver.

http://www.neoteo.com/estacion-meteorologica-neoteo-parte-i

Saludo.
 
El PT100 es un buen sensor. Pero para tu uso es mas barato un LM 35. Lo encapsulas en un pedazo de caño de bronce, le cerras el extremo con poxipol, o soldadura si puedes hacerlo, y el otro extremo en una caja con el circuito, todo estanco para que no entre agua de lluvia.
Tiene un poco de inercia térmica. Ahora si querés medir la temperatura del viento, podés usar la versión metálica del LM 35. Te hacés una arandela de acrílico, en el agujero central le pegas con loctite el LM, y esa arandela la pegás a un tubo de plástico para alejarla de los circuitos, no mucho, unos 3 cm. Apantallás por dentro el tubo con papel de españa al que le soldás un cable para la masa del circuito. En la hoja de datos del LM, encontrarás las indicaciones necesarias para la contrucción del termómetro.
 
Última edición:
A lo mejor funciona.

El PT100 lo veo demasiado industrial para usarlo en una casa.

El LM35 que no uso, más bien el DS1820, se le pone termoretractil. Hay algunos que hacen experimentos medios raros.

sonda1.jpg
 
Gracias por responder...

La solución mas acertada es la que me da aquileslor, no recordaba que hay una versión metalica del LM35, haré unas pruebas con este (si lo consigo) y publicaré resultados del experimento.

La opción de Meta no creo que sea la mas adecuada, la silicona cubriendo el LM35 estándar supongo que afecta la medición, aunque si no consigo el metálico haré algo parecido pero sin taparlo por completo.

También estuve considerando el DS18S20 que mide desde -55ºC hasta +125ºC, pero pienso que no es la mejor opción porque la linea serial se puede ver afectada por la distancia a la que se coloque de la tarjeta controladora.

Gracias a todos por su interés... QAP



Estuve revisando las especificaciones del protocolo 1-wire y la distancia máxima es de 5m sobre par trenzado debidamente aislado, así que también es una buena opción.

Acá les dejo el documento

http://www.google.com.co/url?sa=t&r...sg=AFQjCNFuA2CTZclnFTcEaG_kesYt8wnl-Q&cad=rja
 
Última edición:
Hola:

A mi lo de la silicona no me convence mucho, si tapa hasta lo negro. Taparía todo menos el encapsulado para que mida la temperatura real.

A lo mejor funciona y todo bien. Habría que probar, pero tengo el DS1820.

¿Cuántos metros alcanta del LM35?

Saludo.
 
Hola:

Esa librería en ASM, DS18S20 y para el 16F84A, la puedes adaptar.

¿Realmente te interesa?

Un saludo.

Realmente SI :D quiero ver si la puedo utilizar en un 16F873A

Estoy tratando de hacer un sensor que trabaja con tres potenciometros gobernados mecanicamente desde un posicionador multiple.

Otra cosa que me esta trayendo de los pelos es: si le pongo una Vref+ , los potes los debo conectar tambien a esa tension como maximo?
Me explico: el micro trabaja a 5V , le pongo Vref=2,5V por resolucion necesaria , los potenciometros van entre 0 y 2,5V o entre 0 y 5V ?

Si me das una idea te lo agradecere



Hola:

A mi lo de la silicona no me convence mucho, si tapa hasta lo negro. Taparía todo menos el encapsulado para que mida la temperatura real.

A lo mejor funciona y todo bien. Habría que probar, pero tengo el DS1820.

¿Cuántos metros alcanta del LM35?

Saludo.

Te comento que yo use un LM35 bajo techo para medir la temp ambiente de un local de 200 m2 y lo coloque en una corriente de aire de ventilacion anduvo fantastico , claro esta no era a la intemperie, pero se puede colocar en un recipiente estanco y calibrar el error de medicion mediante trabajo de campo o como hice yo simplemente lo cubri con un recipiente de vidrio (tubo de ensayo de los que usaba en quimica) boca abajo con tapon de espuma de goma , anduvo hasta que me rompieron el recipiente con una gomera :confused: :(
 
Última edición:
Hola:

Para el LM35 este código en ASM orientado a PIC16F886.
Código:
;

;
;El módulo convertidor ADC. Termómetro digital
;
;Este ejemplo visualiza sobre la pantalla LCD la temperatura ambiente captada por el sensor LM35DZ
;conectado con la entrada RA0/AN0 y cuya precisión es de 10mV/ºC. La resolución del convertidor
;ADC, con una tensión de referencia de 5V, es de 0.00488. En estas condiciones cada ºC supone 
;dos incrementos en la salida del convertidor (0.00976V=10mV) aproximadamente. Es por ello que
;al resultado de la conversión se le divide entre 2.
;
;Se emplea el Timer 1 que provoca una interrupción cada 0.1 seg. Cuando se produzcan n interrupciones
;se procede a tomar una muestra de la tempreatura. En este ejemplo se toman cada 1 segundo.

        List    p=16F886        ;Tipo de procesador
        include    "P16F886.INC"    ;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

        __config    _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF    ;Palabra 1 de configuración
        __config    _CONFIG2, _WRT_OFF&_BOR40V                                    ;Palabra 2 de configuración

Tiempo            equ    .10                ;Nº de interrupciones de 0.1 seg. para tomar una muestra (p.e. 1 segundo)

            cblock    0x20            ;Inicio de variables de la aplicación
                Byte_L                ;Parte baja del byte a convertir
                Byte_H                ;Parte alta del byte a convertir
                BCD_2                ;Byte 2 de conversión a BCD
                BCD_1                ;Byte 1 de conversión a BCD
                BCD_0                ;Byte 0 de conversión a BCD
                Contador            ;Variable de contaje
                Int_Cont            ;Contador de interrupciones
                Temporal            
                Temporal_1
                Temporal_2            ;Variables temporales
            endc        

Lcd_var            equ    0x70            ;Variables de las rutinas LCD
    
                org    0x00
                goto    Inicio        ;Vector de reset
                org    0x04
                goto    Inter        ;Vector de interrupción
                org    0x05

;******************************************************************************************
;Según el valor contenido en el registro W, se devuelve el carácter a visualizar

Tabla_Mensajes    movwf    PCL        ;Calcula el desplazamiento sobre la tabla

;***********************************************************************************
;La directiva DT genera tantas intsrucciones RETLW como bytes o caracteres contenga

Mens_0            equ    $        ;Mens_0 apunta al primer carácter del mensaje 0
                dt    "  Temp.=    ",0xdf,"C",0x00

        include    "LCD4bitsPIC16.inc"        ;Incluye rutinas de manejo del LCD

;*************************************************************************************
;Mensaje: Esta rutina envía a la pantalla LCD el mensaje cuyo inicio está  indicado en
;el acumulador. El fin de un mensaje se determina mediante el código 0x00

Mensaje            movwf      Temporal_1         ;Salva posición de la tabla
Mensaje_1          movf       Temporal_1,W       ;Recupera posición de la tabla
                   call       Tabla_Mensajes     ;Busca caracter de salida
                   movwf      Temporal_2         ;Guarda el caracter
                movf       Temporal_2,F
                btfss      STATUS,Z           ;Mira si es el último
                goto       Mensaje_2
                return
Mensaje_2       call    LCD_DATO           ;Visualiza en el LCD
                incf    Temporal_1,F       ;Siguiente caracter
                goto    Mensaje_1

;****************************************************************************************************
;Visualizar: Visualiza sobre la pantalla LCD, en la posición actual del cursor, los dos 
;dígitos situados en la variable BCD_2
Visualizar        swapf    BCD_2,W
                andlw    0x0f
                iorlw    0x30            ;Convierte a ASCII el nible de más peso
                call    LCD_DATO        ;Lo visualiza
                movf    BCD_2,W
                andlw    0x0f
                iorlw    0x30            ;Convierte a ASCII el nible de menos peso
                call    LCD_DATO        ;Lo visualiza
                return

;***************************************************************************************************
;16Bits_BCD: Esta rutina convierte un número binario de 16 bits situado en Cont_H y
;Cont_L y, lo convierte en 5 dígitos BCD que se depositan en las variables BCD_0, BCD_1
;y BCD_2, siendo esta última la de menos peso.
;Está presentada en la nota de aplicación AN544 de MICROCHIP y adaptada por MSE
Bits16_BCD        bcf        STATUS,C
                clrf    Contador    
                bsf        Contador,4        ;Carga el contador con 16        
                clrf    BCD_0
                clrf    BCD_1
                clrf    BCD_2            ;Puesta a 0 inicial

Loop_16            rlf        Byte_L,F
                rlf        Byte_H,F
                rlf        BCD_2,F
                rlf        BCD_1,F
                rlf        BCD_0,F            ;Desplaza a izda. (multiplica por 2)
                decfsz    Contador,F
                goto    Ajuste
                return

Ajuste            movlw    BCD_2
                movwf    FSR                ;Inicia el índice
                call    Ajuste_BCD        ;Ajusta el primer byte
                incf    FSR,F
                call    Ajuste_BCD        ;Ajusta el segundo byte
                incf    FSR,F
                call    Ajuste_BCD
                goto    Loop_16

Ajuste_BCD        movf    INDF,W        
                addlw    0x03
                movwf    Temporal    
                btfsc    Temporal,3        ;Mayor de 7 el nibble de menos peso ??
                movwf    INDF            ;Si, lo acumula
                movf    INDF,W        
                addlw    0x30
                movwf    Temporal
                btfsc    Temporal,7        ;Mayor de 7 el nibble de menos peso ??
                movwf    INDF            ;Si, lo acumula
                return

;***************************************************************************************
;Inter:    Tratamiento de la interrupción que provoca el Timer 1 cada 0.1 seg. Espera a que 
;se produzcan tantas interrupciones como se indique en "Tiempo" para conseguir una temporización
;total determinada. Inicia una conversión del canal seleccionado, realiza los cálculos
;apropiados y visualiza sobre el LCD
Inter:            decfsz    Int_Cont,F        ;Han pasado n interrupciones ??
                goto    Inter_Fin        ;No, fin de tratamiento
;Inicia la conversión
                bsf        ADCON0,GO_DONE    ;Inicia la conversión ADC
Inter_1            btfss    PIR1,ADIF        ;Fin de conversión ??
                goto    Inter_1            ;No, esperar
                bcf        PIR1,ADIF        ;Si, reponer el flag
;Lee el resultado
                movf    ADRESH,W
                movwf    Byte_H            ;Lee y salva la parte alta de la conversión
                bsf        STATUS,RP0        ;Banco 1
                rrf        ADRESL,W        ;Divide entre 2 la parte baja de la conversión
                bcf        STATUS,RP0        ;Banco 0
                movwf    Byte_L            ;Lee y salva la parte baja/2 de la conversión
;Convierte y visualiza
                call    Bits16_BCD        ;Convierte a BCD
                movlw    0x89
                call    LCD_REG            ;Coloca el cursor
                call    Visualizar        ;Visualiza sobre el LCD
;Fin del tratamiento
                movlw    Tiempo
                movwf    Int_Cont        ;Repone el contador para otras 10 interrupciones (1 seg)
Inter_Fin        movlw    low ~.12500
                movwf    TMR1L            ;Carga la parte de menos peso de 12500 en TMR1L
                movlw    high ~.12500
                movwf    TMR1H            ;Repone el TMR1 con el valor 12500.
                bcf        PIR1,TMR1IF        ;Desconecta el flag del TMR1
                retfie

;*****************************************************************************************
;Programa principal
Inicio               clrf    PORTA
                clrf    PORTB            ;Borra salidas
                bsf        STATUS,RP0
                bsf        STATUS,RP1        ;Banco 3
                movlw    b'00000001'
                movwf    ANSEL            ;RA0/AN0/C12IN0- entrada analógica, resto digitales
                clrf    ANSELH            ;Puerta B digital
                bcf        STATUS,RP1        ;Banco 1
                clrf    TRISB            ;Puerta B se configura como salida
                movlw    b'11110001'
                movwf    TRISA            ;RA3:RA1 salidas
                bcf        STATUS,RP0        ;Selecciona banco 0
                movlw    Tiempo
                movwf    Int_Cont        ;Nº de interrupciones (10) para que transcurra 1 seg.

;Inicio de la pantalla LCD y visualiza mensaje inicial
                call    UP_LCD            ;Configura E/S para el LCD
                call    LCD_INI            ;Secuencia de inicio del LCD
                movlw    b'00001100'
                call    LCD_REG            ;LCD On, cursor y blink Off
                movlw    Mens_0
                call    Mensaje            ;Visualiza "Temp.      ºC"

;Se activa el ADC y se selecciona el canal RA0/AN0.    Frec. de conversión = Fosc/32.         
                bsf        STATUS,RP0        ;Selecciona página 1
                movlw    b'10000000'
                movwf    ADCON1            ;Alineación dcha. Vref= VDD
                bcf        STATUS,RP0        ;Selecciona página 0
                movlw    b'10000001'
                movwf    ADCON0            ;ADC en On, seleciona canal RA0/AN0 y Fosc/32

;El TMR1 trabaja con oscilador interno y un preescaler de 1:8. Si se trabaja a una frecuencia
;de 4 MHz, el TMR1 deberá ser cargado con 12500 para que provoque interrupción al de 0.1s
;(12500 * 8 * 1 =100000uS=0.1")
                bcf        PIR1,TMR1IF        ;Restaura el flag del Timer 1
                bsf        STATUS,RP0        ;Selecciona página 1
                bsf        PIE1,TMR1IE        ;habilita interrupción del TMR1
                bcf        STATUS,RP0        ;Selecciona página 0
                movlw    low ~.12500
                movwf    TMR1L
                movlw    high ~.12500
                movwf    TMR1H            ;Carga el TMR1 con el valor 12500.
                movlw    b'00110001'        ;Selecciona reloj interno y preescaler de 8
                movwf    T1CON            ;Habilita el TMR1
                movlw    b'11000000'
                movwf    INTCON            ;Habilitación global de interrupciones

;Bucle principal
            
Loop            nop
                goto    Loop            ;Repetir la lectura

                end                        ;Fin del programa fuente
Lo mismo pero en C.
Código:
/*
              

El módulo convertidor ADC. Termómetro digital

Este ejemplo visualiza sobre la pantalla LCD la temperatura ambiente captada por el sensor LM35DZ
conectado con la entrada RA0/AN0 y cuya precisión es de 10mV/ºC. La resolución del convertidor
ADC, con una tensión de referencia de 5V, es de 0.00488. En estas condiciones cada ºC supone 
dos incrementos en la salida del convertidor (0.00976V=10mV) aproximadamente. Es por ello que
al resultado de la conversión se le divide entre 2.

Se emplea el Timer 1 que provoca una interrupción cada 0.1 seg. Cunado se produzcan n interrupciones
se procede a tomar una muestra de la tempreatura. En este ejemplo se toman cada 1 segundo. 

En este caso visualizamos en centígrados (ºC) y en Fahrenheit (ºF), donde (ºF = ºC*1.8+32)*/

#include <16f886.h>

/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */

#fuses     NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT    //Palabra 1 de configuración
#fuses    NOWRT,BORV40                                //Palabra 2 de configuración

/* Con estas directivas las funciones "input" y "output_bit" no reprograman
el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */

#device ADC=10                                    //Conversor ADC/ de 10 bits de resolución
#use fast_io (A)
#use fast_io (B)
#use delay(clock=4000000)                        //Frecuencia de trabajo

#include <lcd4bitsPIC16.h>                        //Incluye funciones de manejo del LCD

#define Tiempo    10                                //Nº de interrupciones de 0.1 seg. para tomar una muestra (p.e. 1 segundo)
int Int_Cont;                                    //Contador de interrupciones
int16 Temperatura;                                //Variable con la temperatura medida    
int Centigrados;                                //Variable con la medida en ºC
float Fahrenheit;                                //Variable con la medida en ºFahrenheit

/****************************************************************************************
Tratamiento de la interrupción que provoca el Timer 1 cada 0.1 seg. Espera a que se produzcan
tantas interrupciones como se indique en "Tiempo" para conseguir una temporización total determinada.
Inicia una conversión del canal seleccionado, realiza los cálculos apropiados y visualiza sobre el LCD*/
#int_timer1                
tratamiento()
{    
    Int_Cont--;    
    if(Int_Cont==0)                                //Han pasado n interrupciones
    {
        lcd_gotoxy(10,1);                        //Coloca el cursor        
        Temperatura=read_adc();                    //Inicia la conversión y lee el resultado (temperatura)
        Centigrados=Temperatura/2;                //Calcula los grados centígrados
        Fahrenheit=Centigrados*1.8+32;            //Calcula los grados Fahrenheit
        printf(lcd_putc,"%2u",Centigrados);        //Visualiza en grados centígrados
        lcd_gotoxy(8,2);                        //Coloca el cursor
        printf(lcd_putc,"%3.1f",Fahrenheit);    //Visualiza en grados Fahrenheit
        Int_Cont=Tiempo+1;                        //Repone el contador para otras 10 interrupciones (1 seg)
    }
    set_timer1(~12500);                            //Repone TMR1 con 12500
}
                    
main()
{  
    delay_ms(50);    
    lcd_init();                                    //Inicia la pantalla LCD
    printf(lcd_putc,"Temp.=      %cC",0xdf);    //Visualiza "Temp.      ºC"                        
    lcd_gotoxy(13,2);
    printf(lcd_putc,"%cF",0xdf);                //Visualiza "ºF"        
    Int_Cont=Tiempo+1;                            //Nº de interrupciones (10) para que transcurra 1 seg.

//Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
    setup_adc(adc_clock_div_32);                //Ajusta frecuencia de muestreo del ADC
    setup_adc_ports(sAN0);                        //RA0 entrada analógica
    set_adc_channel(0);                            //Selección del canal RA0/AN0

/*El TMR1 trabaja con oscilador interno y un preescaler de 1:8. Si se trabaja a una frecuencia
de 4 MHz, el TMR1 deberá ser cargado con 12500 para que provoque interrupción al de 0.1s
(12500 * 8 * 1 =100000uS=0.1")*/
    set_timer1(~12500);                            //Carga TMR1 con 12500
    setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);    //TMR1 ON y 1:8    
    enable_interrupts(int_timer1);                //Activa interrupción del Timer1    
    enable_interrupts(global);                    //Habilita interrupciones

    while(1)
    {
    }
}

Dentro de unos días te paso el del 16F84A y 16F886 del sensor en ASM y C sobre DS1820.

Un saludo.
 
Bueno, parece que no entro el mensaje anterior.

Te comento que este programa lo tengo para el 16F873A y funciona bien pero usando el LCD a 8 bits Todo el PORTB .
Lo que busco es el INCLUDE para 4 bits.
Y si en el camino me podes ayudar con la consulta que hice respecto de los potenciometros

Gracias
 
Decir que sensores com el ds18b20 los hay encapsulados en sondas de acero inoxidable, económicas y durabilidad muy alta. Es el sensor que debes usar. Precisión, precio, calidad, rapidez en detectar cambios asombrosa, direccionable por software, sensillez ...
 
hola amigos estoy tratando de desarrollar el termómetro digital del libro micro controlador pic 16f84,el cual consta de un pic 16f84a,un sensor de temperatura DS1624 y un lcd lm016l,he desarrollado el proyecto en mplab y la compilasion se da de manera exitosa.al simularlo en proteus 7.7 le ingreso la extensión .HEX al pic y una frecuencia común de 4 megaherz y no responde e manera inmediata
luego le cambie la frecuncia del pic a 1 Mhz Y funciono al inicio cuando debe mostrar el mensaje inicial q le programe:D
pero solamente hasta allí al hacer la transición al mensaje de temperatura no me muestra el mensaje:(
les agradeceria que me ayudaran a encontrar el problema:aplauso:.les dejo el programa y la simulacion
:)
 

Adjuntos

  • Nuevo documento de texto.txt
    16.7 KB · Visitas: 12
  • termometro.jpg
    termometro.jpg
    143.8 KB · Visitas: 32
  • termometro 2.jpg
    termometro 2.jpg
    144 KB · Visitas: 21
hola amigos estoy tratando de desarrollar el termómetro digital del libro micro controlador pic 16f84,el cual consta de un pic 16f84a,un sensor de temperatura DS1624 y un lcd lm016l,he desarrollado el proyecto en mplab y la compilasion se da de manera exitosa.al simularlo en proteus 7.7 le ingreso la extensión .HEX al pic y una frecuencia común de 4 megaherz y no responde e manera inmediata
luego le cambie la frecuncia del pic a 1 Mhz Y funciono al inicio cuando debe mostrar el mensaje inicial q le programe:D
pero solamente hasta allí al hacer la transición al mensaje de temperatura no me muestra el mensaje:(
les agradeceria que me ayudaran a encontrar el problema:aplauso:.les dejo el programa y la simulacion
:)

Hola, a tu código le falta la definición de los fusibles
 
Atrás
Arriba