農系IoT勉強会#1 AtomS3で温度、湿度計測

2024/06/16に公開

今回の目標

「AtomS3に温湿度センサーをつないで、温度と湿度を画面に表示する。」

  1. ArduinoIDEのインストール
  2. AtomS3でHelloWorld
  3. AtomS3で温湿度計測

AtomS3について

ESP32-S3コントローラを搭載した小型の開発モジュールです。製品サイズはわずか24 x 24 mmで、さまざまな組み込みスマートデバイスアプリケーションに適しています。

8 MBフラッシュメモリ、0.85インチのIPS液晶、液晶底のボタン、6軸IMUセンサ(MPU6886)、Grove互換インターフェースなどを備えています。

m5-docs

Arduino IDEインストール

Arduino IDEというアプリケーションを使って、プログラムコードを編集したり、マイコン(AtomS3など)に書き込むことができます。

Windows,Mac,Linuxに対応しています。

以下の記事を参考に、それぞれの環境にインストールします。

Arduino IDEのインストールと設定 (Windows, Mac, Linux対応)

Arduino IDEの設定

日本語表示にする

Arduino IDEのメニューなどの表示を日本語にします。

ボードのインストール

Arduino IDEはいろいろなマイコンに対応していますが、AtomS3を使うための設定を行います。

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

ライブラリのインストール

AtomS3のプログラムを簡単にするためのライブラリをインストールします。

すべてをインストールするのに数分かかります。

AtomS3接続

AtomS3をPCのUSBボードに接続して、ArduinoIDEで使用するボードとシリアルポートを選択します。

※AtomS3に書き込まれているプログラムによっては、このあとの書き込み作業がうまく行かないことがあるので、AtomS3横のボタンを押しながらUSB接続を行います。(横のボタンの隙間から緑のLEDが一瞬光ることで確認できます)

ボードの選択

※M5AtomS3が複数ある場合は、「M5Stack」と後ろについているものを選択してください。

(その後、なにかインストールするか聞かれたら「はい」でインストールしてください)

プログラムコード入力

ひとまず画面に”HelloWorld”と表示してみましょう。

#include "M5AtomS3.h"

void setup() {
  // put your setup code here, to run once:
  M5.begin();
  M5.Lcd.println("Hello World");
}

void loop() {
  // put your main code here, to run repeatedly:

}

プログラム書き込み&実行

途中赤い文字でエラーのようなものが表示されるかもしれませんが、上記のように最後に書き込みが終了すればOKです。

AtomS3の画面に「HelloWorld」と表示されます。

表示されない場合は、AtomS3横のPowerボタンを押してみたり、USBを接続し直したりして電源を入れ直して見てください。

プログラム解説

#include

使用するライブラリに応じたヘッダーファイル(.h)を読み込みます。

#include "M5AtomS3.h"

AtomS3用のライブラリのいろいろな関数を使えるようにします。

プログラムの意味としては、#includeは、そのあとに書いてあるファイルをプログラムコードに取り込む。という意味です。

“M5AtomS3.h”には、AtomS3のライブラリで使える関数などが書かれています。

