Thursday, February 26, 2015

DHT11 Sensor Interfacing with Raspberry Pi


  Believe me guys i struggled a lot to Interface DHT11 sensor with the Raspberry Pi for my smart home. As i have already opted Pi4J for JAVA programming it was hard to interface with Pi as Pi4J doesn't support one wire protocol. I did lot of research but nothing worked out. Finally i gave a try to python and it worked perfectly. But  as my complete firmware is using JAVA. I opted a way that i will interface it using python but will be executed from JAVA.


Python Code:

import RPi.GPIO as GPIO
import time

def bin2dec(string_num):
    return str(int(string_num, 2))

data = []

GPIO.setmode(GPIO.BCM)

GPIO.setup(4,GPIO.OUT)
GPIO.output(4,GPIO.HIGH)
time.sleep(0.025)
GPIO.output(4,GPIO.LOW)
time.sleep(0.02)

GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)

for i in range(0,500):
    data.append(GPIO.input(4))

bit_count = 0
tmp = 0
count = 0
HumidityBit = ""
TemperatureBit = ""
crc = ""

try:
 while data[count] == 1:
  tmp = 1
  count = count + 1

 for i in range(0, 32):
  bit_count = 0

  while data[count] == 0:
   tmp = 1
   count = count + 1

  while data[count] == 1:
   bit_count = bit_count + 1
   count = count + 1

  if bit_count > 3:
   if i>=0 and i<8:
    HumidityBit = HumidityBit + "1"
   if i>=16 and i<24:
    TemperatureBit = TemperatureBit + "1"
  else:
   if i>=0 and i<8:
    HumidityBit = HumidityBit + "0"
   if i>=16 and i<24:
    TemperatureBit = TemperatureBit + "0"

except:
 print "ERR_RANGE"
 exit(0)

try:
 for i in range(0, 8):
  bit_count = 0

  while data[count] == 0:
   tmp = 1
   count = count + 1

  while data[count] == 1:
   bit_count = bit_count + 1
   count = count + 1

  if bit_count > 3:
   crc = crc + "1"
  else:
   crc = crc + "0"
except:
 print "ERR_RANGE"
 exit(0)

Humidity = bin2dec(HumidityBit)
Temperature = bin2dec(TemperatureBit)

if int(Humidity) + int(Temperature) - int(bin2dec(crc)) == 0:
 print "Humidity:"+ Humidity +"%"
 print "Temperature:"+ Temperature +"C"
else:
 print "ERR_CRC"

JAVA Code:

 try {
   Runtime run = Runtime.getRuntime();
   Process proc= run.exec("sudo python my.py");
   BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));

   // read the output from the command
         String s = null;
         String sOut = "";
         while ((s = stdInput.readLine()) != null) {
       sOut=sOut+s;
   }
         if(!(sOut.contains("ERR_RANGE")||sOut.contains("ERR_CRC")))
         {
          humidity=Double.parseDouble(sOut.substring(0,sOut.indexOf("*@**")));
          temperature=Double.parseDouble(sOut.substring(sOut.indexOf("*@**")+4));
          
         }
         else
          System.out.println("DHT11 Error");
          
   // read any errors from the attempted comman
          Thread.sleep(100000);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }