前々回M5Stick-Cで作ったWBGT警報機。
M5シリーズの最新製品M5StickC Plusを手に入れたので早速作ってみた次第です。
(これ以降、PlusではないM5StickCを区別するために「無印」と表現します。)
M5StickC Plus
なんかスイッチサイエンスさんでの販売開始のタイミングでちょうど見つけて手に入れることができたので、ちょこっと開封レビュー。
(見つけて注文した数時間後には売り切れとりました。)
パッケージも変わっとります。
無印は確かよくあるプラケースでしたが、Plusは紙箱に入れてプラのスリーブに収めてありました。
紙箱ごとスライドさせて取り出します。
工場出荷時のスケッチは最初に液晶のテスト表示のカラーバーが表示された後、加速度センサのデモ→RTCの時刻表示→マイク信号のスペクトラム表示→赤外線LEDからの送信テスト→BLEのアドレス表示→加速度センサのデモ→…とM5ボタンで切り替わります。
切り替えの際にピッとブザーの音が鳴ります。早速最新機能を突っ込んできました。
M5StickC無印と比べるとこんな感じ。
全体のサイズは同じだけど、液晶画面が一回り大きくなってます。
解像度は無印の0.96インチ160×80pxから1.14インチ240×135pxに変更。
…で、私いっつも思うんですけど、液晶画面とかの「インチ表示」ってメチャクチャ分かりにくいです。表示エリアのタテ〇cmヨコ△cmと書いてほしい。(あとヤードポンド法な)
ということで実測値で書いておきます。
(ノギスで測定、タテ/ヨコは液晶を横長に置いた場合で表現してます)
M5StickC無印:タテ11.0mm / ヨコ21.7mm
M5StickC Plus:タテ14.7mm / ヨコ24.7mm
全体の寸法:タテ23.8mm / ヨコ47.8mm (突起部含まず)
このほかの変更点は公式情報だと
- 出力として使えるピンが増えた(1つのピンを切り替えて使うので物理的なピンは増えていません)
- ブザーが内蔵された
- バッテリー容量が大きくなった(80mAh→120mAh)
実際に触って感じたのは
- 液晶表面のガラスが無印と比べると艶消しっぽくなってる
- 側面のボタンスイッチ(電源スイッチではない方)が出っ張ってない
- 外装のプラ筐体のオレンジ色がちょっと赤寄りに(というか朱色)
- 液晶の縦横比が変わっている(無印 160:80=2:1、Plus 240:135=16:9)
あたりですね。
(こちらのサイト様の情報によると、手持ちの無印は最初期ロットの品らしく、現行とは何か変わってるかもしれません。)
液晶が大きくなって見やすくなってるのも含めて、550円の価格差。
(※Plusには付属品がないので、無印の本体だけの価格と比較)
とはいえ付属品なし本体のみの無印が¥1650-。元々が安いので550円の価格差をどう判断するかは人によりけりでしょうか。
私はもう今後買うならPlusって感じです(笑)
注意:USBケーブルも付属しないので、Type-Cケーブルを持ってない方は一緒に買っときましょう。
うちには腐るほどあるのでよかったけど。
というか、イマドキ持ってるか。スマホとかでも使うし。
Arduino IDEでの扱いについて
ライブラリがPlus専用のものになるようですが、Arduino IDEのライブラリマネージャからはまだ見つけられなかったので、GitHubからダウンロード&インストールしました。
ボード設定はM5StickCのままで行けました…。
WBGT警報機にする
Plusになっても外付けモジュール「HAT」はそのまま使えます。
よって、WBGT警報機もスケッチはほぼそのまま使えるのですが、ライブラリの変更と、液晶の解像度に合わせた表示の座標や文字サイズの調整が必要です。
でもそれ以外は完全にそのまま使えました。ちょっと感動。
(MPUが変わってないんだからあたりまえといえばあたりまえ。)
Plus専用のスケッチを上げておきます。
無印のスケッチは過去の投稿(→リンク)にあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | #include <M5StickCPlus.h> #include "DHT12.h" #include <Wire.h> #include "Adafruit_Sensor.h" #include <Adafruit_BMP280.h> DHT12 dht12; Adafruit_BMP280 bme; #define refreshRate 5000 long timer = 0; //WBGT計算テーブル const int WBGT[20][17] = {{15,15,16,16,17,17,18,19,19,20,20,21,21,22,23,23,24}, {15,16,17,17,18,18,19,19,20,21,21,22,22,23,24,24,25}, {16,17,17,18,19,19,20,20,21,22,22,23,23,24,25,25,26}, {17,18,18,19,19,20,21,21,22,22,23,24,24,25,26,26,27}, {18,18,19,20,20,21,22,22,23,23,24,25,25,26,27,27,28}, {18,19,20,20,21,22,22,23,24,24,25,26,26,27,28,28,29}, {19,20,21,21,22,23,23,24,25,25,26,27,27,28,29,29,30}, {20,21,21,22,23,23,24,25,25,26,27,28,28,29,30,30,31}, {21,21,22,23,24,24,25,26,26,27,28,29,29,30,31,31,32}, {21,22,23,24,24,25,26,27,27,28,29,29,30,31,32,32,33}, {22,23,24,24,25,26,27,27,28,29,30,30,31,32,33,33,34}, {23,24,25,25,26,27,28,28,29,30,31,31,32,33,34,34,35}, {24,25,25,26,27,28,28,29,30,31,32,32,33,34,35,35,36}, {25,25,26,27,28,29,29,30,31,32,33,33,34,35,36,37,37}, {25,26,27,28,29,29,30,31,32,33,33,34,35,36,37,38,38}, {26,27,28,29,29,30,31,32,33,34,34,35,36,37,38,39,39}, {27,28,29,29,30,31,32,33,34,35,35,36,37,38,39,40,41}, {28,28,29,30,31,32,33,34,35,35,36,37,38,39,40,41,42}, {28,29,30,31,32,33,34,35,35,36,37,38,39,40,41,42,43}, {29,30,31,32,33,34,35,35,36,37,38,39,40,41,42,43,44}}; void setup() { M5.begin(); Wire.begin(0,26); M5.Lcd.setRotation(3); M5.Lcd.setTextColor(BLACK); pinMode(M5_BUTTON_HOME, INPUT); if (!bme.begin(0x76)){ Serial.println("Could not find a valid BMP280 sensor, check wiring!"); while (1); } Serial.print("\n\rCalibrate done.."); M5.Lcd.fillRect( 0, 0, 48,135, CYAN); M5.Lcd.fillRect( 48, 0, 48,135, GREEN); M5.Lcd.fillRect( 96, 0, 48,135, YELLOW); M5.Lcd.fillRect(144, 0, 48,135, ORANGE); M5.Lcd.fillRect(192, 0, 48,135, RED); timer = millis(); } void loop() { //表示モード 0:WBGT 1:不快指数(DI) static int ViewMode = 0; //温度データ取得 float tmp = dht12.readTemperature(); //温度データを小数点以下切り上げ int tmp_i = (tmp-0.1) + 1; //温度インデックス int index_tmp = tmp_i - 21; //湿度データ取得 float hum = dht12.readHumidity(); //湿度データを整数型に int hum_i = hum; //湿度インデックス int index_hum = hum / 5 - 3; //WBGT表示値 int WBGT_V = WBGT[index_tmp][index_hum]; //不快指数 int DI = 0.81*tmp+0.01*hum*(0.99*tmp-14.3)+46.3; //M5ボタンでモード切替 if(digitalRead(M5_BUTTON_HOME) == LOW){ ViewMode++; if(ViewMode==2) ViewMode=0; switch(ViewMode){ case 0: //WBGTモード M5.Lcd.fillRect( 0, 0, 48,135, CYAN); M5.Lcd.fillRect( 48, 0, 48,135, GREEN); M5.Lcd.fillRect( 96, 0, 48,135, YELLOW); M5.Lcd.fillRect(144, 0, 48,135, ORANGE); M5.Lcd.fillRect(192, 0, 48,135, RED); break; case 1: //不快指数モード M5.Lcd.fillRect( 0, 0, 30,135,CYAN); M5.Lcd.fillRect( 30, 0, 30,135,GREEN); M5.Lcd.fillRect( 60, 0, 30,135,GREENYELLOW); M5.Lcd.fillRect( 90, 0, 30,135,YELLOW); M5.Lcd.fillRect(120, 0, 30,135,ORANGE); M5.Lcd.fillRect(150, 0, 30,135,RED); M5.Lcd.fillRect(180, 0, 30,135,PURPLE); M5.Lcd.fillRect(210, 0, 30,135,MAROON); break; } while(digitalRead(M5_BUTTON_HOME)==LOW){} //モード切替後、すぐに表示させる timer -= 5000; } //画面描画 if(millis()>timer+refreshRate){ timer = millis(); switch(ViewMode){ case 0: //WBGTモード if(WBGT_V<=20){ M5.Lcd.fillRect(0,0,240,110,CYAN); }else if(WBGT_V>20 && WBGT_V<=24){ M5.Lcd.fillRect(0,0,240,110,GREEN); }else if(WBGT_V>24 && WBGT_V<=27){ M5.Lcd.fillRect(0,0,240,110,YELLOW); }else if(WBGT_V>27 && WBGT_V<=30){ M5.Lcd.fillRect(0,0,240,110,ORANGE); }else{ M5.Lcd.fillRect(0,0,240,110,RED); } M5.Lcd.setCursor(5, 80 ,4); M5.Lcd.printf("WBGT-------------------"); M5.Lcd.setCursor(120, 8 ,8); M5.Lcd.printf("%d",WBGT_V); break; case 1: //不快指数モード if(DI<=54){ M5.Lcd.fillRect(0,0,240,110,CYAN); }else if(DI<=60){ M5.Lcd.fillRect(0,0,240,110,GREEN); }else if(DI<=65){ M5.Lcd.fillRect(0,0,240,110,GREENYELLOW); }else if(DI<=70){ M5.Lcd.fillRect(0,0,240,110,YELLOW); }else if(DI<=75){ M5.Lcd.fillRect(0,0,240,110,ORANGE); }else if(DI<=80){ M5.Lcd.fillRect(0,0,240,110,RED); }else if(DI<=85){ M5.Lcd.fillRect(0,0,240,110,PURPLE); }else{ M5.Lcd.fillRect(0,0,240,110,MAROON); } M5.Lcd.setCursor(5, 80 ,4); M5.Lcd.printf("DI-------------------------"); M5.Lcd.setCursor(120, 8 ,8); M5.Lcd.printf("%d",DI); break; } M5.Lcd.setCursor(5, 20 ,4); M5.Lcd.printf("T: %2.1fC", tmp); M5.Lcd.setCursor(5, 50 ,4); M5.Lcd.printf("H: %2.0f%%", hum); } } |
表示して見比べると、
(ENV HAT 2つ持ってたんかいw)
液晶のサイズからくる見やすさではPlusの方が上、という感じがします。
一方、画面としてもまとまりというか、洗練された感は無印の方が上なように感じます。
(個人の感想ですし、画面作りのセンスによるところも大きいです。)
それよりなにより液晶の縦横比が変わったことによるレイアウトの再検討が案外大変でした。
無印→Plusへ(もちろん逆も)のスケッチの移植は、液晶画面に関して言うと、単純に座標をいじる程度では済まなさそうな印象です。
写真を見ても横方向よりも縦方向のノビが大きいのが分かります。
全体に解像度が上がったので元のままだと隅に縮こまって表示されますし、じゃあレイアウトはそのままにフォントサイズを大きくして座標をいじって…とすると今度は左右がパツパツに。
結局、温度湿度表示の「Temp」を「T」、「Humid」を「H」に縮めたら何とかそれらしくまとめられました。(がなんかまだ野暮ったい感じが…精進します。)
そういえば
スイッチサイエンスさんといえば通販の箱のフタの裏にひとことスタンプを押してくれるという遊びゴコロのあるサービス?(個人の感想です)
今回は、
「アイデアは無限大!」でした。
調べてみたらイタリア語らしく、なるほどわかってらっしゃる。(そりゃそうだ)
コメント