過去記事の改良②その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)); } }