高木のブログ

【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);
}

SNS でシェアする


ytkg

Written by ytkg, Twitter, GitHub