void setup() {

プログラム開始時に一度だけ実行される処理をここに記載します。

void setup() {
  // put your setup code here, to run once:
  M5.begin();
  M5.Lcd.println("Hello World");
}

“//”はコメント(実行されない文)です。

“M5.begin();” AtomS3用のライブラリを初期化します。M5.xxxxという関数を使うのに必要です。

“M5.Lcd.println("Hello World");” 画面に”Hello World”と表示します。

void loop() {

setup関数が呼ばれたあとは、このloop関数が繰り返し実行されます。

今回は、”Hello World”と表示したあと何もしないので、何も書いていません。

温湿度計測

こちらのセンサーを利用します。

M5Stack用温湿度気圧センサユニット Ver.4(ENV Ⅳ)

M5Stack用温湿度気圧センサユニット Ver.4は、SHT40とBMP280を組み合わせた環境センサで、温度、湿度、気圧を測定することができます。

SHT40は、高精度、低消費電力のデジタル温湿度センサです(I2Cアドレス:0x44)。また、BMP280 は高精度の絶対気圧センサです(I2Cアドレス: 0x76 )。

ひとまず、SHT40のみをつかって、温度と湿度を計測してみます。

ライブラリインストール

SHT40用のライブラリをインストールします。

  1. ライブラリマネージャーを開く
  2. 検索エリアに「sht4」と入力
  3. 「Adafruits SHT4x Library」をインストール

サンプルプログラムの読み込み

「ファイル」ー「スケッチ例」ー「Adafruit SHT4x Library」ー「SHT4test」

サンプルプログラム修正

AtomS3で動作するように、21行目あたりに以下のコードを追加します。

  Wire.begin(2,1);  //I2Cで使うPINを指定

使用するマイコンによって、センサーに接続されるピン番号が違うので、設定しています。

書き込み、実行

書き込みをして実行しても、サンプルプログラムはAtomS3の画面には何も表示されません。

が、ArduinoIDEでシリアルモニターを開くと情報が出力されています。

シリアルモニター

「ツール」ー「シリアルモニター」

プログラムがうまく動いていれば、シリアルモニターに温度と湿度が表示されます。

何も出ない場合は、AtomS3の横のPOWERボタンを押してみたり、USBを抜き差ししてみましょう。

プログラム中の、Serial.ptint()や、Serial.println()をつかうと、シリアルモニターに出力することができます。

AtomS3の画面に表示

M5AtomS3ライブラリの初期化

11行目辺りに、

#include "M5AtomS3.h"

17行目辺りに、

  M5.begin();

を追加します。

これで、AtomS3の画面表示などの機能を使うためのライブラリの初期化が実行されます。

温度、湿度の画面表示

92行目辺りに以下コードを追加

  // AtomS3の画面にデータを表示
  M5.Lcd.fillScreen(BLACK); // 画面をクリア
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.setTextSize(3);
  M5.Lcd.print(temp.temperature);
  M5.Lcd.println(" C");
  M5.Lcd.print(humidity.relative_humidity);
  M5.Lcd.println(" %");

プログラムコード

/*************************************************** 
  This is an example for the SHT4x Humidity & Temp Sensor

  Designed specifically to work with the SHT4x sensor from Adafruit
  ----> https://www.adafruit.com/products/4885

  These sensors use I2C to communicate, 2 pins are required to  
  interface
 ****************************************************/

#include "M5AtomS3.h"
#include "Adafruit_SHT4x.h"

Adafruit_SHT4x sht4 = Adafruit_SHT4x();

void setup() {
  M5.begin();
  Serial.begin(115200);

  while (!Serial)
    delay(10);     // will pause Zero, Leonardo, etc until serial console opens

  Wire.begin(2,1);  //I2Cで使うPINを指定

  Serial.println("Adafruit SHT4x test");
  if (! sht4.begin()) {
    Serial.println("Couldn't find SHT4x");
    while (1) delay(1);
  }
  Serial.println("Found SHT4x sensor");
  Serial.print("Serial number 0x");
  Serial.println(sht4.readSerial(), HEX);

  // You can have 3 different precisions, higher precision takes longer
  sht4.setPrecision(SHT4X_HIGH_PRECISION);
  switch (sht4.getPrecision()) {
     case SHT4X_HIGH_PRECISION: 
       Serial.println("High precision");
       break;
     case SHT4X_MED_PRECISION: 
       Serial.println("Med precision");
       break;
     case SHT4X_LOW_PRECISION: 
       Serial.println("Low precision");
       break;
  }

  // You can have 6 different heater settings
  // higher heat and longer times uses more power
  // and reads will take longer too!
  sht4.setHeater(SHT4X_NO_HEATER);
  switch (sht4.getHeater()) {
     case SHT4X_NO_HEATER: 
       Serial.println("No heater");
       break;
     case SHT4X_HIGH_HEATER_1S: 
       Serial.println("High heat for 1 second");
       break;
     case SHT4X_HIGH_HEATER_100MS: 
       Serial.println("High heat for 0.1 second");
       break;
     case SHT4X_MED_HEATER_1S: 
       Serial.println("Medium heat for 1 second");
       break;
     case SHT4X_MED_HEATER_100MS: 
       Serial.println("Medium heat for 0.1 second");
       break;
     case SHT4X_LOW_HEATER_1S: 
       Serial.println("Low heat for 1 second");
       break;
     case SHT4X_LOW_HEATER_100MS: 
       Serial.println("Low heat for 0.1 second");
       break;
  }
  
}

void loop() {
  sensors_event_t humidity, temp;
  
  uint32_t timestamp = millis();
  sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
  timestamp = millis() - timestamp;

  Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C");
  Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");

  Serial.print("Read duration (ms): ");
  Serial.println(timestamp);

  // AtomS3の画面にデータを表示
  M5.Lcd.fillScreen(BLACK); // 画面をクリア
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.setTextSize(3);
  M5.Lcd.print(temp.temperature);
  M5.Lcd.println(" C");
  M5.Lcd.print(humidity.relative_humidity);
  M5.Lcd.println(" %");

  delay(1000);
}

Discussion