Saturday, November 28, 2015

Interface PIC12F683 with DHT22 (AM2302) sensor


The above topic link shows how to interface PIC12F683 with DHT11 sensor and this topic shows how to interface PIC12F683 with DHT22.
Like the DHT11, the DHT22 is a digital humidity and temperature sensor which has more benefits than DHT11 like: High precision and range.
Related topics:
Interface PIC12F683 with DHT11 sensor

DHT22 Digital Humidity and Temperature Sensor Proteus Simulation

Interfacing PIC12F683 with DHT22 (AM2302) circuit:

Circuit schematic diagram is shown below.
Internal oscillator is used at 8MHz and MCLR pin function is disabled.
Interfacing PIC12F683 with DHT22 AM2302 mikroc

Interfacing PIC12F683 with DHT22 (AM2302) mikroC Code:
2-WIRE SERIAL LCD LIBRARY MUST BE INSTALLED!!

// Interface PIC12F683 with DHT22 sensor
// Serial LCD library must be installed
// Written by: BENCHEROUDA Okba
// electronnote@gmail.com
// http://elecnote.blogspot.com/
// Internal oscillator used at 8MHz
// Use at your own risk !

  // LCD module connections
 sbit Serial_LCD_DATA at GP0_bit;
 sbit Serial_LCD_CLK at GP1_bit;
 sbit Serial_LCD_DATA_Direction at TRISIO0_bit;
 sbit Serial_LCD_CLK_Direction at TRISIO1_bit;
  // End LCD module connections

unsigned short  Check, T_byte1, T_byte2,
                RH_byte1, RH_byte2 ;
 unsigned Temp, RH, Sum ;
 //////////////////////////////
void StartSignal(){
 TRISIO.F2 = 0;    //Configure TRISIO.F2 as output
 GPIO.F2 = 0;    //GP2 sends 0 to the sensor
 delay_ms(18);
 GPIO.F2 = 1;    //GP2 sends 1 to the sensor
 delay_us(30);
 TRISIO.F2 = 1;  //Configure TRISIO.F2 as input
  }
 //////////////////////////////
 void CheckResponse(){
 Check = 0;
 delay_us(40);
 if (!GPIO.F2){
 delay_us(80);
 if (GPIO.F2)   Check = 1;   delay_us(40);}
 }
 //////////////////////////////
 char ReadData(){
 char i, j;
 for(j = 0; j < 8; j++){
 while(!GPIO.F2); //Wait until GP2 goes HIGH
 delay_us(30);
 if(!GPIO.F2)
       i&= ~(1 << (7 - j));  //Clear bit (7-b)
 else {i|= (1 << (7 - j));  //Set bit (7-b)
 while(GPIO.F2);  //Wait until GP2 goes LOW
 }
 }
 return i;
 }
 //////////////////////////////
 void main() {
  OSCCON = 0x71;       // Configure internal oscillator (8MHz)
  ANSEL = 0;           // All I/O pins are configured as digital
  ADCON0 = 0;         // Disable ADC module
  GPIO = 0;
  TRISIO = 0;
  Serial_Lcd_Init();                 // LCD display initialization
  Serial_Lcd_Cmd(_LCD_CURSOR_OFF);        // cursor off
  Serial_Lcd_Cmd(_LCD_CLEAR);             // clear LCD
  while(1){
  StartSignal();
  CheckResponse();
  if(Check){
  RH_byte1 = ReadData();
  RH_byte2 = ReadData();
  T_byte1 = ReadData();
  T_byte2 = ReadData();
  Sum = ReadData();
  if(Sum == ((RH_byte1+RH_byte2+T_byte1+T_byte2) & 0XFF)){
  Temp = T_byte1;
  Temp = (Temp << 8) | T_byte2;
  RH = RH_byte1;
  RH = (RH << 8) | RH_byte2;
  Serial_Lcd_Out(1, 6, "Temp:   . C");
  Serial_Lcd_Out(2, 2, "Humidity:   . %");
  if (Temp > 0X8000){
  Serial_Lcd_Out(1, 11, "-");
  Temp = Temp & 0X7FFF; }
  Serial_LCD_Chr(1, 12, 48 + ((Temp / 100) % 10));
  Serial_LCD_Chr(1, 13, 48 + ((Temp / 10) % 10));
  Serial_LCD_Chr(1, 15, 48 + (Temp % 10));
  Serial_LCD_Chr(2, 12, 48 + ((RH / 100) % 10));
  Serial_LCD_Chr(2, 13, 48 + ((RH / 10) % 10));
  Serial_LCD_Chr(2, 15, 48 + (RH % 10));
  }
  else{
  Serial_Lcd_Cmd(_LCD_CLEAR);
  Serial_Lcd_Out(1, 1, "Check sum error");}
    }
  else {
  Serial_Lcd_Out(1, 1, "  No response   ");
  Serial_Lcd_Out(2, 1, "from the sensor ");
  }
  delay_ms(1000);
  }
 }