Arduino入門
#include <M5Unified.h>
// Pin mapping from DinMeter docs
static const int ENC_PIN_A = G41;
static const int ENC_PIN_B = G40;
static const int ENC_BTN_PIN = G42;
// Rotary state
volatile int encoderPosition = 0;
volatile int lastEncoded = 0;
void IRAM_ATTR onEncoderChange() {
int msb = digitalRead(ENC_PIN_A);
int lsb = digitalRead(ENC_PIN_B);
int encoded = (msb << 1) | lsb;
int sum = (lastEncoded << 2) | encoded;
if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) {
encoderPosition++;
} else if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) {
encoderPosition--;
}
lastEncoded = encoded;
}
void setup() {
auto cfg = M5.config();
M5.begin(cfg);
// Display setup
M5.Display.clear();
M5.Display.setTextColor(TFT_WHITE, TFT_BLACK);
M5.Display.setTextSize(2);
// Encoder pins
pinMode(ENC_PIN_A, INPUT_PULLUP);
pinMode(ENC_PIN_B, INPUT_PULLUP);
pinMode(ENC_BTN_PIN, INPUT_PULLUP);
// Attach interrupts directly by pin number
attachInterrupt(ENC_PIN_A, onEncoderChange, CHANGE);
attachInterrupt(ENC_PIN_B, onEncoderChange, CHANGE);
}
void loop() {
M5.update();
// ---- Button state ----
M5.Display.setCursor(10, 10);
if (digitalRead(ENC_BTN_PIN) == LOW) {
M5.Display.print("Pressed ");
} else {
M5.Display.print("Not pressed ");
}
// ---- Encoder position ----
M5.Display.setCursor(10, 60);
M5.Display.printf("Value: %d ", encoderPosition);
delay(100);
}
アップロード後、以下のような効果が確認できます