seeed社のGrove 7セグメント4桁ディスプレイを、ESP32で動かしてみました。このモジュールは、電源を含め4本のラインで動作できるので、簡単に使うことができると思います。
Arduinoでも同様に使えます。
参考になれば幸いです。
Grove 7セグメント4桁ディスプレイは、Amazon、秋月電子通商、スイッチサイエンスなどで購入できます。
Amazon:https://amzn.to/3kjcG81
秋月電子通商:https://akizukidenshi.com/catalog/g/gM-09162/
スイッチサイエンス:https://www.switch-science.com/products/1175
7セグメント4桁の表示部(横:30mm、縦:14mmくらい)をTM1637で駆動しています。中央にコロンがあるので、時計表示などに向いているかと思います。小数点の表示はありませんが、温度、湿度、気圧などのセンサーから得られる値を表示しても良いと思います。
ここでは、ESP32のWiFi機能を使い、ネット経由で時刻を合わせ、表示するプログラムを紹介します。
まず、ドライバにTM1637を使っているので、これを扱うためのライブラリをインストールします。
ArduinoIDEの「スケッチ」-「ライブラリをインクルード」-「ライブラリを管理…」を選択し、ライブラリマネージャを開きます。
TM1637用のライブラリはいくつかありますが、今回は「Avishay Orpaz」のTM1637を使いました。
ESP32との接続は、以下のとおりです。ESP32の機能に適さないピン以外は、どのピンに接続しても良いみたいです。プログラム中、10行目、11行目でCLKとDIOの接続ピンを宣言し、12行目で設定しています。
#define CLK 18
#define DIO 19
TM1637Display display(CLK, DIO);
ESP32 pin | 4桁7セグLED | |
3V3 | – | VCC |
GND | GND | |
18 | CLK | |
19 | DIO |
6行目、7行目のSSID、PASSは、ご使用のWiFiルーターのものを設定してください。
37行目の「setBrightness(0x0f)」の値は、LEDの明るさを指定します。0x01、0x03、0x07、0x0fなどで明るさの変化を確認しました。数値が小さくなると暗くなります。お好みで設定してください。
40行目、41行目の「showNumberDecEx(ntime, 0x40, true)」は、LEDに値を表示する関数です。1番目の引数ntimeは表示したい値(10進)を指定します。2番目の引数は小数点の位置を指定しますが、このモジュールはコロンが中央にあるだけなので、表示する場合は「0x40」を、表示しない場合は「0x00」を指定します。プログラムでは変数「cFLG」を使って、1秒毎に点滅するようにしています。3番目の引数は、上位桁に”0″を表示するか否かの指定です。「true」で表示、「false」で非表示です。
#include <Arduino.h>
#include <TM1637Display.h>
#include <WiFi.h>
#include <time.h>
#define SSID "*************" // 無線LANアクセスポイントのSSID
#define PASS "*************" // 無線LANアクセスポイントのパスワード
// Module connection pins (Digital Pins)
#define CLK 18
#define DIO 19
TM1637Display display(CLK, DIO);
// time
struct tm timeInfo;
void setup() {
Serial.begin(115200);
while (!Serial);
wifi_connect();
configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp");
delay(1000);
getLocalTime(&timeInfo);
delay(1000);
}
void loop() {
unsigned int ntime;
unsigned long wtime;
bool FLG;
bool cFLG;
wtime = millis();
cFLG = true;
display.setBrightness(0x0f);
while (1) {
getLocalTime(&timeInfo);
ntime = timeInfo.tm_hour * 100 + timeInfo.tm_min;
if ( cFLG == true ) display.showNumberDecEx(ntime, 0x40, true);
if ( cFLG == false ) display.showNumberDecEx(ntime, 0x0, true);
FLG = true;
if ( cFLG == true ) cFLG = false;
else cFLG = true;
while (FLG) {
if ( millis() - wtime >= 1000 ) {
wtime = millis();
FLG = false;
}
}
}
}
// WiFi接続
void wifi_connect() {
int icount;
bool FLG;
icount = 0;
FLG = true;
WiFi.mode(WIFI_STA); // 無線LANをSTAモードに設定
WiFi.begin(SSID, PASS); // 無線LANアクセスポイント(SSID)へ接続
Serial.print(SSID);
Serial.print(" ");
while (WiFi.status() != WL_CONNECTED) { // 接続に成功するまで待つ
Serial.print(".");
delay(500); // 待ち時間処理
icount++;
if ( icount > 20 ) { // 20回トライしても接続できなかった場合タイムアウト(500ms×50)とします
ESP.restart();
break;
}
}
Serial.println(" ");
Serial.print("Connect Internet. IP Address:");
Serial.println(WiFi.localIP()); // 本機のIPアドレスをシリアル表示
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
簡単なコードで4桁の7セグメントLEDを操作することが出来ました。時計表示、センサー値の表示など、色々使えると思います。
ご不明な点などありましたら、メールフォームからお問い合わせください。
コメント