*

温度(湿度)センサを使ってみた(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の両方を公開しているので、必要に応じて、それぞれ参照してみてください。

関連記事

GitHub

C/C++のスタブを自動生成するツールを公開しました

どもです。 突然ですが、C/C++の単体テストで使用する「スタブ」を自動で生成するツールを公開

記事を読む

toppers

C言語でEV3開発(20)-超音波センサと安全状態

どもです。 前回は、BluetoothでPCとEv3を接続してコマンドの送受信について書きました。

記事を読む

raspberry-pi

ライブラリでRasPiのピンにアクセス(1)-ライブラリを作ります

どもです。 これまでこのブログでは、RaspberryPiのGPIOとかSPIを使用したアプリ

記事を読む

raspberry-pi

ライブラリでRasPiのピンにアクセス(3)-割り込み対応

どもです。 少し間が空いてしまいましたが、RaspberryPiのピンをより簡便に使用するため

記事を読む

iot_at_home_eye_catch

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

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

記事を読む

no image

C言語でEV3開発(12)-opOUTPUT_TIME_POWERコマンド

どもです。 今回のエントリーでは、これまた前回に引き続き、モーターを動かすためのコマンドについて書

記事を読む

think_about_utest

VisualStudioで実行した単体テストの結果の出力(1)-ファイルへの出力

どもです。 最近、VisualStudio/C#でよく開発しています。 その際に、当然ですが

記事を読む

Arduino_Logo

ホールセンサーの種類と使い方(割込み編)

どもです。 前回に引き続き、今回もホールセンサーについてです。 1.前回からの違い 前回の

記事を読む

raspberry-pi

RaspberryPi3を購入しました

どもです。 突然ですが、「Raspberry Pi3 model B」を購入しました。 今回のエ

記事を読む

RasPi_Qt

Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。

どもです。 RaspberryPiのOS:Raspbianの新しいバージョンが、少し前(…なの

記事を読む

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="">

arduino_relay_switch_002_ae_g5v_drv_eye_catch
Arduinoでリレースイッチ(2)-AE-G5V-DRV

どもです。 前回の記事では、「フォトカプラリレー」を使用したLチ

tlp222af_001_eye_catch
Arduinoでリレースイッチ(1)-TLP222AF

どもです。 つい先日、やっとのことでリレースイッチを手に入れるこ

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

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

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

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

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

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

→もっと見る

PAGE TOP ↑