Sensor AM2302 de temperatura y humedad

Buenas tardes. Tengo un programa de sensado de temperatura con el sensor LM35 y ya hecho en microcode estudio, abajo el código.
A
hora quiero implementar el sensor AM2302 de temperatura y humedad pero no encuentro la forma de implementarlo.
¿M
e podrían ayudar a incorporar el sensor a microcode estudio?
Código:
; DEFINICIÓN DEL PROGRAMA
INCLUDE "MODEDEFS.BAS" ; LIBRERIA PARA OCUPAR LA COMUNICACIÓN SERIAL
define LOADER_USED 1
DEFINE OSC 20 ;DEFINIR EL OSCILADOR EN 20 MHz (HS)
DEFINE ADC_BIST 8 ;DEFINE LA RESOLUCION  DEL ADC
DEFINE ADC_CLOCK 3  ;1-LP 2-XT 3-HS
DEFINE ADC_SAMPLEUS 50 ;TIEMPO QUE TARDA LA SEÑAL EN CONVERTIR LA SEÑAL ANALOGICA A DIGITAL
DEFINE LCD_DREG PORTC
DEFINE LCD_BITS 4
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

TRISA=255 ; DECLARAR TODO EL REGISTRO A COMO ENTRADA
TRISB=0 ; DECLARAR TODO EL REGISTRO B COMO SALIDA
TRISC=%00001111 ; DECLARAR RCO A RC3 COMO ENTRADA Y RC4 A RC7 COMO SALIDA

ADCON1=14  ; DECLARAR QUE LAS ENTRADA ra0 son analogico

SENSAR VAR WORD
DIGITAL VAR WORD
BAJO VAR WORD
ESTABLE VAR WORD
ESTABLE1 VAR WORD
ALTA    VAR WORD
     
BAJO=30
ESTABLE=36
ESTABLE1=38
ALTA=40

SENSAR=0
DIGITAL=0

PORTA=0
PORTB=0
PORTC=0

DATOS:

IF PORTA.2==1 then
   LCDOUT $FE,1  
   LCDOUT $FE,2,"PROG TEM"
   LCDOUT $FE,$C0,"ESTABLE=",#ESTABLE,%11011111, "C"
   PAUSE 500
if porta.3==1 then
   ESTABLE=ESTABLE+1
   ESTABLE=ESTABLE MIN 39
      endif
     
if porta.4==1 then
   ESTABLE=ESTABLE-1
    ESTABLE=ESTABLE  MAX 29
 
   endif
   endif
 
if porta.2==0 then
   goto inicio
  endif
goto datos


INICIO:

ADCIN 0,DIGITAL


SENSAR=195* DIGITAL
SENSAR=SENSAR/100

