こんばんは!
今回は7セグメントディスプレイを使ってタイマーを作っていきたいと思います。
使用するもの
・Arduinoメインボード(https://amzn.to/2vkPIUH)
・USBケーブル(https://amzn.to/2UHhntl)
・ブレッドボード(https://amzn.to/38eNi8u)
・ジャンパワイヤ (https://amzn.to/39uBU8T)
・7セグメントディスプレイOSL40562-LR(http://akizukidenshi.com/catalog/g/gI-03673/)
7セグメントディスプレイについて
7セグメントディスプレイ(以下7セグ)とは数値を示す7つとドットを示す1つのLEDが配置されているものです。
部品の耐久性が高いため、幅広い分野で使用されています。
7セグにはアノード(+極)が共通の「アノードコモン」、カソード(ー極)が共通の「カソードコモン」の二つがあります。
アノードコモンとカソードコモンでは配線が異なるので注意が必要です。
7セグは図のようにa~gとdpのLEDが割り振られており、それぞれのLEDのON、OFFによって数字を表現します。
例えばa、b、g、e、dのLEDをONにすると数字の2を表現することができます。
今回は4桁のカソードコモンの7セグを使っていきます。
手順
まずハード側からやっていきます。OSL40562-LRのデータシートを見てArduinoボードと接続します。
データシートはこちらから見ることができます。
http://akizukidenshi.com/catalog/g/gI-03673/
今回はハード側はこれだけです。次にプログラムを書いていきます。
Arduino IDEを開いて次のコードを書き込んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | int leftL = 12; //most left LED int sleftL = 9; //second left LED int srightL = 8; //second right LED int rightL = 6; //most right LED #define LED_ON LOW #define LED_OFF HIGH #define DISPLAY_BRIGHTNESS 1 int segA = 11; int segB = 7; int segC = 4; int segD = 2; int segE = 0; int segF = 10; int segG = 5; int DP = 3; void setup() { pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT); pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT); pinMode(segG, OUTPUT); pinMode(leftL, OUTPUT); pinMode(sleftL, OUTPUT); pinMode(srightL, OUTPUT); pinMode(rightL, OUTPUT); } void loop(){ int sec = millis()/1000; lightNumber(sec); delay(DISPLAY_BRIGHTNESS); } void lightNumber(int sec){ int thousands = (sec/1000)%10; int hundreds = (sec/100)%10; int tens = (sec/10)%10; int ones = sec%10; digit(4); segNumber(thousands); delay(DISPLAY_BRIGHTNESS); digit(3); segNumber(hundreds); delay(DISPLAY_BRIGHTNESS); digit(2); segNumber(tens); delay(DISPLAY_BRIGHTNESS); digit(1); segNumber(ones); delay(DISPLAY_BRIGHTNESS); } void digit(int digit){ digitalWrite(leftL,LED_OFF); digitalWrite(sleftL,LED_OFF); digitalWrite(srightL,LED_OFF); digitalWrite(rightL,LED_OFF); switch(digit){ case 4: digitalWrite(leftL,LED_ON); break; case 3: digitalWrite(sleftL,LED_ON); break; case 2: digitalWrite(srightL,LED_ON); break; case 1: digitalWrite(rightL,LED_ON); break; } } void segNumber(int displayNumber) { #define SEGMENT_ON HIGH #define SEGMENT_OFF LOW switch (displayNumber) { case 0: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_OFF); break; case 1: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break; case 2: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_ON); break; case 3: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_ON); break; case 4: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 5: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 6: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 7: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break; case 8: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 9: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 10://off all LED digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break; } } |
簡単に説明すると
segNumber関数は数字を表示するためのものです。
1の時は数字の1を表示するためにbとc、2の時は2を表示するためにa、b、d、e、gの部分を光らせるようにしています。
digit関数はけた数を決定するための関数です。入力された数字に応じてけた数を決定できるようになっています。
lightNumber関数で数字を表示するための処理を記述しています。
millis()はarduinoを起動してからの経過時間(ms)を読み取るものです。単位がミリ秒なのでmillis()を1000で割れば1秒を測ることができます。
カソードコモンの7セグを使ってるためLOWで点灯するので、LED_ONをLOW、LED_OFFをHIGHにしています。
アノードコモンの場合はHIGH,LOW逆になるので注意してください。
マイコンボードに書き込むと
ちゃんと経過時間が表示されました。
まとめ
今回は7セグを使って数字表記をすることができました。
今回は経過時間を測る目的で使用しましたが、温度センサと組み合わせて温度を表示したり、距離センサと組み合わせて距離を表示したりと様々な用途に使えると思います。
今回はこれで終わります。
ではまた!