7セグLED表示 その7 4文字-TM1637
TM1637は、120~200円と安価な時刻表示用の4桁7セグメントLED表示器に使われています。ebayで入手しました。表示の中央にコロンがある製品が多いのですが、各桁にドットがある製品も見つかります。電圧などを表示するにはそのほうがよいです。
●TM1637のおもな特徴
- 電源電圧 3.3/5V
- 表示 8セグメント×6ビット
- キー・スキャン 8×2ビット
- 輝度 8レベル
- インターフェース CLK、DIO
●インターフェース
2線式なのでI2Cと思いましたが、データシートにはスレーブ・アドレスはないと書かれています。しかし、スタート・コンディション、ストップ・コンディションはあり、表示器はACKを返します。
●ライブラリ
検索で、二つ見つかりました。TM1637と書かれたライブラリをインストールしました。
●接続
サンプル・スケッチの中に書かれていた配線に合わせました。
TM1637 | Arduino UNO |
---|---|
CLK | 2 |
DIO | 3 |
Vcc | 5V |
GND | GND |
●スケッチ
サンプルのTM1637TESTを修正して、23:56の数字を表示しました。小数点を表すドットがないので、コロンを表示しています。showNumberDecEx()の1番目の引数は、数値データをそのまま表示し、2番目の引数は小数点の位置を、3番目の引数は上位桁の0を表示するか表示しないかを指示します。
#include <Arduino.h>
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
void setup() {
}
void loop() {
uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
display.setBrightness(0x0f);
display.showNumberDecEx(2356,0x40,true);
delay(2000);
display.showNumberDecEx(2356,0x0,true);
delay(2000);
}
真ん中のコロンは動かせないので、小数点の代わりに使おうとすると、マイナス符号を数字の先頭に入れられません。最後の桁に、プラスならブランクを、零下の温度ならマイナス符号を表示するようにします。
ss.replace(".", "")は、温度データの文字列の中にあるドットを消します。
#include <Arduino.h>
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
void setup(){
Serial.begin(9600);
}
void loop() {
byte data[] = { 0, 0, 0, 0 };
display.setBrightness(0x0a);
float Temp = -48.5;
if ( Temp<0 ) {
data[3] = 64 ; //SEG_G '-'
} else {
data[3] = 0; // blank
}
String ss = String(Temp);
ss.replace(".", ""); ss.replace("0", "");
Serial.println(ss);
display.setSegments(data); // - or blank
display.showNumberDecEx(ss.toInt(),0x40,true,3,0);
delay(2000);
}
●温度と湿度を交互に表示する
温湿度センサSHT31から読み出した温度と湿度データを使って表示します。
setSegments()は、byteデータがそれぞれの桁の表示値です。0は全エレメント消灯、1はエレメントa、2はエレメントb、3はエレメントaとb、4はエレメントc、5はエレメントaとc、...、64はエレメントg、...、255は全セグメントの点灯です。
SEG_A~SEG_Gは、7セグメントのエレメントを個別に光らせるために使います。
showNumberDecEx()の1番目の引数は表示させる数値データ、2番目の引数は小数点の位置を、3番目の引数は上位桁の0サプレス表示/非表示を、4番目の引数は数値データの表示桁数(最小桁から数える)を、5番目の引数は表示スタート桁(0がオフセットなし、1は2桁目から)を指示します。
#include <Arduino.h>
#include <Wire.h>
#include "SHT31.h"
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
SHT31 sht31 = SHT31();
TM1637Display display(CLK, DIO);
const byte __RH[] = {
SEG_D, // _
SEG_D, // _
SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // R
SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // H
};
void setup(){
sht31.begin();
Serial.begin(9600);
}
void loop() {
float Temp = sht31.getTemperature();
float Hum = sht31.getHumidity();
Serial.print("Temp = "); Serial.println(Temp);
Serial.print("Hum = "); Serial.println(Hum);
byte data[] = { 0, 0, 0, 0 }; //all blank
display.setBrightness(0x0a);
if ( Temp<0 ) {
data[3] = 64 ; Temp = -1 * Temp; //SEG_G '-'
} else {
data[3] = 0; // blank
}
String ss = String(Temp);
ss.replace(".", "");
Serial.println(ss);
String sss = String(ss.charAt(0))+String(ss.charAt(1))+String(ss.charAt(2));
display.setSegments(data); // - or blank
display.showNumberDecEx(sss.toInt(),0x40,true,3,0);
delay(2000);
String hh = String(Hum);
String hhh = String(hh.charAt(0))+String(hh.charAt(1));
display.setSegments(__RH);
display.showNumberDecEx(hhh.toInt(),0,true,2,0);
delay(2000);
}
実行結果です。温度です。小数点第1位まで表示しています。一番右の桁は、零下だとマイナス符号を表示します。