見出し画像

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]) と書くところ)

でちょっと戸惑ったので、独立の記事にしておきます。

この記事が気に入ったらサポートをしてみませんか?