Monday, January 25, 2016

Interface DHT22 with PIC (with mikroBasic code)


There are many topics on this blog talking about the interfacing of DHT22 sensor with different types of PIC microcontrollers, MikroC codes are included in all the previous topics.
In this topic a mikroBasic pro for pic is used to interface this sensor with PIC. Circuit schematic and code are below.
Interface PIC16F877A with DHT22 (AM2302) circuit:
Interface PIC16F877A with DHT22 (AM2302) mikroBasic

Interface PIC16F877A with DHT22 (AM2302) mikroBasic code:

program MyProject

' Declarations section
' Lcd module connections
dim
  LCD_RS as sbit at RB0_bit
  LCD_EN as sbit at RB1_bit
  LCD_D4 as sbit at RB2_bit
  LCD_D5 as sbit at RB3_bit
  LCD_D6 as sbit at RB4_bit
  LCD_D7 as sbit at RB5_bit

  LCD_RS_Direction as sbit at TRISB0_bit
  LCD_EN_Direction as sbit at TRISB1_bit
  LCD_D4_Direction as sbit at TRISB2_bit
  LCD_D5_Direction as sbit at TRISB3_bit
  LCD_D6_Direction as sbit at TRISB4_bit
  LCD_D7_Direction as sbit at TRISB5_bit
' End Lcd module connections

 dim Check, T_byte1, T_byte2, RH_byte1, RH_byte2, Ch as char
 dim Temp, RH, Sum as word
 '//////////////////////////////
 sub procedure StartSignal
 TRISC.0 = 0 '    //Configure RC0 as output
 PORTC.0 = 0 '    //RC0 sends 0 to the sensor
 delay_ms(18) '
 PORTC.0 = 1 '    //RC0 sends 1 to the sensor
 delay_us(30) '
 TRISC.0 = 1 '    //Configure RC0 as input
 end sub
 '//////////////////////////////
 sub procedure CheckResponse
 Check = 0
 delay_us(40)
 if (PORTC.0 = 0)then
 delay_us(80)
 end if
 if (PORTC.0 = 1) then
 Check = 1
 delay_us(40)
 end if
 end sub
 '//////////////////////////////
sub function ReadData () as byte
 dim i, j as byte
 for j = 0 to 7
 while(PORTC.0 = 0)'; //Wait until PORTC.F0 goes HIGH
 wend
 delay_us(30)
 if(PORTC.0 = 0) then
     i = i AND (NOT(1<<(7 - j))) ' i&= ~(1<<(7 - j));  //Clear bit (7-j)
 else
     i = i OR (1 << (7 - j)) '{i|= (1 << (7 - j));  //Set bit (7-j)
 while(PORTC.0 = 1) ';}  //Wait until PORTC.F0 goes LOW
 wend
 end if
 next j
 result = i
end sub
 '//////////////////////////////
main:
'   Main program
 Lcd_Init()
 Lcd_Cmd(_LCD_CURSOR_OFF) '        // cursor off
 Lcd_Cmd(_LCD_CLEAR)'             // clear LCD
 while (TRUE)
  StartSignal ()
  CheckResponse ()
  if(Check = 1)  then
  RH_byte1 = ReadData()
  RH_byte2 = ReadData()
  T_byte1 = ReadData()
  T_byte2 = ReadData()
  Sum = ReadData()
  if(Sum = ((RH_byte1+RH_byte2+T_byte1+T_byte2) AND 0XFF))then
  Temp = T_byte1
  Temp = (Temp << 8) OR T_byte2
  RH = RH_byte1
  RH = (RH << 8) OR RH_byte2
  Lcd_Out(1, 6, "Temp:   . C")
  Lcd_Out(2, 2, "Humidity:   . %")
  if (Temp > 0X8000)then
  Lcd_Out(1, 11, "-")
  Temp = Temp AND 0X7FFF
  end if
  LCD_Chr(1, 12, 48 + ((Temp / 100) mod 10))
  LCD_Chr(1, 13, 48 + ((Temp / 10) mod 10))
  LCD_Chr(1, 15, 48 + (Temp mod 10))
  LCD_Chr(2, 12, 48 + ((RH / 100) mod 10))
  LCD_Chr(2, 13, 48 + ((RH / 10) mod 10))
  LCD_Chr(2, 15, 48 + (RH mod 10))
  else
  Lcd_Cmd(_LCD_CURSOR_OFF)'        // cursor off
  Lcd_Cmd(_LCD_CLEAR)'             // clear LCD
  Lcd_Out(1, 1, "Check sum error")
  end if
  else
  Lcd_Out(1, 3, "No response")
  Lcd_Out(2, 1, "from the sensor")
  end if
  delay_ms(1000)
 wend
end.