8×8ドットマトリックス4連(3)
さてあらためて、16×16で、「動き」のあるものを作りたいと考えると前回
const byte IMAGE_16x16[32]=
{//TA
//IW
B11111100,B00110000,
B10110100,B01111000,
B00110000,B11001100,
B00110000,B11001100,
B00110000,B11111100,
B00110000,B11001100,
B01111000,B11001100,
B00000000,B00000000,
B01111000,B11000110,
B00110000,B11000110,
B00110000,B11000110,
B00110000,B11010110,
B00110000,B11111110,
B00110000,B11101110,
B01111000,B11000110,
B00000000,B00000000
};
みたいに配列を用意したのはうまくなかったです。(自分の試行錯誤の記録なので許してください。)
書き込みは8×8ドットのデバイス一つずつに対して行いますですから、最初から、この領域ごとに扱えるようなデータにするのが望ましいでしょう。そうすると
const byte IMAGE_16x16[4][8]={
{//T
B11111100,
B10110100,
B00110000,
B00110000,
B00110000,
B00110000,
B01111000,
B00000000
},{//A
B00110000,
B01111000,
B11001100,
B11001100,
B11111100,
B11001100,
B11001100,
B00000000
},{//I
B01111000,
B00110000,
B00110000,
B00110000,
B00110000,
B00110000,
B01111000,
B00000000
},{//W
B11000110,
B11000110,
B11000110,
B11010110,
B11111110,
B11101110,
B11000110,
B00000000
}};
この形で16×16の1画面を表示するという風に扱う方がよさそうです。
これで、前回のコードを書き直します。
#include <LedControl.h>
const int DIN_PIN = 7;
const int CS_PIN = 6;
const int CLK_PIN = 5;
const int DEVICES = 4;
const byte IMAGE_16x16[4][8]={
{//T
B11111100,
B10110100,
B00110000,
B00110000,
B00110000,
B00110000,
B01111000,
B00000000
},{//A
B00110000,
B01111000,
B11001100,
B11001100,
B11111100,
B11001100,
B11001100,
B00000000
},{//I
B01111000,
B00110000,
B00110000,
B00110000,
B00110000,
B00110000,
B01111000,
B00000000
},{//W
B11000110,
B11000110,
B11000110,
B11010110,
B11111110,
B11101110,
B11000110,
B00000000
}};
LedControl display = LedControl(DIN_PIN, CLK_PIN, CS_PIN, DEVICES);
void setup() {
int devices = display.getDeviceCount();
for(int address=0;address<devices;address++) {
display.shutdown(address,false);
display.setIntensity(address,0);
display.clearDisplay(address);
};
displayImageL(IMAGE_16x16);
}
void displayImage(int device,const byte *image) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
display.setLed(device , i, j, bitRead(image[i], 7 - j));
}
}
}
void displayImageL(const byte image[4][8]){
displayImage(3, image[0]);
displayImage(2, image[1]);
displayImage(1, image[2]);
displayImage(0, image[3]);
}
void loop() {
}
これで、前回と同じ動作結果が得られています。
二次元配列を関数の引数とするやり方のところ
(void displayImageL(const byte image[4][8]) と書くところ)
でちょっと戸惑ったので、独立の記事にしておきます。
この記事が気に入ったらサポートをしてみませんか?