青ポスの部屋

旅と技術とポエムのブログ

M5StickCでBluetoothスクショボタンを作る

概要

前回M5AtomでBluetoothスクショボタンを作りました。しかしM5Atomにはバッテリーがなく毎度USB電源を使わないといけないので、取り回しが不便です。

そこでM5StickCに移植しました。M5StickCは最近バンドなどの付属品を取り払った廉価版(300円くらい安い)が出て入手しやすくなりました。またM5StickC+というLCDがちょっと大きくなったりパワーアップしたバージョンも出ました。

www.switch-science.com

www.switch-science.com

GitHubリポジトリ

github.com

ボタン配置

M5Atomに比べてM5StickCはボタンが複数あります。そのためM5AtomではM5.Btnで取得するところをM5.BtnAと変更します。

LCDの制御

M5AtomではLEDでBluetoothの接続状態を表示していましたが、M5StickCにはLCDがあります*1。なのでLCDで接続状態を表示します。

LEDの色変更は簡単に上書きできますが、LCDの場合文字列をきれいに表示するのは実は結構面倒です。今回「Disconnected」「Connected」の2種類の表示がありますが、Bluetoothの接続に成功してConnectedに変更するとき、単にprintlnするだけでは余りの部分が残ってしまい「Connectedted」みたいな表示になります。

そうならないためには定期的に画面をM5.Lcd.fillScreen(BLACK)でリセットする必要があります。しかし10msとかの間隔でリセットすると画面がちらついてしまいます。printlnする前だけリセットするようにすればよいように見えますが、文字が変わらない場合にも「リセットしてprintln」という処理が流れるのでちらついてしまいます。

そこで1フレーム前の接続状態をbooleanに保存しておき、現在の接続状態と異なる場合のみ画面をリセットするようにします。こうすることで画面がちらつかないできちんと表示を切り替えることができます。

ソースコード

#include <M5StickC.h>
#include <BleKeyboard.h>

BleKeyboard bleKeyboard("M5PrintScreen");
boolean bt_is_connected; 

void setup() {
  M5.begin();

  M5.Axp.ScreenBreath(8);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setRotation(1);
  M5.Lcd.setTextSize(2);
  
  bleKeyboard.begin();
  bt_is_connected=false;
}

void loop() {
  M5.BtnA.read();
  M5.Lcd.setCursor(0,0);

  if(bt_is_connected != bleKeyboard.isConnected()){
    M5.Lcd.fillScreen(BLACK);
  }
  bt_is_connected=bleKeyboard.isConnected();
  
  if(bleKeyboard.isConnected()){
    M5.Lcd.println("Connected");
    if(M5.BtnA.isPressed()){
      bleKeyboard.write(0xCE);     
      Serial.println("presed");
      delay(500);
    }
   }else{
    M5.Lcd.println("Disconnected");
  }
  
  delay(10);
}

*1:M5StickCにはLEDもついていますが、1色しかないし筐体の中にあるので接続状態の表示には不十分です。