Hello,
Here is my code to read temperature and humidity from a DHT11 sensor. It has also the SLEEP functionality.
I tried to make it as simple and clear as possible
Code:' ====== PIC 16F690 FUSES ========================================================================== ' External oscillator 8MHz @ __config _FCMEN_OFF &_IESO_OFF &_CPD_OFF &_WDT_OFF &_HS_OSC &_BOR_OFF &_CP_OFF &_PWRTE_OFF &_MCLRE_OFF ' ====== REGISTERS ================================================================================= ' Registers 76543210 OPTION_REG = %10000000 ' PORT A&B Pull-Ups and Prescaler (def.: %11111111) OSCCON = %00000000 ' External (def.: %01101000) WDTCON = %00001001 ' Enable WatchDog (the REGISTER, not the fuse) for SLEEP ' ====== DEFINES =================================================================================== DEFINE OSC 8 ' don't forget the external oscillator ' ====== VARIABLES ================================================================================= DHT_Data VAR BYTE [32] ' hold bitwise humidity and temperature data HUMIDITY VAR BYTE ' holds humidity value TEMPERATURE VAR BYTE ' holds temperature value x VAR BYTE ' a counter SerialData VAR PORTA.0 ' To display data through serial comm DHT_Port VAR PORTB.7 ' PIC's port to DHT11's "OUT" pin DHT_PWR VAR PORTC.7 ' power supply for DHT11's module - "+" pin (2mA) ' ====== INTIALIZE ================================================================================= HIGH SerialData 'set port High to avoid sending serial "garbage" ' ====== PROGRAM START ============================================================================= MAIN: ' Power-up DHT11 HIGH DHT_PWR ' switch ON DHT11 sensor HIGH DHT_Port ' make the PIC's port an Output PAUSE 1000 ' let DHT11 settle ' Send Start Signal to DHT11 DHT_Port = 0 : PAUSE 20 ' set LOW at least 18ms to let DHT11 detect the signal DHT_Port = 1 : PAUSEUS 30 ' set 20-40µs HIGH and wait for DHT11's response ' DHT11 responds to MCU now in going 80µs LOW and 80µs HIGH before sending data WHILE DHT_Port = 0 : WEND ' DHT11 goes LOW - just wait until (~80µs) it goes HIGH ' Once gone HIGH, DHT11 waits 80µs and then starts to send data ' Receive 32 data bits (out of 40 - last 8bits are checksum - not used) FOR x = 31 TO 0 STEP -1 PULSIN DHT_Port, 1, DHT_Data[x] NEXT x ' Switch OFF DHT11 sensor (not mandatory but gives better RH results) LOW DHT_PWR ' Convert pulses length into binary values (26-28µs = "0", 70µs = "1") FOR x = 31 TO 0 STEP -1 IF DHT_Data[x] > 10 THEN ' 50µs (somewhere between 28 and 70µs) DHT_Data[x] = 1 ' is it greater than 50µs so it's a "1" ELSE DHT_Data[x] = 0 ' is it smaller than 50µs so it's a "0" ENDIF NEXT x ' Convert bits to variables HUMIDITY.7 = DHT_Data[31] HUMIDITY.6 = DHT_Data[30] HUMIDITY.5 = DHT_Data[29] HUMIDITY.4 = DHT_Data[28] HUMIDITY.3 = DHT_Data[27] HUMIDITY.2 = DHT_Data[26] HUMIDITY.1 = DHT_Data[25] HUMIDITY.0 = DHT_Data[24] TEMPERATURE.7 = DHT_Data[15] TEMPERATURE.6 = DHT_Data[14] TEMPERATURE.5 = DHT_Data[13] TEMPERATURE.4 = DHT_Data[12] TEMPERATURE.3 = DHT_Data[11] TEMPERATURE.2 = DHT_Data[10] TEMPERATURE.1 = DHT_Data[9] TEMPERATURE.0 = DHT_Data[8] ' Display temperature and humidity SEROUT2 SerialData,84,["T: ", DEC TEMPERATURE, "C RH: ", DEC HUMIDITY, "%", 13,10] '9600,8,N,1 ' Now, goto low power for 1 minute SLEEP 60 ' in seconds - wake-up every minute GOTO MAIN '======= CIRCUITRY ================================================================================= ' [PIC] 'PORTA.0[19] ICSPDAT / Serial data out (PICkit2's UART tool RX pin) 'PORTA.1[18] ICSPCLK 'PORTA.2[17] 'PORTA.3[04] MCLR 'PORTA.4[03] OSC2 - 8Mhz Xtal 'PORTA.5[02] OSC1 - 8Mhz Xtal ' 'PORTB.4[13] 'PORTB.5[12] 'PORTB.6[11] 'PORTB.7[10] DHT11's "OUT" pin with 10k pull-up resistor ' 'PORTC.0[16] 'PORTC.1[15] 'PORTC.2[14] 'PORTC.3[07] 'PORTC.4[06] 'PORTC.5[05] 'PORTC.6[08] 'PORTC.7[09] DHT11's module power supply pin "+"





Bookmarks