【M5Unified】サンプルコード(ボタン、加速度センサー・ジャイロセンサー編)
2023/03/06
画面ありの M5Stack シリーズを M5Unified ライブラリを使っていろいろ試した際に生まれたコード群
GitHub に上げるほどでもないのでここに残す
今回は、ボタン、加速度センサー・ジャイロセンサー編
Arduino 言語(ほぼ C 言語)は書き慣れていないので参考程度に
インデントは半角スペース4つでいいのだろうか
ボタン
ボタンクリックで ON/OFF 切り替え
#include <M5Unified.h>
bool state = false;
void setup() {
auto cfg = M5.config();
cfg.clear_display = true;
M5.begin(cfg);
M5.Lcd.setTextSize(1);
M5.Lcd.println("Click Button");
print(state);
}
void loop() {
M5.update();
if (M5.BtnA.wasClicked()) {
state = !state;
print(state);
}
}
void print(int state) {
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 10);
M5.Lcd.print(state ? "ON " : "OFF");
}
何連続クリックしたかカウント
#include <M5Unified.h>
void setup() {
auto cfg = M5.config();
cfg.clear_display = true;
M5.begin(cfg);
M5.Lcd.setTextSize(1);
M5.Lcd.println("Click Button");
}
void loop() {
M5.update();
if (M5.BtnA.wasDeciedClickCount()) {
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 10);
M5.Lcd.printf("%d Clicked ", M5.BtnA.getClickCount());
}
}
ボタンクリックのカウントアップ、長押しでリセット
#include <M5Unified.h>
int count = 0;
void setup() {
auto cfg = M5.config();
cfg.clear_display = true;
M5.begin(cfg);
M5.Lcd.setTextSize(1);
M5.Lcd.println("Please click button");
print(count);
}
void loop() {
M5.update();
if (M5.BtnA.wasClicked()) {
count++;
print(count);
}
if (M5.BtnA.pressedFor(1000)) {
count = 0;
print(count);
}
}
void print(int count) {
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 10);
M5.Lcd.printf("Count: %d ", count);
}
メニュー画面。ボタンクリックで選択切り替え、長押しで決定。もう1度長押しで選択し直し
#include <M5Unified.h>
int step = 1;
bool is_operation_locked = false;
char *menu[] = {"MenuA", "MenuB", "MenuC"};
int selected_menu_index = 0;
void setup() {
auto cfg = M5.config();
cfg.clear_display = true;
M5.begin(cfg);
print_step_1();
}
void loop() {
M5.update();
if (is_operation_locked) {
if (M5.BtnA.wasReleased()) {
is_operation_locked = false;
}
return;
}
if (step == 1) {
if (M5.BtnA.wasClicked()) {
selected_menu_index++;
if (selected_menu_index >= 3) {
selected_menu_index = 0;
}
print_select_menu();
}
if (M5.BtnA.pressedFor(1000)) {
step = 2;
is_operation_locked = true;
print_step_2();
}
} else if(step == 2) {
if (M5.BtnA.pressedFor(1000)) {
step = 1;
is_operation_locked = true;
print_step_1();
}
}
}
void print_step_1() {
M5.Lcd.clear();
M5.Lcd.setTextSize(1);
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("Please select menu");
print_select_menu();
}
void print_step_2() {
M5.Lcd.clear();
M5.Lcd.setTextSize(1);
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("Slected menu");
print_selected_menu();
}
void print_select_menu() {
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 10);
for (int i = 0; i < 3; i++) {
bool is_selected = i == selected_menu_index;
M5.Lcd.printf("%s %s\n", is_selected ? ">" : " ", menu[i]);
}
}
void print_selected_menu() {
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 10);
M5.Lcd.printf("%s!!!", menu[selected_menu_index]);
}
加速度センサー、ジャイロセンサー
加速度とジャイロの表示、ボタンクリックで表示する画面切り替え
#include <M5Unified.h>
int state = 0;
float ax, ay, az, gx, gy, gz, t;
void setup() {
auto cfg = M5.config();
cfg.clear_display = true;
M5.begin(cfg);
M5.Imu.begin();
}
void loop() {
M5.update();
if (M5.BtnA.wasClicked()) {
state = 1 - state;
}
if (state == 0) {
M5.Display.setCursor(0, 0);
M5.Lcd.setTextSize(1.5);
M5.Imu.getAccel(&ax, &ay, &az);
M5.Display.printf("ax: %3.1f \n", ax);
M5.Display.printf("ay: %3.1f \n", ay);
M5.Display.printf("az: %3.1f ", az);
} else {
M5.Display.setCursor(0, 0);
M5.Lcd.setTextSize(1.5);
M5.Imu.getGyro(&gx, &gy, &gz);
M5.Display.printf("gx: %3.1f \n", gx);
M5.Display.printf("gy: %3.1f \n", gy);
M5.Display.printf("gz: %3.1f ", gz);
}
delay(100);
}