2024.02.18本記事はプロモーションが含まれています。こんにちは、ENGかぴです。Arduinoは初心者のためのスターターキットです。湿度・温度センサーなど複数のセンサーが実装されておりArduinoライブラリの使い方やC言語(C++)の学習ができます。Studio製)を使用してDHT11の湿度・温度の情報を取得してOLEDに表示します。Arduino(以下スターターキットとします。UNOと同じように開発することができます。Arduinoのライブラリを使用して動作確認したことをまとめています。Studioのページにまとめられています。Arduinoライブラリの説明やセンサーの使用例やPWMの考え方などが解説されています。Chromeのブラウザーによる変換機能を使用することで日本語でページを表示することができます。スターターキットにはソフトがプリインストールされているためUSBを接続すると各センサーの動作を確認することができます。プリインストールされているソフトは公開されているのでいつでも初期状態に戻すことができます。タイマ管理で使用するMsTimer2ライブラリとOLEDの表示を行うU8g2ライブラリは標準ライブラリとして搭載されていないためライブラリマネージャーで追加します。ライブラリの追加の仕方や使用例については下記記事にまとめています。Arduinoの照度センサーの使い方MsTimer2はDHT11でデータを測定するタイミングを管理し、U8g2は取得したデータをOLEDに表示する目的で使用します。「書けるが先で、理解が後」を体験しよう!DHT11からデータを取得するDHT11は温度・湿度のデータをシングルバス方式で取得します。シングルバス方式は一つのバスラインでデータの要求と受信を行うものです。ArduinoのDI/DOのポートを1本使ってデータの要求と受信を行います。DO/DIポート一つでデータが取得でいるメリットがありますが、DHT11の上位互換であるDHT20等のセンサーモジュールの多くがI2C通信を使用するものが多く使用頻度は多くない印象です。シングルバス方式の説明シングルバス方式の例をデータシートを引用して説明します。signal(黒線)はArduinoから出力するDOによって行います。machine)が応答してArduinoにデータを返信します。signal出力の為DOポートに切り替えてHighを出力して待機する。signalによるデータの要求DOをLowにして18ms以上待機してDOをHighに戻す。Highに戻した後、数us程度のウェイトする。手順3DOをDIに切り替えて受信待機DOをDI切り替えて待機する。signal)が送信されるので読み飛ばして、以降の湿度・温度データ取得のため待機する手順4湿度・温度のデータとチェックデジットを取得する1bit分のデータをHighの間隔の長さで1か0を判断しながら40bit分取得する。digit)を比較して一致した場合、有効なデータとして受け入れてデータを換算する。singnalはHighからスタートするのでDOでHighを出力して待機します。測定開始のトリガーはDOをLowにしたタイミングです。signal手順2はデータシートによると18ms以上Lowを維持した後にHighに戻します。pullingの期間をHighに維持するため数usウェイトを置いてからDOをDIに切り替えます。data手順3はDOをDIに切り替えてDHT11からのデータの返信を待機します。signal)として80usのパルス信号が送信されるので読み飛ばします。dataとなり取得するデータになります。手順4は湿度・温度のデータとチェックデジットを含むデータを1bitずつ合計40bit分送信されるので各ビットの0か1を判断しながらデータを格納します。0か1の判断の方法についてはDHT11のデータのHighとLowを判定して格納の項で説明しています。手順5はDHT11から取得した湿度・温度のデータからチェックデジットを計算して、DHT11から取得したチェックデジットと比較します。比較結果が一致する場合はデータが健全であると判断してデータを受け入れます。手順1~手順5を繰り返し行いますが、測定から2秒以上開けてから次の測定を行うことが推奨されています。formatDHT11が送信するデータフォーマットは最初にLowを50us出力します。その後のHighを出力します。Highの区間の長さによって各ビットの0か1を判定します。Highの区間が26us~28usであれば0となり、70usであれば1と判定します。これを40bit分繰り返します。HighとLowの判定の例を示します。}}digitalRead()関数でDIのポートの状態を確認します。digitalRead()関数は汎用的に作られているため直接マイコンのDI関係のレジスタを読み込むよりも処理が多く、1コールで約5usの処理時間になります。湿度・温度とチェックデジットの取得のためfor()文で繰り返しますが、応答信号を含むため41回繰り返します。ループの最初は応答信号なのでデータを判定せず読み飛ばします。2周目以降から湿度・温度・チェックデジットの順で送信されるのでデータを格納します。Low部分のサイクル(basecnt)をwhile()で繰り返しながらカウントします。50us程度Lowになるため正常に通信できている場合はbasecntは10±1になります。High部分のサイクル(hcnt)をwhile()で繰り返しながらカウントします。Highのサイクルでデータの1bitが0か1かを判定します。0の場合は26us~28usになるので5または6になります。1の場合は70usになるので12±1になります。hcnt値が6以上であれば該当のビットが1であると判断して1を格納します。6未満であればビットが0であると判断して0を格納します。測定データは湿度データH(8バイト)、湿度データL(8バイト)、温度データH(8バイト)、温度データ(8バイト)、チェックデジット(8バイト)の順に合計40バイトのデータで格納しています。8バイトのデータで構成している0または1のデータを8ビットデータに換算します。MSB(最上位ビット)をセットするためデータを左に7回シフトして論理和を取っています。続けて6ビット目はデータを左に6回シフトして論理和を取ります。同様にして5ビット目~LSBまで左にシフトしながら論理和を取ると8ビットのデータが生成できます。生成した8ビットデータを10進数で表示したものが湿度・温度のデータになります。チェックデジットは8ビットデータの換算した湿度データ(HとL)と温度データ(HとL)を加算して計算します。受信したチェックデジットを8ビットデータに換算した結果と加算した結果が一致した場合、データが健全であると判断して湿度・温度のデータとして採用します。スポンサーリンクOLEDに測定値を表示するU8g2ライブラリでイベント発生時の測定値の様子を表示します。ライブラリの追加の仕方や使用例については下記記事を参考にしてください。その2以下ではOLEDに測定値を表示する方法を中心に説明します。}while(u8g2.nextPage());}最初にfirstPage()関数でOLEDに使用している内部のバッファをクリアします。setFont()関数でOLEDに表示する文字のフォントを指定します。フォントの定義はライブラリのフォルダ(XXX\Arduino\libraries\U8g2\src\clib)にu8g2.hにあります。XXX\はArduinoのライブラリの保存先に指定しているアドレスです。firstPage()関数で内部のバッファをクリアします。setCursor()関数でOLEDの表示位置にカーソルを合わせます。第1引数にX座標を指定します。X座標は画面左から右に向かって進みます。第2引数にY座標を指定します。Y座標は画面上から下に向かって進みます。print()関数は引数に指定した文字列を表示します。変数を引数に指定した場合は引数の値を文字列に変換して表示します。print()関数で文字列と取得したデータを表示しています。while()で表示が終えるまでループさせています。本記事では約120ms必要でした。OLEDの表示は遅延が発生するため頻繁な更新はしないように調整が必要です。IDEでDHTライブラリを追加する方法もあります。Sensorライブラリを使用する方法を参考として説明します。dht11を入力するとライブラリの候補が表示されます。Sensorをインストールします。使用例は以下の通りです。}while(u8g2.nextPage());}DHT.hをインクルードします。DHTクラスの変数を宣言してインスタンス化します。例ではdhtでインスタンス化しています。引数に使用するDO/DIピンを指定します。第2引数にDHT11などの種別を指定します。湿度の取得はReadHumidity()関数、温度の取得はreadTemperature()関数を使用します。使用例のようにデータを取得した場所で関数をコールするだけで簡単に測定値が取得できるため手軽に動作確認できます。電源を入れると5秒後にDHT11が測定した湿度と温度をOLEDに表示します。DHT11は測定間隔を2秒以上空けることが推奨されているので余裕をもって5秒間ごとに測定を行いOLEDの表示を更新します。部屋に設置している温度計は23.5°Cでしたが、DHT11は小数点以下までは表示できないことを考慮すると誤差は少なく測定できています。湿度は判断基準はありませんが息を吹きかけると値が上がることや加湿器を使用していると徐々に値が上がっていることから測定はできていると言えます。以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。}while(u8g2.nextPage());}関連リンクArduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。学習コース(はじめてのプログラミングコース))最後まで、読んでいただきありがとうございました。組み込みエンジニアPICマイコン(PIC12F675)のI/Oポート設定と使い方マイコンのソフト開発を行うと必ずと言っていいほどI/Oポートの制御を行います。I/Oポートを操作して外部機器にONしたりLEDを点灯させて通知したり警報を鳴らしたりと用途は様々です。マイコンの基礎であるI/Oポートの操作について説明します。組み込みエンジニアESP32-WROOM-32Eを使用してRTCの時間を設定するESP32-WROOM-32EのWiFi通信でブラウザーから時刻を送信しRTCモジュールに時刻を設定することができます。NTPサーバーにアクセスする方法など時刻管理の方法は様々ですが、外部の回線に接続しない場合に有効な方法です。組み込みエンジニアPICマイコン(PIC12F675)のEEPROMの使い方の応用PIC12F675のEEPROMは読み書きに数msの時間が必要です。ウェイトで待つ方法もありますが、プログラムの規模が大きくなるほどウェイトを持たせると不都合が発生します。ウェイトせずにモード遷移の方法で管理する方法を説明しています。抵抗をたくさん使います。抵抗の使い方を間違えてしまうと消費電力が大きくなってしまい故障の原因になってしまいます。XIAO31ESP32-WROOM-32E37TWELITE(トワイライト)26PIC16F182731PIC12F67522ノウハウ(体験談)36趣味と生活29その他6タグオペアンププロフィールENGかぴ当ブログの運営者のENGカピです。組み込みエンジニアとして10年以上の経験を活かしてセンサーモジュール等の動作確認したことをまとめています。広告、アフィリエイト収益で当ブログを運営させていただいております。defined.")}))})()タイトルとURLをコピーしました。