IF SENSAR>ESTABLE AND SENSAR<ESTABLE1 THEN
PORTB=%00000000
SEROUT PORTC.6,T9600,[#ESTABLE]
LCDOUT $FE,1  
LCDOUT $FE,2,"TEM CORRECTA"
LCDOUT $FE,$C0,"ESTABLE=",#SENSAR,%11011111, "C"
PAUSE 500

else


IF SENSAR<BAJO THEN
PORTB=%10000000
PAUSE 500
LCDOUT $FE,1   'LIMPIAR PANTALLA '
LCDOUT $FE,2, "TEM BAJA = ",#SENSAR,%11011111, "C"  'POCICION DE LA LINEA 1'
LCDOUT $FE,$C0, "ACT.CALEFACTOR" 'POCICION DE LA 2 LINEA'
PAUSE 500

else

IF SENSAR>ALTA THEN
PORTB=%00000100
PAUSE 500
LCDOUT $FE,1   'LIMPIAR PANTALLA '
LCDOUT $FE,2, " TEM ALTA= ",#SENSAR,%11011111, "C"  'POCICION DE LA LINEA 1'
LCDOUT $FE,$C0, " ACT.VENTILADOR " 'POCICION DE LA 2 LINEA'
PAUSE 500
ENDIF
ENDIF
ENDIF

GOTO datos
 

D@rkbytes

Moderador
En la hoja de datos está toda la información que necesitas.
 

Adjuntos

  • AM2302 Or DHT22 Datasheet.pdf
    406.6 KB · Visitas: 8
Gracias, ya lo revisé pero la verdad no se como se programa, he buscado información y he encontrado que se hace con éste comando :

Código:
OWIN OWIN PORTC. 0,0,[temperature\2, SKIP 4, count_remain, count_per_c]
OWOUT PORTC. 0,1,[$cc,$be]

Pero no se que es lo que se tiene que colocar y como declarar las variables.
 

D@rkbytes

Moderador
Lo que hace la instrucción OWIN se encuentra en la ayuda de MicroCode Studio.

Hace tiempo hice un programa pero en lenguaje C
Por aquí alguien lo hizo en PIC Basic: Solved! DHT22, AM2302 and PIC18F2320
 

Adjuntos

  • OWIN.pdf
    311.5 KB · Visitas: 6
  • OWOUT.pdf
    308.5 KB · Visitas: 5
  • PULSIN.pdf
    311.6 KB · Visitas: 2
  • PULSOUT.pdf
    310.6 KB · Visitas: 2
Que tal muy buenas tardes.

Ya probé el programa de la liga que me dejaste,pero hay un problema y no lo encuentro, lo ocupo con un pic16f876a
a la hora de compilarlo se queda en la primera linea de:

LCDout $FE,$01,"DHT-22"
LCDout $FE,$C0,"testing..."

de ahí ya no pasa

ahora tengo errores y es en esta:

INTCON2.7=0 'RBPU =0 , TURN ON PORTB PULL-UPS

dejo el codigo que estoy ocupando


Código:
DEFINE OSC 20 ;DEFINIR EL OSCILADOR EN 20 MHz (HS)
DEFINE LCD_DREG PORTC
DEFINE LCD_BITS 4
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
              
ADCON0=0
ADCON1=00001111                  'All digital
CMCON=7                          'Comparators OFF
INTCON2.7=0                      'RBPU =0 , TURN ON PORTB PULL-UPS

TRISA=%00000000
TRISB=%00001111

PORTA=0
PORTB=0

humread     var word             '16-bit var to store humidity
tmpread     var word             '16-bit var to store temperature
checksum    var BYTE             '8-bit var to store checksum
x           var byte             'general var
pulse       var byte [81]        'store pulse var
p           var bit [81]         'store pulse var

led         var PORTA.0
dht_port    var PORTA.3

clear
high dht_port
high led

 ;---------- main program -------------
high led
LCDout $FE,$01,"DHT-22"
LCDout $FE,$C0,"testing..."
pause 2000

start:
;---- check_DHT22 ---- 
;-== send StartSignal ==-
TRISA.3 = 0                      'Data port is output
high dht_port
pauseus 10                       'send 10uS high pulse
low dht_port                     
pause 1                          'send 1mS high pulse
high dht_port
;-== wait response from Sensor ==-
TRISA.3 = 1                      'Data port is input
while dht_port=1:wend            'wait for low from DHT
while dht_port=0:wend            'wait for high FROM DHT
high led
;-== Grab 40bits data from DHT22 ==-
pulsin PORTA.3,1,pulse(1)        'Humidity HighBit data
pulsin PORTA.3,1,pulse(2)
pulsin PORTA.3,1,pulse(3)
pulsin PORTA.3,1,pulse(4)
pulsin DHT_port,1,pulse(5)
pulsin DHT_port,1,pulse(6)
pulsin DHT_port,1,pulse(7)
pulsin DHT_port,1,pulse(8)
pulsin DHT_port,1,pulse(9)
pulsin DHT_port,1,pulse(10)
pulsin DHT_port,1,pulse(11)
pulsin DHT_port,1,pulse(12)
pulsin DHT_port,1,pulse(13)
pulsin DHT_port,1,pulse(14)
pulsin DHT_port,1,pulse(15)
pulsin DHT_port,1,pulse(16)      'Humidity LowBit data
pulsin DHT_port,1,pulse(17)      'Temperature HighBit data (1 means below 0 degree!)
pulsin DHT_port,1,pulse(18)
pulsin DHT_port,1,pulse(19)
pulsin DHT_port,1,pulse(20)
pulsin DHT_port,1,pulse(21)
pulsin DHT_port,1,pulse(22)
pulsin DHT_port,1,pulse(23)
pulsin DHT_port,1,pulse(24)
pulsin DHT_port,1,pulse(25)
pulsin DHT_port,1,pulse(26)
pulsin DHT_port,1,pulse(27)
pulsin DHT_port,1,pulse(28)
pulsin DHT_port,1,pulse(29)
pulsin DHT_port,1,pulse(30)
pulsin DHT_port,1,pulse(31)
pulsin DHT_port,1,pulse(32)      'Temperature LowBit data
;pulsin DHT_port,1,pulse(33)     'Checksum HighBit
;pulsin DHT_port,1,pulse(34)
;pulsin DHT_port,1,pulse(35)
;pulsin DHT_port,1,pulse(36)
;pulsin DHT_port,1,pulse(37)
;pulsin DHT_port,1,pulse(38)
;pulsin DHT_port,1,pulse(39)
;pulsin DHT_port,1,pulse(40)     'Checksum LowBit
;-== convert to '0' & '1' ==-
for x=1 to 40
if pulse(x)>=2 and pulse(x)<=4 then p(x)=0 'if pulsewidth between 20 and 40uS then read as '0'
if pulse(x)>=6 and pulse(x)<=8 then p(x)=1 'if pulsewidth between 60 and 80uS then read as '1'
next x
;-== convert bin to dec ==-
humread=32768*p(1)+16384*p(2)+8192*p(3)+4096*p(4)+2048*p(5)+1024*p(6)+512*p(7)+256*p(8)+128*p(9)+64*p(10)+32*p(11)+16*p(12)+8*p(13)+4*p(14)+2*p(15)+1*p(16)
tmpread=16384*p(18)+8192*p(19)+4096*p(20)+2048*p(21)+1024*p(22)+512*p(23)+256*p(24)+128*p(25)+64*p(26)+32*p(27)+16*p(28)+8*p(29)+4*p(30)+2*p(31)+1*p(32)
;checksum=128*p(33)+64*p(34)+32*p(35)+16*p(36)+8*p(37)+4*p(38)+2*p(39)+1*p(40)
;-== show real values ==-
LCDout $FE,$01,"RHdata  Tdata"
LCDout $FE,$C0,dec humread/10,".",dec humread//10,"%   ",dec tmpread/10,".",dec tmpread//10,"oC" 'print integral part only
low led
pause 2000                       'give some time to DHT to stabilize!....
goto start
END
 

D@rkbytes

Moderador
ahora tengo errores y es en esta:

INTCON2.7=0 'RBPU =0 , TURN ON PORTB PULL-UPS
El bit 7 del registro OPTION_REG en el PIC16F876A es el activa las resistencias pull up cuando su estado es 0.
Entonces debes usar: OPTION_REG.7 = 0

Para este tipo de consultas debes leer la hoja de datos.
 
Arriba