ボタンでMatrix LEDを操作する

最終更新日

ボタンを押して、Matrix LEDを操作するプログラムを組んでみた。

7×15 Matrix LED を Spresense 本体だけで使ってみる

2019.12.22

B-stem PDA01 SPRESENSE用機能拡張ボードのボタン

2020.01.03

これらを組み合わせて、7個のボタンを押すとLEDの表示が伸びるようにした。

プログラム

Matrix LEDの表示を attachInterrupt のcallback関数内で変更すると、assertしてしまう。
まあ、そうだろうとわかるので、 loop() の中で非同期に設定することにした。

また、ChangeState フラフを用いて、 matrix.clear() のによるちらつきを最小限にするように調整した。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_IS31FL3731.h>

// Initialize Matrix LED
Adafruit_IS31FL3731_Wing matrix = Adafruit_IS31FL3731_Wing();

// bars
#define WIDTH 7

// chanaged state
int8_t ChangeState = false;

static int8_t Bars[WIDTH];

void bar(int8_t x, int8_t y) {
  Bars[x] += y;
  ChangeState = true;
}

void  IrqDSW0() {
  Serial.print("DSW0\n");
  bar(0, 1);
}

void  IrqDSW1(){
  Serial.print("DSW1\n");
  bar(1, 1);
}

void  IrqDSW2(){
  Serial.print("DSW2\n");
  bar(2, 1);
}

void  IrqDSW3(){
  Serial.print("DSW3\n");
  bar(3, 1);
}

void  IrqDSW4(){
  Serial.print("DSW4\n");
  bar(4, 1);
}

void  IrqDSW5(){
  Serial.print("DSW5\n");
  bar(5, 1);
}

void  IrqDSW6(){
  Serial.print("DSW6\n");
  bar(6, 1);
}

void  attachIRQ() {
  pinMode( PIN_D12, INPUT_PULLUP );
  pinMode( PIN_D07, INPUT_PULLUP );
  pinMode( PIN_D06, INPUT_PULLUP );
  pinMode( PIN_D05, INPUT_PULLUP );
  pinMode( PIN_D09, INPUT_PULLUP );
  pinMode( PIN_D03, INPUT_PULLUP );
  pinMode( PIN_D11, INPUT_PULLUP );
  pinMode( PIN_D10, INPUT_PULLUP );

  attachInterrupt( PIN_D12, IrqDSW0, FALLING );
  attachInterrupt( PIN_D07, IrqDSW1, FALLING );
  attachInterrupt( PIN_D06, IrqDSW2, FALLING );
  attachInterrupt( PIN_D05, IrqDSW3, FALLING );
  attachInterrupt( PIN_D09, IrqDSW4, FALLING );
  attachInterrupt( PIN_D03, IrqDSW5, FALLING );
  attachInterrupt( PIN_D11, IrqDSW6, FALLING );
}

void setup() {
  Serial.begin(115200);

  Serial.println("ISSI manual animation test");
  if (! matrix.begin()) {
    Serial.println("IS31 not found");
    while (1);
  }
  Serial.println("IS31 Found!");

  for (int8_t n = 0; n <= WIDTH; n++) {
    Bars[n] = 0;
  }

  //  set interrupt functions
  attachIRQ();
}

void loop() {

  if (ChangeState == false) {
    // no change
    return;
  }
  matrix.clear();  
  for (int8_t n = 0; n <= WIDTH; n++) {
    matrix.drawLine(0, n, Bars[n], n, 127);
  }
  ChangeState = false;
  delay(100);
}

シェアする