過去記事の改良②その2 LEDマトリックス表示を割り込み化 グラデーション版 

 

 前回の記事では、LEDマトリックスで文字をスクロール表示させるプログラムを、タイマー割り込み式にして他のプログラムと同時実行できるよう改良した。

 今回は、LEDマトリックスでグラデーション表示をさせるプログラムでタイマー割り込み化してみた。

 

 ただ、LEDマトリックスでグラデーション表示させてるプログラムは、まぁまぁ強引な方法でやってるので、スクロール系とは違った方法をとった。

スクロール系と同様に改造すると、ぜんぜんグラデーションにならない。 数値を調整してもうまくいかない。

原因はわかっているが、対策には大掛かりな改変が必要になるので、いつか気が向いたらにしようと思う。

 

 簡単にやる方法では一応の解決ができたので、ここに記しておこうと思う。

しかし、表示にちらつきが出たりちょっと汚いのよね。

 

 とりあえず、❤をグラデーションで表示するプログラムを改良したものを掲載しておく。

#include "Arduino_LED_Matrix.h"
#include "FspTimer.h"

unsigned char grd_mas[96] = {
0,5,6,6,5,0,0,4,2,1,0,0,
5,6,8,8,6,5,4,4,3,2,1,0,
5,6,8,8,6,5,4,3,3,2,1,0,
4,5,6,6,5,4,3,3,3,2,1,0,
0,4,5,5,4,3,3,3,2,1,0,0,
0,0,4,4,3,3,3,2,1,0,0,0,
0,0,0,3,3,3,2,1,0,0,0,0,
0,0,0,0,2,2,1,0,0,0,0,0,
};

unsigned char grd_cnt[96];
int cnt;

static FspTimer fsp_timer;

void setup() {
  //タイマー割り込みの設定
  uint8_t timer_type;
  int8_t timer_ch = FspTimer::get_available_timer(timer_type);
  if (timer_ch < 0) {
    Serial.println("get_available_timer() failed.");
    return;
  }
  fsp_timer.begin(TIMER_MODE_PERIODIC, timer_type, timer_ch, 6500.0, 50.0, timer_callback, nullptr);
  fsp_timer.setup_overflow_irq();
  fsp_timer.open();
  fsp_timer.start();

  for(cnt = 0; cnt < 96; cnt++)
    grd_mas[cnt] = pow(grd_mas[cnt], 2);
  memcpy(grd_cnt, grd_mas, sizeof(grd_mas));
  cnt = 64;

  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(100);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
}

void timer_callback(timer_callback_args_t *arg)
{
  for(int ic1 = 0; ic1 < 96; ic1++){
    if(grd_cnt[ic1] != 0){
      turnLed(ic1, 1);
      grd_cnt[ic1]--;
    }else{
      turnLed(ic1, 0);
    }
  }

  cnt--;
  if(cnt == 0){
    cnt = 64;
    memcpy(grd_cnt, grd_mas, sizeof(grd_mas));
  }
}