M5StickCでSHT31センサーを使う。

スイッチサイエンスからM5StickCが販売された。ディスプレーや各種センサー等が内蔵され何かと便利そうだったので購入。

M5StickC
M5StickC

なによりこのサイズ感がとても良いのだが何か実験するにも必要なものが一通り用意されており必要十分と言った感じがするし価格的にもお買い得感はあるのでこれはちょ~お勧めかもしれない。

とりあえず、製造元の製品ドキュメントを参考にArduinoをセットアップしサンプルを実行してみたところ、M5StickCライブラリがコンパイルエラーになりサンプルが何も実行できなかったりする...しょうがないのでライブラリのエラー箇所を適当に修正し、なんとかサンプルは実行できるようにはなったが、M5StickCライブラリ大丈夫なのか?とその品質を疑ってしまった。まぁ、ないよりはあったほうが良いことは確かなのではあるが...(-_-;)

次にSHT31センサーライブラリを探してみた。
GROVE - 温湿度センサ(SHT31) v1.0
GROVE – 温湿度センサ(SHT31) v1.0

GROVEや秋月電子のライブラリを見つけたが、とりあえずGROVEのSHT31ライブラリのコードを調べてみることに...
その結果、温度と湿度の両方を同時取得できるのにそれぞれ2回も通信しないといけないことや温湿度データ取得に50ms以上かかるというのは疑問符が残る。秋月電子のほうは温湿度データの同時取得に関しては問題ないが温湿度データ取得に300ms以上かかるのが痛い。

ということでGROVEのライブラリを参考に改良してみた。

改良点は、

・ArduinoのWireライブラリの互換ライブラリ対応
・I2C活線抜去対応
・計測待ち時間の除去。
・非力CPU対応(データ型をfloat型からuint16_t型へ変更。小数部対応のためデータは16倍した値を返す)

などであるが、ほぼ全てを書き換えてしまったのでGROVEのものとは全く別物となってしまった感がある。

【サンプル・スケッチ実行中の様子】

【更新情報】
2020-02-20
・ライセンス変更。
・よりシンプルなコードに改良。
・begin()内で行っていたWireの初期化を削除。Wireの初期化はアプリ側で行うこと。

2019-06-25
・温度データ型が符号なしになっていた点を修正。
・begin()の引数にI2Cクロック指定を追加。規定値は400KHzとした。
・read()の呼び出しタイミングの制約を無くした。
・handle()呼び出しタイミングによっては温度データ取得に失敗する点を修正。

2019-06-20
handle()のデータ取得タイミングを改良。

2019-06-18
begin()の引数に温湿度データ取得間隔ms(省略値は1000ms)を追加。
getTempratureC()をtempratureC()に名前変更。
getTempratureF()をtempratureF()に名前変更。
getHumidity()をhumidity()に名前変更。
read(), error()メソッドを追加。
handle()をよりシンプルなコードにするため温湿度データ取得タイミングを変更。
非同期取得(測定待ち時間なし)はhandle()、即時取得(測定待ち時間有り)はread()を使う。

【サンプル・スケッチ】

【SHT3Xライブラリ】

2 Replies to “M5StickCでSHT31センサーを使う。”

  1. M5StackやM5StackcにSHT31モジュールを繋いだ場合,信号の電圧は大丈夫ですか?
    回路図を見ると,Vccを5V供給すると信号電圧は5Vになりそうな…(M5Stickcは3.3v

  2. コメントありがとうございます。
    回路図やデータシートを確認したところ確かにご指摘の通り電圧の問題が懸念されます...
    I2CコネクタのVCCが5VということはSHT31側のSCL/SDAも5Vになるので壊れるとしたら3.3Vで動作しているM5StickCのほうですがもう何カ月も壊れずに動いています。
    どうして壊れないのか少し考えてみました。SCL/SDAの+信号はVCCからのプルアップ抵抗で供給されており、M5StickCのIOピンには内部で保護ダイオードが入っているものと思われます。これらが正しいと仮定するとHIGHレベルのときプルアップ抵抗経由で保護ダイオードに流れる電流(0.1mA程度)による電圧降下が発生します。つまり、プルアップ抵抗が保護抵抗の代わりをするので壊れないということになるのかと思います。念の為、テスターで電圧を調べたところ約3.8V程度でした。M5StickCのVDDは最大3.6V、IOピンの最大電圧はVDD+0.3とあるので3.6+0.3=3.9Vとなりギリですが一応許容範囲内には入ってることになります。
    かなり乱暴な使い方とも言えますが...昔、間違ってESP8266を5Vでほぼ一日動かしたことがありましたが一部のIOピンが死んだだけでCPU自体は正常に動作していました。以外に丈夫なものです。(笑)

コメントを残す

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

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください