7セグLED表示 その8 4文字-HT16K33②

 アマゾンで入手した4桁のQUAD ALPHANUMERICは、コントローラHT16K33を搭載しています。第4回では7セグメントLEDの表示ライブラリにVitconCommonを使いました。このライブラリを少し修正して0~9までの数字と、いくつかの文字を表示できるようにしました。

接続

 製品の説明がないのではっきりわからないのですが、電源ピンが2本あります。片方はIC用、もう一つはLEDではないかと思われます。どちらも5Vへつなぎました。

HT16K33 Arduino UNO
SCL SCL
SDA SDA
GND GND
VCC 5V
Vi2C 5V

修正するライブラリのファイル

 ライブラリは、C:ドキュメント\Arduino\libraries\VitconCommonに入っています。修正するのは、VitconHT16K33.hとVitconHT16K33.cppです。7セグメントLEDではエレメントが七つ+ドットなので1バイトで指定ができました。この製品は14+ドット構成なので、2バイトのデータが必要です。そのためWireライブラリで2回に分けてデータを転送します。

修正したVitconHT16K33.h

 add部分が追加した関数です。

/*
VitconHT16K33.h
FND제어용 HT16K33 드라이버 모듈
2017-12-05 jjh
*/
#ifndef _VITCONHT16K33_H_
#define _VITCONHT16K33_H_

#include <Arduino.h>

namespace vitcon
{
const int DIGITS = 4;
class HT16K33
{
public:
HT16K33();
HT16K33(uint8_t addr);
void Init();
void SetBrightness(uint8_t val);

void Number(uint16_t value);
void Number(uint8_t index, uint8_t value);
void NumberQ(uint8_t index, uint16_t value); //add
void Dot(uint8_t index);
void Minus(uint8_t index);
void Byte(uint8_t index, uint8_t value);
void Clear();
void Clear(uint8_t index);
void Send();
void SendQ(); //add

private:
void SendByte(uint8_t data);
void SendBytes(uint8_t* data, uint16_t length);

void SendQ(uint16_t* data, uint16_t length); //add

// uint8_t mDigits[DIGITS];
uint16_t mDigits[DIGITS];
int mAddress;
};
}

#endif

 VitconHT16K33.cppの変更部分

 エレメントの指定を16ビットで行います。もとの8ビットのデータはコメントアウトし、0~9といくつかの文字、ドット、マイナス、ブランクを作成しました。アルファベットのすべての文字があるわけではありません。

 各ビットとエレメントの対応です。

/*
static const uint8_t FND_DIGITS[10]
= { 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110,
0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111
}; // from 0 to 9

static const uint8_t FND_DIGIT = 0b01111111;
static const uint8_t FND_DOT = 0b10000000;
static const uint8_t FND_MINUS = 0b01000000;
static const uint8_t FND_CLEAR = 0b00000000;
*/
 
static const uint16_t FND_DIGITS[]
= {
0b0011111100000000, //0
0b0000000000010010,
0b1101101100000000,
0b1100111110000000, //3
0b1110000000010010,
0b1110110100000000, //5
0b1111110100000000,
0b0000011100000000,
0b1111111100000000,
0b1110011100000000, //9
0b1111001100100000, //10 R
0b1111011000000000, //11 H
0b0000000100010010, //12 T
0b0111100100000000, //13 E
0b1110010000101101, //14 %

}; // from 0 to 9

//static const uint16_t FND_DIGIT = 0b0111111111111111;
static const uint16_t FND_DIGIT = 0b1111111111111111;
static const uint16_t FND_DOT = 0b0000000001000000;
static const uint16_t FND_MINUS = 0b1100000000000000;
static const uint16_t FND_CLEAR = 0b0000000000000000;

VitconHT16K33.cppの追加関数

 2バイトを送る関数を追加しました。

void HT16K33::SendQ()
{
Wire.beginTransmission(mAddress);
Wire.write(0x00);
for(int i=0;i<DIGITS;i++)
{
Wire.write(mDigits[i] >> 8);
Wire.write(mDigits[i] & 0xff);
}

Wire.endTransmission();

}

  数値(今回はいくつかの文字)の指定を2バイトに拡張しました。FND_DIGITのマスクは意味がありません。

void HT16K33::NumberQ(uint8_t index, uint16_t value)
{
mDigits[index] = (FND_DIGITS[value] & FND_DIGIT) | (mDigits[index] & ~FND_DIGIT) ;
}

 テスト・スケッチです。

#include <VitconHT16K33.h>
using namespace vitcon;
HT16K33 fnd;

void setup() {
Serial.begin(9600);
fnd.Init();
}

void loop(){
fnd.NumberQ(0,6);
fnd.NumberQ(1,3);
fnd.NumberQ(2,7);
fnd.NumberQ(3,14);
fnd.Dot(1) ;
fnd.SendQ();
delay(1000);
}

 実行したようすです。

数値23.5を表示

#include <VitconHT16K33.h>
using namespace vitcon;
HT16K33 fnd;

void setup() {
Serial.begin(9600);
fnd.Init();
}

void loop(){
float Temp = 23.5;
if ( Temp<0 ) {
fnd.Minus(0); Temp= -1*Temp;
} else {
fnd.NumberQ(0,12); //T
}

if ( (String(Temp).length()) == 5) {
fnd.NumberQ(1, String(String(Temp).charAt(0)).toInt() );
fnd.NumberQ(2, String(String(Temp).charAt(1)).toInt() );
fnd.NumberQ(3, String(String(Temp).charAt(3)).toInt() );
} else if ( (String(Temp).length() ) == 4) {
fnd.NumberQ(2, String(String(Temp).charAt(0)).toInt() );
fnd.NumberQ(3, String(String(Temp).charAt(2)).toInt() );
}
fnd.Dot(2) ;
fnd.SendQ();
delay(1000);
}

●温湿度の表示

 温湿度センサSHT31をつなぎました。温度と湿度を交互に表示します。

#include <VitconHT16K33.h>
#include <Wire.h>
#include "SHT31.h"
using namespace vitcon;
HT16K33 fnd;
SHT31 sht31 = SHT31();

void setup() {
Serial.begin(9600);
sht31.begin();
fnd.Init();
}

void loop(){
float temp = sht31.getTemperature();
float hum = sht31.getHumidity();
Serial.print("Temp = "); Serial.println(temp);
Serial.print("Hum = "); Serial.println(hum);

if ( temp<0 ) {
fnd.Minus(0); temp= -1*temp;
} else {
fnd.NumberQ(0,12); //T
}

if ( (String(temp).length()) == 5) {
fnd.NumberQ(1, String(String(temp).charAt(0)).toInt() );
fnd.NumberQ(2, String(String(temp).charAt(1)).toInt() );
fnd.NumberQ(3, String(String(temp).charAt(3)).toInt() );
} else if ( (String(temp).length() ) == 4) {
fnd.NumberQ(2, String(String(temp).charAt(0)).toInt() );
fnd.NumberQ(3, String(String(temp).charAt(2)).toInt() );
}
fnd.Dot(2) ;
fnd.SendQ();
delay(1000);

fnd.Clear();
fnd.NumberQ(1, String(String(hum).charAt(0)).toInt() );
fnd.NumberQ(2, String(String(hum).charAt(1)).toInt() );
fnd.Dot(2) ;
fnd.NumberQ(3,14);
fnd.SendQ();
delay(1000);
fnd.Clear();
}

 温度を表示しているところです。

 湿度を表示しているところです。

前へ

ESP32入門 通信機能が標準搭載されたマイコン・ボード (1) 準備

次へ

7セグLED表示 その9 4文字-HT16K33③