温度・湿度センサ DHT11/22 をSTM8S103Fボードで動かして見ました
温度・湿度センサDJHT11の記事をあちこちで見たので、購入してSTM8S103F
ボードで動かしてみました。センサからの出力は40ビットのシリアルで、
信号のHIGHレベルのパルス幅によりデータのHIGH/LOWを判定するものでしたが、
Arduinoのライブラリの方式をそのまま利用しても、8ビット幅のCPUボードでは
処理速度が全然足りませんでした。その為、処理のどこが問題なのかを調べる必要が
有り、テスト信号のポートを用意して、Arduinoのライブラリの修正方法を検討して
その結果を修正に反映させる事により、動かす事ができる様になりました。
以下がその状況です。
<DHT11/22 温度・湿度センサの概要>
温度センサとしてDHT11が使われている記事をあちこちで見かけたので、
購入してSTM8S103F3ボードで動かして見ました。センサの出力表示用の
デバイスとしてはI2CのOLEDを用いてこれに温度と湿度を表示させる事に
しました。
[DHT11/22]
1.温度・湿度センサ
2.温度・湿度測定範囲
DHT11 : 0 to 50℃ (±2℃) / 20 to 90%RH (±5%RH)
DHT22 : -40 to 80℃ (±0.5℃) / 0 to 100%RH (±2%RH)
3.インターフェイスは1線で40bitsデータ
データはHighレベルのパルス幅で識別
4.電源電圧
DHT11 : 3 to 5.5V
DHT22 : 3.3 to 6V
[OLED]
1.画素数 128x64ドットの有機LEDディスプレイ
2.発光色は白色・青色・黄色/青色等が有り
3.インターフェイスは通常のI2C(SPIの製品も有り)
4.ドライバIC
0.96インチは SSD1306
1.3インチはSSH1106
[動作状況]
<関連資料>
DHT11/22のデータシートはこちらのものを参考にしました。
URL : http://www.micro4you.com/files/sensor/DHT11.pdf --- DHT11
https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf --- DHT22
DHT11/22駆動用のライブラリはこちらのArduino用のものをSTM8Sチップ用
に修正して利用しました。
URL : https://github.com/markruys/arduino-DHT
OLEDに関しては以前作成したこちらの記事を参考にしました。
<テスト内容>
DHT11/22の動作に関しては次の事を目標としました。
1.パルス幅識別方式のデバイスとのインターフェイスがSTM8Sのチップで
可能かどうか確認
2.可能な場合、その方法を検討する
3.その状態で、センサ情報をOLEDに表示できる様にする
結果としては、Arduino用のライブラリは32bitsのチップ用のもので、
オリジナルの処理の様にパルス幅を計測しながら1ビット毎にHIGH/LOWの
判定をするにはSTM8Sのチップでは3倍以上の処理速度が必要な事が
判りました。特にRAMとのアクセスを8ビット幅で行う事が厳しい様で、
オリジナルの様に途中でループ処理や2バイトデータのシフト処理を入れると、
処理に大きな時間がかかる事が判明しました。その為、最初に40ビットの
パルス幅の計測のみを行い、センサからのデータの出力が終わった後に、
計測した時間のテーブルからビットのHIGH/LOWの判定を行う処理に
変更しました。この事により、パルス幅計測時のチップの処理をスムーズに
する事ができ、センサからのデータを読み込む事ができる様になりました。
問題点を解析して行く途中でもう無理かと思い、一時は割り込みでの対応を
考えたのですが、ライブラリの一部修正のみの通常の処理で行える様に
なりました。少し骨の有る内容で、楽しむ事ができました。
[機器の接続]
[コード類]
コードの開発にはIARのシステムを利用しました。
(STM8S103F3P6ボードののコード開発に 関してはこちらの記事を
参照して下さい。)
Code download URL : https://www.dropbox.com/s/mc86c6y7xjyfcq5/IAR_STM8S103F3_pseude_Arduino_0118.zip?dl=0
ボードで動かしてみました。センサからの出力は40ビットのシリアルで、
信号のHIGHレベルのパルス幅によりデータのHIGH/LOWを判定するものでしたが、
Arduinoのライブラリの方式をそのまま利用しても、8ビット幅のCPUボードでは
処理速度が全然足りませんでした。その為、処理のどこが問題なのかを調べる必要が
有り、テスト信号のポートを用意して、Arduinoのライブラリの修正方法を検討して
その結果を修正に反映させる事により、動かす事ができる様になりました。
以下がその状況です。
<DHT11/22 温度・湿度センサの概要>
温度センサとしてDHT11が使われている記事をあちこちで見かけたので、
購入してSTM8S103F3ボードで動かして見ました。センサの出力表示用の
デバイスとしてはI2CのOLEDを用いてこれに温度と湿度を表示させる事に
しました。
[DHT11/22]
1.温度・湿度センサ
2.温度・湿度測定範囲
DHT11 : 0 to 50℃ (±2℃) / 20 to 90%RH (±5%RH)
DHT22 : -40 to 80℃ (±0.5℃) / 0 to 100%RH (±2%RH)
3.インターフェイスは1線で40bitsデータ
データはHighレベルのパルス幅で識別
4.電源電圧
DHT11 : 3 to 5.5V
DHT22 : 3.3 to 6V
[OLED]
1.画素数 128x64ドットの有機LEDディスプレイ
2.発光色は白色・青色・黄色/青色等が有り
3.インターフェイスは通常のI2C(SPIの製品も有り)
4.ドライバIC
0.96インチは SSD1306
1.3インチはSSH1106
[動作状況]
<関連資料>
DHT11/22のデータシートはこちらのものを参考にしました。
URL : http://www.micro4you.com/files/sensor/DHT11.pdf --- DHT11
https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf --- DHT22
DHT11/22駆動用のライブラリはこちらのArduino用のものをSTM8Sチップ用
に修正して利用しました。
URL : https://github.com/markruys/arduino-DHT
OLEDに関しては以前作成したこちらの記事を参考にしました。
<テスト内容>
DHT11/22の動作に関しては次の事を目標としました。
1.パルス幅識別方式のデバイスとのインターフェイスがSTM8Sのチップで
可能かどうか確認
2.可能な場合、その方法を検討する
3.その状態で、センサ情報をOLEDに表示できる様にする
結果としては、Arduino用のライブラリは32bitsのチップ用のもので、
オリジナルの処理の様にパルス幅を計測しながら1ビット毎にHIGH/LOWの
判定をするにはSTM8Sのチップでは3倍以上の処理速度が必要な事が
判りました。特にRAMとのアクセスを8ビット幅で行う事が厳しい様で、
オリジナルの様に途中でループ処理や2バイトデータのシフト処理を入れると、
処理に大きな時間がかかる事が判明しました。その為、最初に40ビットの
パルス幅の計測のみを行い、センサからのデータの出力が終わった後に、
計測した時間のテーブルからビットのHIGH/LOWの判定を行う処理に
変更しました。この事により、パルス幅計測時のチップの処理をスムーズに
する事ができ、センサからのデータを読み込む事ができる様になりました。
問題点を解析して行く途中でもう無理かと思い、一時は割り込みでの対応を
考えたのですが、ライブラリの一部修正のみの通常の処理で行える様に
なりました。少し骨の有る内容で、楽しむ事ができました。
[機器の接続]
[コード類]
コードの開発にはIARのシステムを利用しました。
(STM8S103F3P6ボードののコード開発に 関してはこちらの記事を
参照して下さい。)
Code download URL : https://www.dropbox.com/s/mc86c6y7xjyfcq5/IAR_STM8S103F3_pseude_Arduino_0118.zip?dl=0