7セグLED表示 その4 4文字-HT16K33①
前回、74HC595を利用した4桁のLED表示器を点灯しました。ここでは、HT16K33というコントローラを搭載した4桁の7セグメントLEDを利用します。アマゾンで入手しました。エレメントが多くてアルファベットを表示できるのはQUAD ALPHANUMERICと呼ばれているようです。HT16K33は、バー・グラフの表示やマトリクスの表示器のコントロールにも使われています。
●HT16K33のおもな特徴
- 動作電圧 4.5~5.5V
- 輝度階調 16ステップ
- マトリクス 最大16×8
- 7セグメント 最大16セグメント、8コラム
- 読み書き自動インクリメント
- インターフェース I2C
●動作確認
次の接続で、動作を確認しました。
ライブラリは、検索でHT16K33で出てきたVitconCommonをインストールしました。
スケッチ例のHT16K33_basicを読み込みます。
マイコンに書き込んで実行します。表示できる文字がデモされます。
GitHubにソース・プログラムがあります。同様なライブラリにAdafruitのがあります。これもGitHubにソース・プログラムがあります。
I2Cスレーブ・アドレスは、0b1110 A2 A1 A0 R/Wです。基板の裏にA2 A1 A0用のジャンパが用意されていて、デフォルトではいずれもショートされていません。I2Cscannerでアドレスを確認すると0x70でした。
●温度を表示する
スケッチ例のHT16K33_basicを修正して、「23.5」℃を表示します。ドットは独自に設定します。
#include <VitconHT16K33.h>
using namespace vitcon;
HT16K33 fnd;
void setup() {
fnd.Init();
delay(1000);
}
void loop(){
fnd.SetBrightness(1);
fnd.Number(235);
fnd.Dot(2);
fnd.Clear(0);
fnd.Send();
fnd.SetBrightness(10);
delay(1000);
}
数値で23.5を与えるとLEDに表示するようにスケッチを変更します。-99.9~99.9の範囲で、小数点第1位までのフォーマットで表示します。
Init()は初期化です。Minus(0)は左端の桁にマイナス記号をセットします。Clear(0)は左端の桁を全セグメント消灯にセットします。Number(1,1)は2桁目に数値の1をセットします。これらの関数はライブラリの機能です。
String(Temp,DEC)は、数値データの温度Tempを10進数の文字に変換します。chartAt(0)は、文字列の最初の桁の数字を取り出します。-48は、10進数の表示=ASCII文字の数値は48のオフセットがあるので引いています。
float()はデフォルトで小数点第2位までの数値を返します。lenght()は文字列の長さを求めます。数値23.5は文字列「23.50」になっているので、5文字です。数値0は、文字列「0.00」なので4文字です。数値-10.5は、マイナスを最初に取り去るので10.5になり、文字列「10.50」なので5文字です。ドットを飛ばして、数字をセットします。
Dot(2)は3桁目にドットをセットします。Send()は、セットされたデータを表示部に送ります。
#include <VitconHT16K33.h>
using namespace vitcon;
HT16K33 fnd;
void setup() {
Serial.begin(9600);
fnd.Init();
delay(1000);
}
void loop(){
float Temp = 23.5;
if ( Temp<0 ) {
fnd.Minus(0); Temp= -1*Temp;
} else {
fnd.Clear(0);
}
if ( (String(Temp).length()) == 5) {
fnd.Number(1, (String(Temp,DEC).charAt(0) -48 ) );
fnd.Number(2, (String(Temp,DEC).charAt(1) -48 ) );
fnd.Number(3, (String(Temp,DEC).charAt(3) -48 ) );
} else if ( (String(Temp).length() ) == 4) {
fnd.Number(2, (String(Temp,DEC).charAt(0) -48 ) );
fnd.Number(3, (String(Temp,DEC).charAt(2) -48 ) );
}
fnd.Dot(2) ;
fnd.Send();
delay(1000);
}
●実際の温度表示
定番のアナログ温度センサLM35のA0端子に出力をつないで使います。接続を次に示します。LM35の電源は4V以上です。Arduino 5V端子をLED用に使って端子が空いていないので、臨時に5Vの電圧が出ているIOREF端子につないでいます。
温度を測るスケッチです。センサLM35の読み出した出力mVを百倍すると、摂氏が求まります。
int lm35 = analogRead(A0);
float Temp = (lm35 * 5.0 /1024) * 100 ;
Serial.println(Temp);
(2020/05/09)1023は間違いなので、1024に変更した。下記のスケッチも修正したが、実行結果は変更していない
全体のスケッチです。
#include <VitconHT16K33.h>
using namespace vitcon;
HT16K33 fnd;
void setup() {
Serial.begin(9600);
fnd.Init();
delay(1000);
}
void loop(){
int lm35 = analogRead(A0);
float Temp = (lm35 * 5.0 /1024) * 100 ;
Serial.println(Temp);
if ( Temp<0 ) {
fnd.Minus(0); Temp= -1*Temp;
} else {
fnd.Clear(0);
}
if ( (String(Temp).length()) == 5) {
fnd.Number(1, (String(Temp,DEC).charAt(0) -48 ) );
fnd.Number(2, (String(Temp,DEC).charAt(1) -48 ) );
fnd.Number(3, (String(Temp,DEC).charAt(3) -48 ) );
} else if ( (String(Temp).length() ) == 4) {
fnd.Number(2, (String(Temp,DEC).charAt(0) -48 ) );
fnd.Number(3, (String(Temp,DEC).charAt(2) -48 ) );
}
fnd.Dot(2) ;
fnd.Send();
delay(1000);
}
実行している様子です。