コンテスト用に作成。はんだ付けなしで作れるので、以前作ったM5Atomで作るワイヤレス譜めくりデバイス よりもカンタンに出来上がります。
コードは以下。
M5Stackのライブラリのほか、NimBLEライブラリとESP32 BLE Keyboard library が必要です。まだ整理中ですが、とりあえず。
#include<M5Atom.h>
#include <BleKeyboard.h>
#define DEBUG 0
bool bleState = false;
int base;
bool stateL, stateR;
int mode = 0;
const int keys[2][2]={{KEY_PAGE_DOWN, KEY_PAGE_UP},{KEY_RIGHT_ARROW, KEY_LEFT_ARROW}};
BleKeyboard bleKeyboard("M5Atom PageTurner");
void set_led(uint8_t r, uint8_t g, uint8_t b){
int color = (r << 16) | (g << 8) | b;
M5.dis.drawpix(0, color);
delay(30);
}
void showBleState(bool i){
if(i){
set_led(0,0,40); // 青: BLE接続中
} else {
set_led(40,0,0); // 赤: BLE未接続
}
}
int readTouchPin(){
int sum = 0;
for(int i=0; i<100; i++){
sum += touchRead(32);
delay(1);
}
if(DEBUG){ // 確認
Serial.print(base);
Serial.print(" - ");
Serial.print(sum);
Serial.print(" = ");
Serial.print(base - sum);
Serial.print("\t");
Serial.println("");
}
return sum;
}
void setup() {
M5.begin(true,false,true);
setCpuFrequencyMhz(80); // 240 or 160 or 80
set_led(0,0,0);
//int sum = 0;
//sum = readTouchPin();
delay(2000);
base = readTouchPin();
bleKeyboard.begin();
}
void loop() {
M5.update();
if(bleKeyboard.isConnected()) {
if(!bleState){
bleState= true;
Serial.println("connected...");
}
} else {
if(bleState){
bleState = false;
Serial.println("disconnected......");
}
}
int sum = readTouchPin();
if(sum < (base - 400)){ //280
set_led(0,150,0); // L 緑
stateL = true;
} else if(sum < (base - 120)){
set_led(150,60,0); // R オレンジ
stateR = true;
} else {
showBleState(bleState);
if(stateR && !stateL){
Serial.println("------------------ R ---------");
stateR = false;
bleKeyboard.write(keys[mode][0]);
delay(100);
} else if(stateL){
Serial.println("------------------ L ---------");
stateL = false;
stateR = false;
bleKeyboard.write(keys[mode][1]);
delay(100);
}
}
// モード切替
if(M5.Btn.wasPressed()){
mode ++;
if(mode >= 2){
mode = 0;
}
Serial.print("Button Pressed / mode: ");
Serial.println(mode);
set_led(0,0,0);
delay(100);
for(int i=0; i< mode +1; i++){
set_led(40,40,40);
delay(180);
set_led(0,0,0);
delay(90);
}
delay(300);
}
}
コメント