2023年の夏も暑い!M5Stackで温度を測りたい!〜センサユニットを使ってみる【超初心者がIoT開発に挑んでみる#5】

IoT

はじめに

 前回の記事ではM5Stackのボタンを使ってみました。簡単に使えて驚きでした。

 さて今回のテーマに関係しますが、最近とても暑い日が続いていますね。「クーラーつけても暑いな〜 今部屋の中は何度だ? 天気予報じゃ外の気温しかわからないしな・・・」と思う日も度々あるはずです。(たぶん)
そこで今回は、部屋の温度がわかるようにM5Stackを温度を測るデバイスにしたいと思います。
え?温度計を買えばいいって?その方が安いし手間がかからない?

  面白いことおっしゃいますね!

必要なもの 〜センサユニットとGroveケーブル

 いきなり温度を測るデバイスを作ると言っても必要なものがわからないとできないので、必要なものをまとめてみました。と言ってもM5Stackとあと2つの部品があればできます。3つの部品だけで温度計が自作できるなんて驚きですね。

センサユニット

 今回はM5Stack用の温湿度気圧センサユニットを使いたいと思います。
私はスイッチサイエンス様からM5Stack用温湿度気圧センサユニット Ver.3(ENV Ⅲ)を購入させていただきました。スイッチサイエンス様は色々な商品がお手頃な価格で、注文したらすぐに届けていただけるのでよく利用させていただいています。いつもありがとうございます。
 センサユニットの外観(裏表)は下のような感じです。大きさ24×32×8mm、重量5gと小型かつ軽量で、IoTデバイス開発に適しています。温湿度計測用のSHT30、気圧計測用のQMP6988というセンサを搭載しているようです。データをI2C通信でやり取りをしているようです。
今は深い内容までは突っ込んでいきませんが、そのうち通信プロトコルや各センサの仕組みについてもまとめていけるといいですね。
現時点であまり深い内容に突っ込むと頭がパンクするのでやめておきますね。

詳細は後ほど紹介しますが、このセンサユニットとM5Stackを組み合わせれば簡単に温度と湿度を測定することができます。

※このセンサユニットは温度と湿度のほかに気圧も測ることができますが、今回は温度と湿度を扱います。

Groveケーブル

 センサユニットとM5Stackを接続するためにGroveケーブルを使用しました。M5StackはGPIOピンでセンサと接続することも可能ですが、私のような初心者だと何をどこに接続するかわからないことが多々あります。そのような場合にGroveケーブルを使うことで簡単に接続できます。Groveケーブルは下のようなものです。

このGroveケーブルは、Seeed Studio社が開発した汎用ケーブルです。

M5StackとセンサユニットをGroveケーブルで接続してみる

 接続した状態は下の画像のようになります。載せるまでもないぐらい簡単で、GroveケーブルでセンサユニットとM5Stackを接続するだけです。挿せる向きも決まっているので挿し間違いもありません。

実際に温度を測ってみよう!

お詫び
前回の記事までボードを”M5Stack-Core2″にしていたと思います。このボードでもM5Stackが動いていたので気にしていませんでしたが、M5Stack Basic V2.6において正しくは”M5Stack-Core-ESP32“のようです。大変申し訳ありません。
今回のセンサユニットを使うにあたり、”M5Stack-Core2″では上手く動かなかったことで気づきました。
このような間違いは今後何度もあるとは思いますが、発見次第訂正させて頂ければと思います。

それでは実際に温度を測るスケッチを書いていきます。コードは以下のようになります。

お詫び
2024年2月に、sht30.init()をsetup関数に書いておかないと正常に動作しないことがわかりました。以前は動いていたはずなんですが…
今回は偶然気づいただけなので、他の記事で気づかない誤りがありましたら申し訳ございません。

#include <M5Stack.h>
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>
#include "SHT3X.h"
SHT3X sht30; //温湿度センサSHT30を使用

float tmp = 0.0; //温度を格納する変数を設定
float hum = 0.0; //湿度を格納する変数を設定

void setup() {
  M5.begin(); //M5Stackの初期化
  Wire.begin(); //Wireライブラリの初期化(I2Cバスを使う場合は必要)
  sht30.init(); //初期化←2024年2月にこれがないと正常に動作しないことを発見しました
  M5.Lcd.setTextSize(3);
}

void loop() {
//sht30.get()でSHT30センサから温度と湿度のデータを取得
  if(sht30.get() == 0) {
    tmp = sht30.cTemp;  //取得した温度データを格納
    hum = sht30.humidity; //取得した湿度データを格納
  } else {
    //データの取得に失敗したときの動作
    tmp = 0.0;
    hum = 0.0;
  }
  M5.Lcd.setCursor(0, 10);
  M5.Lcd.setTextColor(WHITE, BLACK);
  //画面に温度と湿度を表示
  M5.Lcd.printf("Temp: %2.1f`C  \r\nHumi: %2.0f%%", tmp, hum);
  delay(1000);
}

