7セグLED表示 その5 8文字-TM1638
コントローラTM1638を利用したボードはスイッチとLEDが組み合わさった製品が多いのですが、ここでは7セグメントLEDだけが実装されたのをebayで入手しました。
● TM1638のおもな特徴
- LED表示 10セグメント×8グリッド
- キー・スキャン 8×3ビット
- ディーティ 8レベル
- シリアル接続 CLK、STB、DIO
- 動作電圧 5V
●ライブラリの導入
ライブラリの検索では一つだけ見つけました。インストールします。
サンプルのdemoスケッチを動かします。スケッチ内部に接続が書かれています。
TM1638 | Arduino UNO |
---|---|
STB0 | 4 |
CLK | 7 |
Din(DATA) | 8 |
Vcc | 5V |
GND | GND |
しかし、小数点のドットと数字を同時に表示する方法が見つからなかったので、別のライブラリを探します。
●tm1638-library
検索でGitHubにtm1638-libraryを見つけました。ZIPファイルをダウンロードします。
Arduino IDEのメイン・メニューのスケッチからライブラリをインクルード - .ZIP形式のライブラリをインストール...を選びます。
ダウンロード・フォルダにあるtm1638-library-master.zipを選択するとライブラリがインストールされます。メイン・メニューのファイルから、スケッチ例 - tm1638-library-master-tm1638_one_module_exampleを選びます。
少し修正して下記のスケッチを動かします。setDisplayToHexNumber()関数の2番目の引数でドットを付加できます。
//Copyright (C) 2011 Ricardo Batista <rjbatista at gmail dot com>
#include <TM1638.h>
// define a module on data pin 8, clock pin 9 and strobe pin 7
TM1638 module(8, 9, 7);
void setup() {
// display a hexadecimal number and set dots
module.setDisplayToHexNumber(0x0001234, 0x80);
}
void loop() {
}
接続です。
TM1638 | Arduino UNO |
---|---|
STB0 | 7 |
CLK | 9 |
Din(DATA) | 8 |
Vcc | 5V |
GND | GND |
実行結果です。
●SHT31で温度と湿度を測って表示
センサSHT31のライブラリを入れます。検索で見つかった中のGrove SHT31 Temp Humi Sensorをインストールしました。
サンプル例がメニューから見つからなかったので、GitHubに行ってコピペして下記のexample.inoを動かしました。
#include <Arduino.h>
#include <Wire.h>
#include "SHT31.h"
SHT31 sht31 = SHT31();
void setup() {
Serial.begin(9600);
while(!Serial);
Serial.println("begin...");
sht31.begin();
}
void loop() {
float temp = sht31.getTemperature();
float hum = sht31.getHumidity();
Serial.print("Temp = ");
Serial.print(temp);
Serial.println(" C"); //The unit for Celsius because original arduino don't support speical symbols
Serial.print("Hum = ");
Serial.print(hum);
Serial.println("%");
Serial.println();
delay(1000);
}
問題なく温度と湿度を表示できたので、8桁の7セグメントLEDに、湿度と温度を表示しました。
読み出した湿度と温度を文字列に直します。ドットの前後で文字列を分離し、ドットを除いて合成します。7セグメントLEDではドットは文字列とは別に表示するからです。
温度は整数に直します。3桁の数値として表示し、上位の0は表示させず、ドットは下から2桁目に打ちます。
湿度は上位2桁を残し、'rh'の文字列と合成し、1桁目から表示します。
//Copyright (C) 2011 Ricardo Batista <rjbatista at gmail dot com>
#include <TM1638.h>
#include <Arduino.h>
#include <Wire.h>
#include "SHT31.h"
// define a module on data pin 8, clock pin 9 and strobe pin 7
TM1638 module(8, 9, 7);
SHT31 sht31 = SHT31();
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);
String Stemp = String(temp);
String Shum = String(hum);
String StempH = Stemp.substring( 0,Stemp.indexOf('.') );
String StempL = Stemp.substring(Stemp.indexOf('.') + 1);
String DStemp = StempH + StempL;
Serial.println(DStemp);
DStemp = DStemp.substring(0,3);
int iDStemp = (DStemp).toInt();
String ShumH = Shum.substring( 0,Shum.indexOf('.') );
String ShumL = Shum.substring(Shum.indexOf('.') + 1);
String DShum = ShumH + ShumL;
DShum = DShum.substring(0,2);
Serial.println(DShum);
int iDShum = (DShum).toInt();
module.setDisplayToDecNumber(iDStemp, 2,0);
module.setDisplayToString(DShum+"rh");
delay(1000);
}
実行している様子です。