Medidor de temperatura diferentes zonas

#1
Saludos desde venezuela.
Querio presentar este proyecto: medir tres sensores lm35 en un pic 16f877A y por cada puerto voy a enviar cada medicion: por ejemplo zona A, zona B, Zona C, mi duda es la siguiente, en el puerto b funciona todo bien mide el sensor y aparecen los numeros exactos, pero en los demas puertos mide el sensor pero me da otras medidas aca les dejo el codigo y el circuito para ver si alguien puede guiarme: no encontre como subir el circuito en proteus para que lo simulen pero leyendo el codigo se pueden guiar
gracias por su tiempo... saludos...
Código:
\'****************************************************************
\'*  Name    : temperatura zonas                               *
\'*  Author  : [gerardo salazar]                                 *
\'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
\'*          : All Rights Reserved                               *
\'*  Date    : 23/09/2014                                        *
\'*  Version : 1.0                                               *
\'*  Notes   : para cualquier proyecto                              *
\'*          :                                                   *
\'****************************************************************
;DEFINE VELOCIDAD DE OSCILADOR
DEFINE OSC 4
\'***************************************************************
; PARÁMETROS DEL ADC
DEFINE ADC_BITS 10          ; NÚMERO DE BITS
DEFINE ADC_CLOCK 3          ; USAR CLOCK RC DEL AD
DEFINE ADC_SAMPLEUS 50      ; TIEMPO DE MUESTREO EN 50US
ADCON0 = %11000000          ; Para habilitar red interna RC.
ADCON1 = %10000000          ; HABILITA TODAS LAS ENTRADAS ANALOGICAS
\'*********************************************************************
; VARIABLES
apaga   var word
UNI     VAR BYTE
DECE    VAR BYTE
CEN     VAR BYTE
MIL     VAR BYTE
UNIDAD1 VAR BYTE
DECENA1 VAR BYTE
CENTE1  VAR BYTE
MILES1  VAR BYTE
UNIDAD  VAR BYTE
DECENA  VAR BYTE
CENTE   VAR BYTE
MILES   VAR BYTE
RES     VAR WORD                         ; RESULTADO DE LA CONVERSIÓN
VAL     var word
VAL1    VAR WORD
medida  var word
MEDIDA3 VAR WORD
voltio  var WORD
PRESION VAR WORD
TEMP1   VAR byte                       ; TEMPERATURA C
\'***********************************************************************
; HABILITA LOS PUERTOS
TRISA = %11111111                   ; TODOS LOS PUERTOS A SON ENTRADAS
TRISB = %00000000                   ; TODOS LOS PUERTOS B C D SON SALIDAS
TRISC = %00000000		
TRISD = %00000000
;***************************************************************************
; INICIAR EL CANAL 0 TEMPERATURA 
INICIO:
  ADCIN 0, RES                       ; LEER EL CANAL A
  TEMP1 = 488*RES                    ; 1024*488=499712;
  VAL = div32 100  
; RUTINA DEL DISPLAY 
  PAUSE 200 
  UNI = VAL DIG 1
  PORTB= UNI + 224
  PAUSE 100
  DECE = VAL DIG 2
  PORTB= DECE + 208
  PAUSE 100
  CEN = VAL DIG 3
  PORTB = CEN + 176
  PAUSE 100
  MIL = VAL DIG 4
  PORTB = MIL + 112
  PAUSE 100
;lectura del CANAL 1 VOLTAJE
   adcin 1, medida 
   voltio = 488*MEDIDA
   
;RUTINA DEL DISPLAY
PAUSE 100
  UNIDAD = voltio DIG 0 
  PORTC= UNIDAD + 224
  PAUSE 100
  DECENA = voltio DIG 1
  PORTC= DECENA + 208
  PAUSE 100
  CENTE = VOLTIO DIG 2
  PORTC = CENTE + 176
  PAUSE 100
  MILES = VOLTIO DIG 3
  PORTC = MILES + 112
  PAUSE 100 
;LECTURA DEL CANAL 2 PRESION 
  adcin 2, MEDIDA3 
   PRESION = 488*MEDIDA3
;RUTINA DEL DISPLAY
 UNIDAD1 = PRESION DIG 0  
  PORTD= UNIDAD1 + 224
  PAUSE 100
  DECENA1 = PRESION DIG 1
  PORTD= DECENA1 + 208
  PAUSE 100
  CENTE1 = PRESION DIG 2
  PORTD = CENTE1 + 176
  PAUSE 100
  MILES1 = PRESION DIG 3
  PORTD = MILES1 + 112
  PAUSE 100 
GOTO INICIO 
END ...
 

Adjuntos

Última edición por un moderador:
#2
Hola, ¿a qué te refieres con "otras medidas"?, prueba conectando el mismo sensor a las 3 entradas para revisar su comportamiento
 
#3
Hola. Gracias por responder.
Ya resolví que me mostrara la medida de cada sensor. Conseguí un código por internet pero no lo entiendo. Funciona bien pero no entiendo como funciona, si me lo puedes explicar te lo agradecería acá está el código, de hecho cambie el proyecto y ahora quiero medir tres parámetros, temperatura, voltaje y presión de aceite.
Código:
'****************************************************************
'*  Name    : temperaturas.BAS                                *
'*  Author  : [gerardo salazar]                                 *
'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 23/09/2014                                        *
'*  Version : 1.0                                               *
'*  Notes   : para cualquier proyecto                              *
'*          :                                                   *
'****************************************************************
;DEFINE VELOCIDAD DE OSCILADOR
DEFINE OSC 4
'***************************************************************
; PARÁMETROS DEL ADC
DEFINE ADC_BITS 10          ; NÚMERO DE BITS
DEFINE ADC_CLOCK 3          ; USAR CLOCK RC DEL AD
DEFINE ADC_SAMPLEUS 50      ; TIEMPO DE MUESTREO EN 50US
ADCON0 = %11000000          ; Para habilitar red interna RC.
ADCON1 = %10000000          ; HABILITA TODAS LAS ENTRADAS ANALOGICAS
'*********************************************************************
; VARIABLES
apaga   var word
UNI     VAR BYTE
DECE    VAR BYTE
CEN     VAR BYTE
MIL     VAR BYTE
RES     VAR WORD                         ; RESULTADO DE LA CONVERSIÓN
VAL     var word
valor   var byte
medida  var byte
MEDIDA3 VAR WORD
voltio  var WORD
PRESION VAR byte
TEMP1   VAR byte                       ; TEMPERATURA C
'***********************************************************************
; HABILITA LOS PUERTOS
TRISA = %11111111                   ; TODOS LOS PUERTOS A SON ENTRADAS
TRISB = %00000000                   ; TODOS LOS PUERTOS B C D SON SALIDAS
TRISC = %00000000        
TRISD = %00000000
;***************************************************************************
; INICIAR EL CANAL 0 TEMPERATURA 
INICIO:
  ADCIN 0, RES                       ; LEER EL CANAL A
  TEMP1 = 488*Res                   ; 1024*488=499712;
  VAL = div32 100  
; RUTINA DEL DISPLAY 
  PAUSE 200 
  UNI = VAL DIG 1
  PORTB= UNI + 224
  PAUSE 100
  DECE = VAL DIG 2
  PORTB= DECE + 208
  PAUSE 100
  CEN = VAL DIG 3
  PORTB = CEN + 176
  PAUSE 100
  MIL = VAL DIG 4
  PORTB = MIL + 112
  PAUSE 100
'*****************************************************************
;lectura del CANAL 1 VOLTAJE
   adcin 1, medida
   valor = (medida)*(2) 
if valor/1624<10 then portc=valor/1624
if valor/1624>9 and valor/1624<20 then portc=valor/1624 + 6
if valor/1624>19 and valor/1624<30 then portc=valor/1624 + 12
if valor/1624>29 and valor/1624<40 then portc=valor/1624 +18
if valor/1624>39 then portc= valor/1624 + 24
'*******************************************************************
;LECTURA DEL CANAL 2 PRESION 
  adcin 2, MEDIDA3 
   PRESION = medida3/2 -1