上記の各コードについて説明します。ただし、前回までに説明した箇所は割愛します。

  • 2、15行目:#include <Wire.h>、Wire.begin()
    M5StackでI2Cバスを使う場合に必要なWireライブラリを使用するための記述です。今回のようなセンサユニットを使う場合には必要となります。また15行目に書いてあるようにsetup()関数内でWire.begin()により初期化する必要があります。
  • 3、4行目://#include “Adafruit_Sensor.h”、//#include <Adafruit_BMP280.h>
    なぜかこれらのコードがないと5行目にある SHT3X.h が認識されませんでした・・・
    スケッチを保存しているフォルダにSHT3X.hをおくと、認識はされているようですが、別のエラーが出てしまいUploadできませんでした。(エラー詳細は割愛します。)
    当てずっぽうではありますが、考えられる理由として
     ①Desktop上に”Arduino”というフォルダを作成して、その中にスケッチを保存しているのでパスが変なことになってしまっている
     ②そもそも今回のセンサユニットを使うに当たってAdafruit_Sensor.hAdafruit_BMP280.hをincludeする必要がある
    といったところでしょうか。①は正直いつか問題になりそうだなと思いながら進めていますが、この件に関してはあまり関係なさそうです。②はあり得そうですが、そもそもコメントアウトしている時点で関係ないはず・・・。コメントアウトしてもしなくてもAdafruit_Sensor.hとAdafruit_BMP280.hをincludeしていればUploadできるという不思議な現象です。というか根本的に考え方を間違えている可能性がありそうですね。
    この辺り詳しい方がいれば、ぜひコメントください!
     本当なら上記問題を解決してから進みたいのですが、すぐにわかりそうにないのでひとまず保留にしておきます。一応動いたので・・・
  • 5、6行目:#include “SHT3X.h”、SHT3X sht30
    5行目でSHT30センサを使うためのライブラリをincludeして、6行目でsht30を定義しています。
  • 19〜26行目:if(sht30.get() == 0) 〜 }の部分
    この部分で温度と湿度を計測して、計測データを変数に格納しています。なお、何らかの問題で計測ができなかったとき、22〜26行目でtmpとhumに0を格納するような仕様にしています。22〜26行目の部分に関してはなくても動作はします。
  • 30行目:M5.Lcd.printf(“Temp: %2.1f`C \r\nHumi: %2.0f%%”, tmp, hum)
    さりげなくprintfを使っています。このprintfは以前紹介したprintやprintlnとの違いは、変換指定子が使えることです。表示するデータの桁数を調整する時に便利なので、今回はprintfを使っています。

※全く同じコードを書いたのに”〇〇.h No Such File”のエラーが出るが出る場合は以下のような対応をしてみてください。

  1. スケッチを保存しているフォルダと同じ場所のlibrariesフォルダに使いたいライブラリがあるか確認する。ない場合はLIBRARY MANAGERでINSTALLする。
  2. ライブラリが上記の場所にあるのにエラーが出る場合は、一度スケッチを上書き保存してから閉じて、再度VerfyかUploadをしてみる。
  3. ライブラリをREMOVEして改めてINSTALLしてからVerifyかUploadをする。
  4. 一度Arduino IDEを終了して、再度開いてからVerfyかUploadをしてみる。

 上記コードをM5StackにUploadしてみると以下のように温度(Temp)と湿度(Humi)が画面に表示されると思います。息を吹きかけたりすると変化すれば正しく動作しているかなと思います。なお、1秒間隔でセンサユニットからデータを取得して表示するようにしています。

最後に

 いくつか気になる点は残しつつもセンサユニットで温度と湿度を測定してM5Stackの画面に表示させることができました。意外に簡単だったのではないでしょうか。
 気になる点については今後解明できたら更新しようかなと思っています。

 今回はこの辺りで終わりとします。次回もぜひご覧ください!

おすすめの書籍

 もっと詳しくM5Stackについて知りたい!という方はこちらの書籍がおすすめです。とても詳しく載っていてわかりやすいです。

とりあえず何か作ってみたい!という方にはこちらの書籍がおすすめです。書いてある通りにやるだけでお手軽にIoTデバイスを作ることができます。

※Amazonのアソシエイトとして、当メディア(Nラボ備忘録)は適格販売により収入を得ています。

他記事の紹介

当ブログでは様々な技術テーマの記事を投稿しています。ぜひご覧ください!

コメント

タイトルとURLをコピーしました