バイトで表す数字のパターン
CoddyのArduinoジャーニー「ディスプレイとセンサー」セクションの一部。レッスン 2/24。
数字ごとにdigitalWrite()を7行書くのは、かなりのコード量です。各数字をパターンとして保存しましょう。1ビットが1つのセグメントを表し、点灯なら1、消灯なら0です。
byteは、8ビットで構成される0から255までの整数です。先頭に0bを付けて2進数で書きます。ビットは右から読みます。最後のビットがセグメントa、その左がbで、gまで続きます。
// gfedcba
byte one = 0b0000110; // bとc: 110個のパターンは配列に収まるので、digits[3]は3のパターンです。2進カウンターで使ったbitRead()は、右端から数えて0から始め、パターンのビットを1つ読み取ります。
bitRead(0b0000110, 0) // 0: セグメントaは消灯
bitRead(0b0000110, 1) // 1: セグメントbは点灯関数でforループを使って7つのビットを順に確認し、各セグメントのピンを設定できます。これで、どの数字もshowDigit(7);の1回の呼び出しで表示できます。
チャレンジ
中級スターターには4と7を除くすべてのパターンがあり、loop()は1、4、7を表示します。
- 4(セグメント
b、c、f、g)と7(a、b、c)を埋める showDigit(n)を書く:0から6までの各iについて、digits[n]のビットiが1の場合はsegmentPins[i]をLOWに、0の場合はHIGHに設定する
Runを押してから、Checkを押します。
自分で試してみよう
const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8}; // a, b, c, d, e, f, g
// 1桁につき1つのパターン。右から読み、右端のビットがセグメントaに対応します。
// gfedcba
const byte digits[10] = {
0b0111111, // 0
0b0000110, // 1
0b1011011, // 2
0b1001111, // 3
0b0000000, // 4: 埋める
0b1101101, // 5
0b1111101, // 6
0b0000000, // 7: 埋める
0b1111111, // 8
0b1101111 // 9
};
void showDigit(int n) {
// digits[n]のセグメントを点灯し、ほかは消灯する
}
void setup() {
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
}
}
void loop() {
showDigit(1);
delay(1000);
showDigit(4);
delay(1000);
showDigit(7);
delay(1000);
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ディスプレイとセンサーのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド