'************************************************* ***************
'* Name : controlhumedad2.BAS *
'* Author : Leonardo Castillo *
'* Notice : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 13/11/2010 *
'* Version : 2.0 *
'* Notes : emplea sensor HMZ 433A1 "pero su voltaje aumenta *
'* : con la temperatura como si fuera un PTC, esto es *
'* :debido a la resistencia en paraleo ya que el voltaje*
'* btenido es el de la resistencia en paralelo, por lo*
'* :que se debe de obtener el complemento para tener la *
'* :lectura sobre el termistor. "Vt=5-lectura *
'************************************************* ***************
'p=pic16F88
INCLUDE "modedefs.bas"
asm
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
endasm
clear ;limpia todos los registros
define OSC 4 ; especifica que se va a utilizar uno de 4 Mhz

; Definicion de conexiónes del LCD
DEFINE LCD_DREG PORTB ; LCD bits de comunicacion al LCD
DEFINE LCD_DBIT 1 ; Coneccion puerto B (RB4,RB5,RB6,RB7)
DEFINE LCD_RSREG PORTB ; LCD bit RS conectado a PORTB
DEFINE LCD_RSBIT 2 ; LCD bit RS conectado a puerto B (RB2)
DEFINE LCD_EREG PORTB ; LCD bit E conectado a PORTB
DEFINE LCD_EBIT 3 ; LCD bit E conectado a puerto B (RB3)
DEFINE LCD_BITS 4 ; LCD comunicado 4Bits
DEFINE LCD_LINES 2 ; LCD de 2 lineas

n var word
n1 var word
J1 var word
J2 var word
V1 VAR WORD
V2 VAR WORD
inicial var word
B var word
J var word
Voltemp Var word ' Variable donde se guarda el resultado de conversion A/D
tempV var word
temp var word
degC var word
HumedadV var word
Humedad var word
symbol TI=PORTA.1
SYMBOL Humed=PORTA.0
symbol templm35=PORTA.4
symbol Ventilador=PORTB.0
; definicion de parametros de conversion A/D
DEFINE ADC_BITS 10 ; numero de bit conversion A/D
DEFINE ADC_CLOCK 3 ; reloj interno RC usado en conversion A/D
DEFINE ADC_SAMPLEUS 50 ; tiempo de conversion en Us
Inicio:
OSCCON = %01100110 ;se selecciona el tipo de oscilador (interno) y a 4 MHz
TRISA =%00010011 ;RA0 y RA1 RA4(AN 0,AN1,AN4 CANAL 0, 1 y 4) toma las lecturas
TRISB =%00000000 ;Pines de PORTB al LCD son salida
CCP1CON = 0 ;DESHABILITA modulo PWM
CMCON = 7 ;deshabilita modulo comparador
PAUSE 500 ;0.5s para inicializar LDC
lcdout $FE,$0C ;lcd cursor off
ANSEL=%00010011 ;AN 0 AN 1 AN4 ENTRADA ANALOGA
;ADCON0 = %11000000 ;RC interno y modulo convertidor sin operar,CANAL AN"0" ,
ADCON1 = %10000000 ;voltaje de referencia Vdd-Vss y ADFM =0 justifica resultado a la derecha
thermistor:
ADCON0.3=1 ;modulo combertidor en operacion canal 1
ADCIN 1,Voltemp ;Lee canal 0 y guardar en variable sensar
V1=VOLTEMP ;Este valor de lectura corresponde al complemento de la lectura del termistor
gosub logaritmo ;debido a la resistencia conectada en paralelo para linealizar la lectura.
j1=j
voltemp=1024-voltemp 'calcula el valor complementario "5000-Vi" 5000=Lectura*4.88 correspondiente a
V2=VOLTEMP 'la lectura en el termistor
gosub logaritmo 'como se usan 10 bits de combercion entonces valor maximo=2^10
j2=j
n=j2-j1+1315 'ln(Vs-Vt)-Vt+1315
b=3922 'para poder efectuar la operacion DIV32 la operacion de multiplicacion
n1=b*100 'debe realizarce empleando almenos una variable para poder asignar registros
inicial=div32 n 'internos de memoria, si se multiplican 2 ctes la operacion de mult es efectuada
n1=inicial 'durante la compilacion y no durante la ejecucion del programa.
degC=inicial-273

LCDOUT $FE,1,DEC V1," ",DEC V2," d ",dec n1 'LIMPIA DISPLAY
lcdout $FE,$C0,"ln ",dec j1," ",dec j2," ",dec n
pause 2000
LeeHumedad:
ADCON0.3=0 'canal AN0 operando
ADCIN 0,HumedadV 'Lee canal 1 y guardar en variable 5000/1024=4.88
;ADCON0.3=0 'apaga canal AN2
Humedad=(Humedadv*4+(Humedadv/100)*88)/10 'se puede emplear H=H*/1249 <--1249=4.88*256
humedad=(33*humedad)/100 'se calcula la humedad relativa
humedad=humedad min 90
ADCON0.5=1 'canal AN4 operando
adcin 4,tempv
ADCON0.5=0 'apaga canal
TEMP=(TEMPV*4+(TEMPV*88/100)) 'COMBIERTE VOLTAJE EN TEMPERATURA "Volt/10 [mV/ºC]*10 Ej: 12.5ºC=125
lcdout $FE,1,DEC degC," ",DEC HUMEDAD,"%"," ",dec temp/10,".",dec1 temp," C"
LCDOUT $FE,$C0,DEC humedadv," ",dec tempv
pause 3000
;rutina de encendido de ventilador
if (humedad>80)&(temp/10>26) then high Ventilador 'prende el ventilador
if (humedad<70)|(temp/10<24) then low ventilador 'apaga ventilador
goto thermistor
Logaritmo:
J=ncd voltemp max 1-1
j=(j*693)/10 + (((voltemp-dcd j)/10)*693)>>j 'el factor 693 es para combertir de base 2 a base e
return 'y multiplicado por 1000 para obtener digitos
'significativos y se divide entre 10 para limitar
'a tres digitos
'"En el segundo termino de la suma se dividio entre 10
'primero para limitar el resultado a decimos, debido a
'que el valor de la diferencia o residuo puede ser del
'orden de centenaas y si se multiplica por 639, la
'magnitud del resultado puede ser superior a 65534
'con lo que el resultado de la operacion nos daria un
'error."
'Temperature(..) 0 10 20 25 30 40 50 60
'Resistance(K..) 160.56 98.714 62.328 50.0 40.356 26.756 18.138 12.554
'Voltaje 3.8(778)3.3(676)2.7(553)2.5(512)2.2(455)2.2(455)1. 3(271)1(198)
'PARA OBTENER LOS VALORES EMPLEADOS EN LA TABLA SE EMPLEA LA ECUACION
' Rt = R25 exp(B/Tt-B/T25) --> Tt = 1/(1/B*ln(Rt/R25)+1/T25) ------(1
' B se obtiene de B = Tt*T25/(Tt-T25)*ln(R25/Rt) ------(2
'colocando una resistencia en paralelo con laa salida de la sseñal del termistor se logra linealizar
'la lectura y el voltaje a la salida seria el medido por la resistencia en paralelo
'Vs=Vt(Rs/(Rs+Rt)) despejando Rt=Rs(Vs-Vt)/Vt substituyendo en (1
'Tt = 1/(1/B*ln(Rs(Vs-Vt)/(R25*Vt))+1/T25)____ Hasiendo Rs=R25 ;Rs=50kohms
'Tt = 1/(1/B*ln((Vs-Vt)/Vt)+1/T25)-273.15____ Valor de temperatura en ºC
'T=B/(ln(Vss-Vt)-lnVt+K/298.15)-273=3922*100/((ln(Vss-Vt)-ln(Vt)+13.15)*100)
'Vss=5000/1024=4.88 => lectura*4.88=Vt
'Para obtener el logaritmo se obtiene el valor expoencial de la caracteristica del valor
'esto se logra empleando la instruccion NCD que nos debuelbe la posicion del bit mas significativo
'que corresponde al valor inicial de el logaritmo, se le resta un digito para ajustar la posicion
'ya que el comando debuelbe un valor comprendido entre 1 y 16 y debe ajustarce el valor de 0 a 15.
'ademas se emplea el operador MAX para limitar el valor de 1 a 16.
'Con este valor de entrada se obtiene la mantisa, que corresponde al valor del residuo,
'para esto se resta del valor inicial el exponente 2^n, este residuo se divide entre el mismo
'exponente 2^n, a esta mantisa se le suma la caracteristica que es el valor n, por ultimo se
'multiplica el valor obtenido por un factor de escala y por la constante para combertir el valor a
'logaritmo natural (.693).
'Ademas de que si se lineariza el thermistor se puede calcular el valor de la resistencia
'empleando la siguiente ecuacion Vt = Vs* Rs/(Rs+Rt) --> Rt = Rs*(Vs-Vt)/Vt ,Rs=R25, Vs=5 volts
'Con lo que la temperatura se puede calcular con Tt = 1/(1/B*ln(5-Vt/Vt)+1/298.15) [ºK]
;ObtieneHumedad:
' 10.. 15.. 20.. 25.. 30.. 35.. 40..
'20%RH 0.75 0.72 0.69 0.66 0.62 0.59 0.55
'30%RH 1.03 1.00 1.00 0.99 0.96 0.93 0.90
'40%RH 1.32 1.30 1.31 1.32 1.30 1.28 1.25
'50%RH 1.64 1.63 1.64 1.65 1.64 1.63 1.61
'60%RH 1.97 1.97 1.98 1.98 1.98 1.98 1.96
'70%RH 2.30 2.30 2.31 2.31 2.31 2.31 2.30
'80%RH 2.64 2.64 2.63 2.64 2.63 2.63 2.61
'90%RH 2.97 2.96 2.94 2.97 2.94 2.92 2.90
'realizando una analisis de regresion se obtienen los siguientes factores
'HR=3.28*VoltHum+.2 Para temperaturas de 10-40ºC
'por lo que se puede emplear la siguiente ecuacion para determinar la HR
'HR=328/100*VoltHum/100, estando VoltHum en centesimas de volt (0-330V)
'pero para poder efectuar el calculo se recurre a las siguientes operaciones
'33*VoltHum/100 , el valor de .2 es minimo y se desprecia sin que afecte el resultado