pdf-icon

Arduino入門

2. デバイス&サンプル

DinMeter エンコーダー表示

機能説明
エンコーダーを回すと画面上の値がリアルタイムに増減し、エンコーダーボタンを押すと「Pressed」と表示、離すと「Not pressed」と表示されます。

cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#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);
}

アップロード後、以下のような効果が確認できます

On This Page