7セグLED表示 その3 4文字
1桁の数字が表示できました。同じ7セグのボードを追加して、SDOを次のSDIへつなげれば、データはシフトしていくので2桁、それ以上の表示ができます。ebayなどでは4桁の7セグLEDが購入できます。何種類もの製品があり、機能が異なっています。時計用にコロンを表示できるものやコロンとドットの両方が表示できるモデルもありますが、これらはコントローラが74HC595ではありません。
最初に確認するのは、ボードの裏に74HC595が4個ついていることです。2個の場合は、表示を常にリフレッシュしないと消えてしまいます。4個のボードでは、一度4文字分を送ってしまえば、その後何もデータを送らないでも表示されたままです。'1'でLEDのセグメントが点灯するのと'0'で点灯する製品があります。これはプログラムで対処できます。なお、ピンの名称がいろいろあります。
●接続
LOAD端子は、製品によってQH、CS、STBなどさまざまです。シルク印刷の矢印方向へデータはシフトしていきます。
●スケッチ
温度を表示します。センサは前回と同じくLM60を使い、Arduinoのアナログ入力に出力Voutを入れるので、小数点の位は確度として意味がありません。しかし、ここでは表示例として、小数点第2位まで表示します。
入手した4桁7セグLEDは、前回まで使用したカソード・コモンの1桁とは異なり、'0'でLEDのセグメントが点灯します。前回のスケッチのmoji[]のビットを反転させました。また、全部のセグメントを消すblankを追加しました。
loop()の最初は、全部のデータを消します。
最初に送ったデータは、次のデータが送られるとシフトされていきます。したがって、温度データの5番目から表示します。3番目は小数点なので読み飛ばします。
#include <SPI.h>
#define SS 10 // Chip Select
#define MOSI 11
#define SCK 13
char moji[17]{
B11000000, // 0
B11111001, // 1
B10100100, // 2
B10110000, // 3
B10011001, // 4
B10010010, // 5
B10000010, // 6
B11111000, // 7
B10000000, // 8
B10011000, // 9
B10100000, // a
B10000011, // b
B10100111, // c
B10100001, // d
B10000110, // e
B10001110, // f
B11111111 //blank
};
void setup() {
pinMode(SS,OUTPUT); digitalWrite(SS,1);
Serial.begin (9600);
SPI.begin();
}
void loop() {
for (int i=0 ; i<4;i++ ) {
digitalWrite(SS,0);
SPI.transfer(moji[16]); //blank
digitalWrite(SS,1);
}
int sensorValueA0 = analogRead(A0);
float voltageA0 = sensorValueA0 * (5 / 1023.0);
float Temp=(voltageA0-0.424)/0.00625;
Serial.println(Temp,3);
digitalWrite(SS,0);
SPI.transfer(moji[String((String(Temp, DEC).charAt(4))).toInt()]);
digitalWrite(SS,1);
digitalWrite(SS,0);
SPI.transfer(moji[String((String(Temp, DEC).charAt(3))).toInt()]);
digitalWrite(SS,1);
digitalWrite(SS,0);
SPI.transfer(moji[String((String(Temp, DEC).charAt(1))).toInt()] ^ B10000000);
digitalWrite(SS,1);
digitalWrite(SS,0);
SPI.transfer(moji[String((String(Temp, DEC).charAt(0))).toInt()]);
digitalWrite(SS,1);
delay(2000);
}
実行中の様子です。