説明

本文では、ラズパイとDHT11温湿度センサーを使って、周囲環境の温湿度データを獲得します。DHT11は湿度測定、温度測定、通信機能を搭載した温度湿度センサです。 また、出力値は校正済みで無調整で使用することが可能です。センサの構成は温度測定にはNTCサーミスタ、湿度測定に高分子膜湿度センサが使用さ れております。このセンサは相対湿度の変化に応じて高分子膜に含まれる水分の量が変化 し、これにより誘電率が変化することから相対湿度を測定します。DHT11はこれらのセン サを専用ASICにてデジタル変換を行い1線式シリアル信号を出力します。ユーザーはマイ コンなどで、出力データを読み取るだけで簡単に湿度と温度の測定が可能です。従来の高分子膜湿度センサと違い、駆動に必要な外部回路の設計及び回路実装、校正か ら開放されます。測定に必要な回路が全て内蔵され、小スペース実装する事が可能です。 データ出力はオープンドレイン出力のため、20メートルまで伸ばす事が可能です。

DSC_5467

DHT11タイミング ダイヤグラム

1)DATAフレーム

DTH11はスタート信号を出力し続いて40ビット(5バイト)構成の同期クロックが含まれたシリアルデータを出力します。データ出力時間は、おお よそ4m/Sです。サンプリング周期は1秒以上で、それより短い間隔でデータ要求しても、 データが出ない場合があります
。第1、2バイトは温度値として、第3、4バイトは湿度値として、表示します。最後の1バイトはチェックサムとして、使用しますので、データが問題ない場合、第1、2バイトと第3、4バイトの合計は第5バイトになります。

e1

2)ハンドシェイク

測定を開始するには、マイコン側から、データ線を 18m秒以上「L」にし、その後「H」にします。

e2

センサは、データ転送の準備ができると、データ線を 80μ秒の間「L」にし、続いて80μ秒の間「H」にします。 この後、センサは40ビットのデータを送ってきます。

3)データビットの転送

センサは、データ転送開始の合図のあと、40ビット (8ビット×5バイト)のデータを送ってきます。データは、上位ビットを先に送信します。各データ ビットは、データビットの開始を示す50μ秒の「L」の あと、「0」のデータなら26~28μ秒の「H」、「1」の データなら70μ秒の「H」が送信されます。
40ビットのデータを送り終わると、センサはデータ 転送完了の合図として、50μ秒の「L」を送ってきます。

データ ‘0’:

e3

データ ‘1’:

e4

必要なパーツ

PI
Pi3ボード x1
EASM100600
DS18B20 x1
EACW100500
ジャンプワイヤー x3

ハードウェア

DHT11のVCCとラズパイの3.3V、DHT11のGNDとラズパイのGND、DHT11のDATAとラズパイのGPIO14(BCM)を接続して下さい。 Raspberry PiのGPIOピンの基礎知識はこちら~

Untitled Sketch_dht11

ソフトウエア

Python言語とC言語2種の言語のプログラム編集方法を紹介します。

1)Python言語

nanoエディターを使って、dht11-test.pyと言うファイルを新規作成します。

sudo nano dht11-test.py

dht11-test.pyファイルに下記の内容をコーピーして下さい:

# _____ _____ _____ __ __ _____ _____ 
#|     |   __|     |  |  |     |     |
#|  |  |__   |  |  |_   _|  |  |  |  |
#|_____|_____|_____| |_| |_____|_____|
#
# Use Raspberry Pi to get temperature/humidity from DHT11 sensor
#  
import time
import dht11
import RPi.GPIO as GPIO

#define GPIO 14 as DHT11 data pin
Temp_sensor=14
def main():
  # Main program block
  GPIO.setwarnings(False)
  GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
  # Initialise display
#  lcd_init()
  instance = dht11.DHT11(pin = Temp_sensor)

  while True:
        #get DHT11 sensor value
        result = instance.read()
  print"Temperature = ",result.temperature,"C"," Humidity = ",result.humidity,"%"
  time.sleep(1)

if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
#  finally:
#    lcd_byte(0x01, LCD_CMD)

Pythonコードを作動のため、dht11.pyと言うファイルも必要です。下記のコマンドを動作して、dht11.pyファイルをダウンロードして下さい。必ずdht11-test.pyとdht11.pyを同じパスに置いて下さい。

sudo sudo wget http://osoyoo.com/driver/dht11.py

下記のコマンドを動作して、Pythonプログラムを作動する

sudo python ./dht11-test.p

2017-03-22-063517_1824x984_scrot

上記のコマンドを実行したら、温湿度データがターミナルに表示します。時々0と出ったん、何故?ラズパイはDHT11の信号を読み取れる時、マイクロ秒のリアルタイム・タイミングが必要ですが、ラズパイでのOS、Raspbianはリアルタイムシステムではないので、正しくチェックできない時は、データが紛失しました。

2)C言語

A.ラズパイでC言語を使用の場合、GPIOライブラリのインストールが必要です,下記のコマンドを動作して、インストールできます:

sudo git clone git://git.drogon.net/wiringPi
sudo cd wiringPi
sudo ./build

B.下記のコマンドを動作して、nanoエディターを使用して、dht11-test.cファイルを新規作成します。

sudo nano dht11-test.c

dht11-test.cファイルに下記の内容をコーピーして下さい。

/*
 *  dht11.c:
 *  Simple test program to test the wiringPi functions
 *  DHT11 test
 */

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAXTIMINGS  85
#define DHTPIN    15
int dht11_dat[5] = { 0, 0, 0, 0, 0 };

void read_dht11_dat()
{
  uint8_t laststate = HIGH;
  uint8_t counter   = 0;
  uint8_t j   = 0, i;
  float f; /* fahrenheit */

  dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;

  /* pull pin down for 18 milliseconds */
  pinMode( DHTPIN, OUTPUT );
  digitalWrite( DHTPIN, LOW );
  delay( 18 );
  /* then pull it up for 40 microseconds */
  digitalWrite( DHTPIN, HIGH );
  delayMicroseconds( 40 );
  /* prepare to read the pin */
  pinMode( DHTPIN, INPUT );

  /* detect change and read data */
  for ( i = 0; i < MAXTIMINGS; i++ )
  {
    counter = 0;
    while ( digitalRead( DHTPIN ) == laststate )
    {
      counter++;
      delayMicroseconds( 1 );
      if ( counter == 255 )
      {
        break;
      }
    }
    laststate = digitalRead( DHTPIN );

    if ( counter == 255 )
      break;

    /* ignore first 3 transitions */
    if ( (i >= 4) && (i % 2 == 0) )
    {
      /* shove each bit into the storage bytes */
      dht11_dat[j / 8] <<= 1;
      if ( counter > 16 )
        dht11_dat[j / 8] |= 1;
      j++;
    }
  }

  /*
   * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
   * print it out if data is good
   */
  if ( (j >= 40) &&
       (dht11_dat[4] == ( (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF) ) )
  {
    f = dht11_dat[2] * 9. / 5. + 32;
    printf( "Humidity = %d.%d %% Temperature = %d.%d *C (%.1f *F)\n",
      dht11_dat[0], dht11_dat[1], dht11_dat[2], dht11_dat[3], f );
  }else  {
    printf( "Data not good, skip\n" );
  }
}

int main( void )
{
  printf( "Raspberry Pi wiringPi DHT11 Temperature test program\n" );

  if ( wiringPiSetup() == -1 )
    exit( 1 );

  while ( 1 )
  {
    read_dht11_dat();
    delay( 1000 ); /* wait 1sec to refresh */
  }

  return(0);
}

C.下記のコマンドを作動して、プログラムをコンパイルして、プログラムを動作して下さい。

sudo gcc  -o dht11-test dht11-test.c  -lwiringPi
sudo  ./dht11-test

2017-03-22-063018_1824x984_scrot

下記のコマンドを作動したら、上記のすべてのコードをダウンロードできます:

sudo wget http://osoyoo.com/wp-content/uploads/2017/03/dht11_code.rar

C言語は高級プログラム言語のため、直接にラズパイのGPIOを制御しますので、データ紛失のことは少ないと発見できます。