*

温度(湿度)センサを使ってみた(2)-RaspberryPi/pigpioでDHT11

公開日: : C++, C言語, pigpio, RaspberryPi, 開発

どもです。
前回は、DHT11をAdrudinoにつないで温度/湿度を測定してみました。
そこで今回は、Arduinoの代わりにRaspberryPiで同様に温度/湿度を測定してみました。

1.開発環境

本エントリでは、以下の環境で開発・実験を行いました。
PC本体:
OS:Windows10 Pro (バージョン:1903)
CPU:Intel Core i7-8700
メモリ:16GB

開発環境:
Eclipse Version:2019-06(4.12.0)
Build id:20190614-1200
RaspberryPi クロスコンパイラ:raspberry-gcc8.3.0

RaspberryPi:
ライブラリ:pigpio -v 71

なお、クロスコンパイラ/クロス環境の構築手順については、こちら(http://country-programmer.dfkp.info/2018/05/eclipse_crosscompile/)を参照して下さい。
コンパイラのバージョンは少し古いですが、基本的な手順は変わっていません。

2.配線

まず、ブレッドボード上の配線です。
配線図は、下記の通りです。
temp_humidity_sensor_002_dht11
基本的には、前回と同じです。
ただし、RaspberryPiでは波形のノイズの解消のための、コンデンサを追加しています。
使用したコンデンサは、積層セラミックコンデンサ(0.1μF)です。

3.実装

今回の実装では、Arduinoの際に使用したライブラリのコード、およびDHT11のデータシートを元に作成しています。
コードは下記の通りです。
まずmain()です。

次に、CDHT11クラスのデータ読み出し処理です。
なお、全部を載せると結構な量になってしまいますので、重要と思われる部分のみ抜粋します。

4.解説

上記コード、特にデータの読み出しを行っているCDHT11::readSequence()について解説します。

4.1.開始信号の送信

RaspberryPiでDATAピンの電位を操作します。
DHT11では、データの送信開始を要求するために、以下のようにDATAピンの電位を変化させます。
temp_humidity_sensor_002_start_sending_signal
「Step1」~「Step2」のコードが該当します。
なお、RaspberryPiのGPIOのプルアップ/ダウンの変更は、入力/出力の設定後に行う必要があるようです。
プルアップ/ダウンを変更させてから入力/出力を変更した場合、プルアップ/ダウンの変更が期待通りの設定になりません。
処理の実行手順に注意する必要があります。

4.2.DHT11の開始待ち

DATAピンの電位を一定時間LOWに維持すると、次にDHT11がDATAの電位のHIGH/LOWを動作させます。
その際の仕様は、下記の通りです。
temp_humidity_sensor_002_dht11_sending_signal
これを検知するのが、「Step3」の処理に該当します。

4.3.温度/湿度データの読み出し

DHT11では、DATAピンの電位がHIGHになっている時間が、ビットの0/1に対応しています。
データシートによれば、HIGHで保持されている時間とビットの0/1の対応は下記の通りです。
temp_humidity_sensor_002_data_timing_diagram
ここに記載されているHIGHからLOWへの変化を割り込みで検知、時間を計測して0/1を判定する、という方法もアリかもしれません。
しかしここでは、違う方法を採用します。
(ていうか、Arduino向けライブラリでは違う方法を採用しているので、それに倣います。)

即ち、LOW/HIGHに保持されていた時間を保持しておき、その長さを比較することでビットの0/1を判定する、という方法です。
この「LOW/HIGHに保持されていた時間を保持」しているのがStep4、「長さを比較することでビットの0/1を判定」しているのが「Step5」となります。

4.4.整合性確認

最後に整合性の確認です。
DHT11は、全部で5バイトのデータを送信します。
受信したビットデータの前半4バイトの総和と5バイト目の値が一致していれば、受信したデータは正常と判断できます。
一致しない場合には、不正なデータと判断します。
なお、総和は16ビットのデータになる可能性がありますが、上位8ビットのデータは無視します。

4.5.測定結果

作成したアプリケーションの実行すると、下記のようになります。
temp_humidity_sensor_002_running
結果は…前回と同様ですね。

5.まとめ

前回に引き続き、今回もDHT11を使ってみました。
ネットで調べてみると、RaspberryPi上ではpythonで動かした例はたくさん見つかります。
しかし、C言語またはC++とpigpioで動作させた例は殆ど見つかりません。
今回のエントリで、C言語またはC++とpigpioでDHT11を操作/動作させる際に困っているヒトの一助にでもなれば、うれしいなぁ…。

ではっ!

追記

DHT11を使用するためのソースコードをGitHubで公開しています。
ArduinoとRaspberryPiの両方を公開しているので、必要に応じて、それぞれ参照してみてください。

関連記事

Arduino_Logo

Arduino nano(中華版)をセットアップしてみた

どもです。 突然ですが、「Arduino nano」互換(なのか?)の中華ボードを手に入れました。

記事を読む

RasPi_Qt

QtでRaspberryPi/GUI開発(10)-SPI通信をしてみた(その2)

どもです。 えー。 「Qtで…」とか書いておきながら、今回もやっぱりQtは出てきません。

記事を読む

eclipse_oxygen

Eclipse/CrossCompile環境でプロジェクトをクリーンできない

どもです。 今回は、Eclipseでクロスコンパイル環境を作成した場合、を実行すると「指定されたフ

記事を読む

MindStormControl_SprachScreen

EV3開発サポートツール(1)-C#のユーザーコントロール開発

どもです。 突然ですが、今回はC#に関するエントリになります。 具体的には、C#/WPFで、独自

記事を読む

cygwin_my_image

cygwinでstartコマンド

どもです。 このエントリでは、cygwinでWindows/コマンドプロンプトの「start」

記事を読む

toppers

C言語でEV3開発(24)-APIの実行時間を測定してみた。

どもです。 今回、以前から気になっていた、開発環境/プラットフォームであるTOPPERS HRP2

記事を読む

raspberry-pi

RaspberryPi起動時にpigpiodがスタートしないようにする

どもです。 これまでpigpioを使用してRaspberryPiからLEDをチカらせる方法など、い

記事を読む

iot_at_home_eye_catch

IoT開発(11)
ESP-WROOM-02を長時間駆動させた

どもです。この記事は、下記の記事の続き、「測定可能な期間」の結果発表です。IoT開発(5) ESP-

記事を読む

MY_MFC_LOGO

MFCプログラミング(2):コピー機能の実装

どもです。 前回に引き続き、今回もMFCネタです。 内容は、MFCでの「クリップボードへのデータ

記事を読む

no image

C言語でEV3開発(4)

どもです。 今回のエントリーは、前回のエントリー内容/EclipseでEV3の実行ファイルをビルド

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

c_sharp_eye_catch
外部からMariaDbにアクセスする(2)-C#からMariaDbにアクセスする。

どもです。 前回のエントリで、外部からMariaDbにアクセスす

c_sharp_eye_catch
外部からMariaDbにアクセスする(1)-データベースの設定

どもです。 今回は、Linux上のMariaDbにWindows

think_about_utest
middle_unit
最小…よりも(ほんの)少し大きいテストフレームワーク

どもです。 今回は、単体テストのフレームワークについて書きます。

iot_at_home_eye_catch
IoT開発(14)
ESP-WROOM-02の稼働時間を延ばす工夫をしてみる

どもです。この記事は、以下の続きです。 IoT開発(4)-ESP-W

iot_raspberrypi_gateway_001_eye_catch
IoT開発(13)
RaspberryPiをIoTゲートウェイにする(VI)
flaskでGET/POSTの受信処理

どもです。このエントリは、以下のエントリの続きです。 IoT開発

→もっと見る

PAGE TOP ↑