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);
}

 実行している様子です。

前へ

Trinket M0 (2) 1-WireのDS18B20で温度測定

次へ

7セグLED表示 その5 8文字-TM1638