電光掲示板
せっかくなので、電光掲示板的なものを作りたい。スクロールするやつ。
作戦を練る
なんか参考サイト的なものを探したのだけれど、探し方が悪いのかあんまよく分からなかったので作戦を練る。電光掲示板の表示の流れを分解していくと、表示したいデータを作って、現在の表示を右にひとマスずつずらして、表示したいデータの一番左から順に、ひとマスずらした空きの所にはめ込んで、また表示してあげれば流れていくように見えるはず。…はず。
こんな感じ。
とりあえず、きれいなコードとか、再利用しやすいコードとか、汎用性のあるコードとか、意識せずにとにかくまず動くものを作ろう。
表示したいデータを作る
フォントからビットデータ作るとか高尚なことが分からんので、美咲フォントを参考に、手打ちでエクセルを使いつつ配列データを作った。
これが
const boolean data[8][24] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0},
{1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
{1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
{1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
{0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0}
};
こうなる。
コード書く
#include <ht16k33.h>
HT16K33 HT;
uint8_t disptable[8][16][2] = {
{{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}, {7, 0}, {8, 0}, {9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0}},
{{16, 0}, {17, 0}, {18, 0}, {19, 0}, {20, 0}, {21, 0}, {22, 0}, {23, 0}, {24, 0}, {25, 0}, {26, 0}, {27, 0}, {28, 0}, {29, 0}, {30, 0}, {31, 0}},
{{32, 0}, {33, 0}, {34, 0}, {35, 0}, {36, 0}, {37, 0}, {38, 0}, {39, 0}, {40, 0}, {41, 0}, {42, 0}, {43, 0}, {44, 0}, {45, 0}, {46, 0}, {47, 0}},
{{48, 0}, {49, 0}, {50, 0}, {51, 0}, {52, 0}, {53, 0}, {54, 0}, {55, 0}, {56, 0}, {57, 0}, {58, 0}, {59, 0}, {60, 0}, {61, 0}, {62, 0}, {63, 0}},
{{64, 0}, {65, 0}, {66, 0}, {67, 0}, {68, 0}, {69, 0}, {70, 0}, {71, 0}, {72, 0}, {73, 0}, {74, 0}, {75, 0}, {76, 0}, {77, 0}, {78, 0}, {79, 0}},
{{80, 0}, {81, 0}, {82, 0}, {83, 0}, {84, 0}, {85, 0}, {86, 0}, {87, 0}, {88, 0}, {89, 0}, {90, 0}, {91, 0}, {92, 0}, {93, 0}, {94, 0}, {95, 0}},
{{96, 0}, {97, 0}, {98, 0}, {99, 0}, {100, 0}, {101, 0}, {102, 0}, {103, 0}, {104, 0}, {105, 0}, {106, 0}, {107, 0}, {108, 0}, {109, 0}, {110, 0}, {111, 0}},
{{112, 0}, {113, 0}, {114, 0}, {115, 0}, {116, 0}, {117, 0}, {118, 0}, {119, 0}, {120, 0}, {121, 0}, {122, 0}, {123, 0}, {124, 0}, {125, 0}, {126, 0}, {127, 0}}
};
const boolean data[8][24] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0},
{1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
{1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
{1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
{0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0}
};
void moveline() {
for (int i = 0 ; i < 8; i++) {
for (int j = 1; j < 16; j++) {
disptable[i][j - 1][1] = disptable[i][j][1];
}
}
}
void dispset() {
for (int i = 0 ; i < 8; i++) {
for (int j = 0; j < 16; j++) {
if (disptable[i][j][1] == 1) {
HT.setLed(disptable[i][j][0]);
} else {
HT.clearLed(disptable[i][j][0]);
}
}
}
}
void setup() {
HT.begin(0x00);
}
void loop() {
for (int i = 0 ; i < 24; i++) {
moveline();
for (int j = 0; j < 8; j++) {
if (data[j][i]) {
disptable[j][15][1] = 1;
} else {
disptable[j][15][1] = 0;
}
}
HT.clearAll();
dispset();
HT.sendLed();
delay(100);
}
for (int i = 0 ; i < 24; i++) {
moveline();
HT.clearAll();
dispset();
HT.sendLed();
delay(100);
}
}
そんで
動画だとちらついてるけど、実際目で見るといい感じです。コードきったないけどとりあえず動いた。次の段階に行けるだろうか。
縦方向も
#include <ht16k33.h>
HT16K33 HT;
uint8_t disptable[16][8][2] = {
{{112, 0}, {96, 0}, {80, 0}, {64, 0}, {48, 0}, {32, 0}, {16, 0}, {0, 0}},
{{113, 0}, {97, 0}, {81, 0}, {65, 0}, {49, 0}, {33, 0}, {17, 0}, {1, 0}},
{{114, 0}, {98, 0}, {82, 0}, {66, 0}, {50, 0}, {34, 0}, {18, 0}, {2, 0}},
{{115, 0}, {99, 0}, {83, 0}, {67, 0}, {51, 0}, {35, 0}, {19, 0}, {3, 0}},
{{116, 0}, {100, 0}, {84, 0}, {68, 0}, {52, 0}, {36, 0}, {20, 0}, {4, 0}},
{{117, 0}, {101, 0}, {85, 0}, {69, 0}, {53, 0}, {37, 0}, {21, 0}, {5, 0}},
{{118, 0}, {102, 0}, {86, 0}, {70, 0}, {54, 0}, {38, 0}, {22, 0}, {6, 0}},
{{119, 0}, {103, 0}, {87, 0}, {71, 0}, {55, 0}, {39, 0}, {23, 0}, {7, 0}},
{{120, 0}, {104, 0}, {88, 0}, {72, 0}, {56, 0}, {40, 0}, {24, 0}, {8, 0}},
{{121, 0}, {105, 0}, {89, 0}, {73, 0}, {57, 0}, {41, 0}, {25, 0}, {9, 0}},
{{122, 0}, {106, 0}, {90, 0}, {74, 0}, {58, 0}, {42, 0}, {26, 0}, {10, 0}},
{{123, 0}, {107, 0}, {91, 0}, {75, 0}, {59, 0}, {43, 0}, {27, 0}, {11, 0}},
{{124, 0}, {108, 0}, {92, 0}, {76, 0}, {60, 0}, {44, 0}, {28, 0}, {12, 0}},
{{125, 0}, {109, 0}, {93, 0}, {77, 0}, {61, 0}, {45, 0}, {29, 0}, {13, 0}},
{{126, 0}, {110, 0}, {94, 0}, {78, 0}, {62, 0}, {46, 0}, {30, 0}, {14, 0}},
{{127, 0}, {111, 0}, {95, 0}, {79, 0}, {63, 0}, {47, 0}, {31, 0}, {15, 0}}
};
const boolean data[24][8] = {
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 1, 0, 1, 0},
{1, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 1, 0, 1, 1, 1, 0},
{0, 1, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 1, 0, 0, 0},
{1, 0, 0, 1, 0, 0, 0, 0},
{1, 0, 0, 0, 1, 1, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 1, 1, 0, 0},
{1, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 1, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 1, 0, 0, 0, 1, 0},
{0, 0, 1, 0, 0, 0, 1, 0},
{0, 0, 0, 1, 1, 1, 0, 0}
};
void moveline() {
for (int i = 1; i < 16; i++) {
for (int j = 0 ; j < 8; j++) {
disptable[i - 1][j][1] = disptable[i][j][1];
}
}
for (int k = 0; k < 8; k++) {
disptable[15][k][1] = 0;
}
}
void dispset() {
for (int i = 0; i < 16; i++) {
for (int j = 0 ; j < 8; j++) {
if (disptable[i][j][1] == 1) {
HT.setLed(disptable[i][j][0]);
} else {
HT.clearLed(disptable[i][j][0]);
}
}
}
}
void setup() {
HT.begin(0x00);
HT.setBrightness(1);
}
void loop() {
for (int j = 0 ; j < 24; j++) {
moveline();
for (int i = 0; i < 8; i++) {
if (data[j][i]) {
disptable[15][i][1] = 1;
} else {
disptable[15][i][1] = 0;
}
}
HT.clearAll();
dispset();
HT.sendLed();
delay(100);
}
for (int i = 0 ; i < 24; i++) {
moveline();
HT.clearAll();
dispset();
HT.sendLed();
delay(100);
}
}
縦でもやってみた。moveline()に最後の行が繋がっちゃうバグが有ったので対処した。あと眩しいので暗くした。