obnizのフォーラムは新しいシステムに移行しております。
新しいフォーラムはこちらになりますDHT11
-
DHT11(温湿度センサ)のシリアルデータをIOで取得したいと思っております。
IOで40us周期くらいでシリアルをとらえる必要があり、それが可能かどうか判断したく、サンプリング周期を教えていただけないでしょうか。
例えば、以下のスクリプトを実行した場合、どのくらいの周期でポート変化をとらえることができますでしょうか?
obniz.io1.input(function(value){
console.log("changed to " + value);
});よろしくお願いしますm(__)m
-
@Shouma-O obnizのio.inputは最大でも30hz程度なのでそれで40usの情報をio.inputで取得するのは難しいです。
2つ方法があります。
1つはLogicAnalyzerという機能を使う方法です。
https://obniz.io/doc/sdk/doc/logicanalyzer
これはioを監視し、より高い周波数で変化をまとめて取得する機能です。
io.outputでlowを出力して、その後logicanalyzerで取得すれば取得できるかもしれません。2つめはspiを使う方法です。
もちろんこのセンサーはspiで出力しているわけではないのですが、spiであれば高速にioのhigh-lowを取得することができます。
spiのmisoをセンサー出力に接続し、spiのwriteWait()を使えばmisoからデータを高速に読み取ることができます。2つ目のほうがデータを取りやすそうです。
先ほど弊社でもDHT11を購入しましたので、上記方法で動作するかとライブラリ化できそうであればライブラリにするというのを行いたいと思います。
-
@Yuki-Sato
ありがとうございます。
ご提案のLogicAnalyzerの手段を検討はしてみましたが、リファレンスを見たところintervalがmsなのでusオーダは厳しいと感じておりました。spiの手段ですが、浅はかな知識で申し訳ないのですが、DHT11は厄介なことにビット”0”と”1”で継続時間が違うのでspi(またはuart)できるか少し疑問な状態です
ご検討結果お待ちしております。
-
@Shouma-O LogicAnalyzerですが、0.07のような指定が可能です。ドキュメントが不足していますのでこれから更新いたします。実際に赤外線の信号をこの方法で取得しています。
ただ50usec程度が限界でそれ以上低い値ではうまく取れないため今回の用途では難しいかもしれません。ちなみにとり方はLogicAnalyzerにしろspiにしろ同じ方法になるのですが、0と1の短い方の間隔(26usecほど)の例えば3倍ほどのサンプリング速度で値を取得すれば0が長かったのか1が長かったのかを知ることができますので、その方法でどちらが出力されたのかを知ることができます。
dht11の0の出力は50usecのlowと26usecのhighとなっています。これを10usecごとにサンプリングすると、
0000011 のようになります。もちろんタイミングにより0000111のようになることもあるとおもいます。
そして次はまたlowになるので000001100000・・・のようになります。
かりにdht11の出力が1の場合は
0000011111110・・・となります。
あとはプログラムで「0が続いたあとの1が0より明らかに長いのか短いのか」を順次見るようにすればデータを読み取ることが可能です。spiで仮に1Mhzで(1usecごと)読み取ったとしても500バイトに全てのデータが入るので、現実的に可能そうです。
-
@Yuki-Sato ありがとうございます。spiの場合、やはりソフト的にデータを処理しないといけないのですね。大変参考になりました。私のほうでもやってみようと思います。