;RUTINA DEL DISPLAY
 UNI = PRESION DIG 0  
  PORTD= UNI + 224
  PAUSE 100
  DECe = PRESION DIG 1
  PORTD= DECE + 208
  PAUSE 100
  CEN = PRESION DIG 2
  PORTD = CEN + 176
  PAUSE 100
  MIL = PRESION DIG 3
  PORTD = MIL + 112
  PAUSE 100 
GOTO INICIO 
END
Y voy adjuntar el proteus para la simulación.
 

Adjuntos

Última edición por un moderador:
#4
Esto no me gusta nada:
PHP:
valor = (medida)*(2)
if valor/1624<10 then portc=valor/1624
if valor/1624>9 and valor/1624<20 then portc=valor/1624 + 6
if valor/1624>19 and valor/1624<30 then portc=valor/1624 + 12
if valor/1624>29 and valor/1624<40 then portc=valor/1624 +18
if valor/1624>39 then portc= valor/1624 + 24
Repites muchas veces lo de valor/1624. Si el compilador no es listo, estás creando un montón de operaciones.

Mejor así:
PHP:
valor = medida * 2 / 1624
if valor <  10                then portc = valor
if valor >= 10 and valor < 20 then portc = valor +  6
if valor >= 20 and valor < 30 then portc = valor + 12
if valor >= 30 and valor < 40 then portc = valor + 18
if valor >= 40                then portc = valor + 24
 
#5
gracias ese código funciono, de verdad muchas gracias, pero de verdad no entiendo como funciona...hay detalle quisiera que en el parte de los display de temperatura se apagara el primer display de izquierda a derecha, es decir cuando marque hasta 99 el display de las centenas se apague, y al marcar 100 este se prenda es un detalle pero es funcional, en un rato lo voy a colgar en el foro para que lo corrigan, gracias saludos desde venezuela...
 
#6
buenos días amigos,
saludos desde venezuela
quisiera que aportaran ideas al siguiente proyecto
es un medidor de dos sensores de temperaturas y un voltimetro
ya funciona y lo pueden aprovechar para cualquier proyecto, mis dudas son las siguientes

1.- Quisiera que los display funcionaran a medida que hace la conversion, les explico, cuando mida por ejemplo 2 grados los otros dos display a la izquierda estén apagados, pero cuando mida 10 grados hasta 99 se mantenga el ultimo display a la izquierda apagado y al medir 100 grados lógicamente ya estarían activos todos, el objetivo es consumir la menor corriente posible.

gracias de antemano....
 

Adjuntos

#7
Hola gerardo35

Para lograr lo que pretendes son las entradas RBI(5) y BI/RB0(4).
Solo requieres detectar cuando las entradas A, B, C y D, del 7447, sean 0 Y(AND) el común del Display sea 1 la salida de un nuevo circuito sea 0. Éste 0 lo aplicas a la entrada RBI(5) del 7447.
Los datos serían 0000 AND 1 = 0.

Analiza las hojas de datos que te adjunto.

saludos
a sus ordenes

Nota: También lo puedes hacer modificando tu código. Si hay 0 en un determinado Dígito Generar un 0 y aplicarlo a RBI(5)
 

Adjuntos

#8
Y la manera más fácil es hacerlo por software, porque seguramente ya tenés el montaje armado...

Lo que te proponen lo vi hacer en
http://martybugs.net/electronics/speedo.cgi
para el primer dígito de la izquierda, es la red D15 al D19, IC4f, en este caso el decoder es un CD4511.

Por software para no trastocar mucho la rutina que se ocupa de los Led Display, lo que se puede hacer es enviar un número mayor que 9 y se supone que se apagará, según la hoja de datos, cosa que no es mi caso, el chip nunca apaga sus segmentos, no se porque. Para el 7447 ese número es al 15 según la hoja de datos.

Claro que siempre se puede actuar sobre el pin común del dígito y listo el pollo.
 

Temas similares

Arriba