【WiFi温度計】M5StackとM5Stick Cでコードを共通化する

今回、複数ポイントで温度を測定・記録するシステムを、M5Stack BasicとM5Stick Cで作成しました。これらのコードを共通化したときのポイントを紹介します。


M5Stick Cは、M5Stackと同様に開発・使用することができますが、いくつか仕様が異なる部分があり、コードを変更する必要があります。しかし、機種ごとにコードを管理するのは、面倒です。

ArduinoはC/C++をベースにしており、#ifや#defineといったプリプロセッサディレクティブが利用できます。これを使用して、2機種のコードを共通化してみました。

プリプロセッサディレクティブを用いる

プリプロセッサディレクティブでは、#includeのように他のファイルを読み込んだり、#if~#else~#endifといった構文で、コンパイル時にコードを、条件によって変更したりすることができます。後者を使って、機種ごとに異なるコードを記述しました。

M5Stackに限らず、Arduinoでは、コンパイルの際に、機種を表すマクロ(C/C++のプリプロセッサにおけるマクロとは、変数やフラグのようなもの)が、自動的に定義されます。

機種を表すマクロ
機種 定義されるマクロ
M5Stack Basic/Greyなど ARDUINO_M5Stack_Core_ESP32
M5Stack Fire ARDUINO_M5STACK_FIRE
M5Stick C ARDUINO_M5Stick_C

機種ごとに異なる部分だけ、下記のようにコードを書くことで、全体のコードを共通化することができました。

機種ごとにコードを書き分ける方法
1
2
3
4
5
#if defined(ARDUINO_M5Stack_Core_ESP32)
// M5Stack用コード
#elif defined(ARDUINO_M5Stick_C)
// M5Stick C用コード
#endif

今回のコードで、機種ごとに変更する必要があった箇所は、次の通りです。

M5StackとM5Stick Cでコードが異なる部分
項目 M5Stack M5Stick C M5Stick C側の補足
インクルードする
ヘッダファイル
M5Stack.h M5StickC.h 専用のヘッダファイルが必要
電源管理のクラス M5.Power M5.Axp AXP192という電源管理ICを制御
電源管理の初期化 M5.Power.begin() 不要 電源管理(M5.Axp)は、
M5.begin()内で初期化済
画面の明るさ M5.Lcd.setBrightness(n)
n=0:消灯~255:全灯
M5.Axp.ScreenBreath(n)
n=7:暗い~15:明るい
画面(M5.Lcd)でなく、
電源管理(M5.Axp)で設定
画面の解像度 320 × 240 80 x 160 解像度が大きく違うため、
画面の表示内容は変更が必要
(今回は表示内容を減らした)
文字サイズ M5.Lcd.setTextSize(n) M5.Lcd.setTextSize(n) 同じ文字サイズのままでは
画面に収まらない
画面の向きの初期値 M5.Lcd.setRotation(1)
(横長/ランドスケープ)
M5.Lcd.setRotation(0)
(縦長/ポートレート)
初期値のままでは、
画面の向きは縦長
画面の向きを横長に 不要 M5.Lcd.setRotation(3)
または
M5.Lcd.setRotation(1)
3はUSB端子が左側に、
1はUSB端子が右側になる
カーソル指定
(画面の向き:横長)
M5.Lcd.setCursor(x,y)
x=0~319
y=0~239
M5.Lcd.setCursor(x,y,n)
x=0~159
y=0~79
n:文字サイズ(省略可)
M5.Lcd.setRotation()による
画面回転後の左上が(0,0)
文字サイズの指定は、
M5.Lcd.setTextSize()とは異なる
I2Cの初期化 Wire.begin() ▼GROVEポートを使用
Wire.begin(32, 33)
▼Hatを使用
Wire.begin(0, 26)
GROVE対応のENV Unitを使うか、
ENV Hatを使うかで、
ピン番号が変わる

どうしても画面周りの違いは多いですが、コードを共通化できるのはメリットが大きいと思います。

それぞれの機種のAPIについては、次の資料が参考になります。

Arduino API(日本語)

なお、書き込む前に、Ardruino IDEのメニューで正しい機種を選ぶ必要があります。

Ardruino IDEのメニューで正しい機種を選択

実際に共通化したコードは、前回の記事にあります。

M5Stick Cを使って室内温度を測定・記録する