今回、複数ポイントで温度を測定・記録するシステムを、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 | #if defined(ARDUINO_M5Stack_Core_ESP32) |
今回のコードで、機種ごとに変更する必要があった箇所は、次の通りです。
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については、次の資料が参考になります。
なお、書き込む前に、Ardruino IDEのメニューで正しい機種を選ぶ必要があります。
実際に共通化したコードは、前回の記事にあります。
M5Stick Cを使って室内温度を測定・記録する