LoginSignup
1

More than 1 year has passed since last update.

M5Stamp C3で時計

Posted at

 7セグメントLEDを使った時計を作ります。M5Stamp C3はWi-Fi経由でインターネットにアクセスできるのでntpサーバから時間を持ってきます。

ファイル名

表示器はHT16K33ドライバ

 アマゾンでも入手可能な、4桁の7セグメントLEDを使います。インターフェースはI2Cです。コントローラはいろいろありますが、ここではHT16K33を選びました。
 ライブラリを入れます。一番上に見えているHT16K33です。14セグメントには対応していないようです。
2021-11-07 (1).png

ntpライブラリを入れる

 NTPClientライブラリを入れます。

2021-11-07 (2).png

スケッチ

 WiFiMulti.addAP("Buffalo-G-20EA", "********");は、Wi-Fiルータへのアクセスです。

//  AUTHOR: Rob Tillaart
//     URL: https://github.com/RobTillaart/HT16K33

#include "HT16K33.h"
HT16K33 seg(0x70);

#include <WiFi.h>
#include <WiFiMulti.h>
#include <NTPClient.h>

WiFiMulti WiFiMulti;
//const char* ntpServer = "ntp.nict.jp";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

void setup(){
  Serial.begin(115200);
    WiFiMulti.addAP("Buffalo-G-20EA", "********");
    //Serial.print("\nWaiting for WiFi... ");

    while(WiFiMulti.run() != WL_CONNECTED) {
    //    Serial.print(".");
        delay(500);
    }

 /*   Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
*/
  timeClient.begin(); 
  delay(500); 

  seg.begin();
  Wire.setClock(100000);
  seg.displayOn();
  seg.setDigits(4);
}


void loop(){
  delay(1000);
  timeClient.update();
  String TIME = timeClient.getFormattedTime();
  String Hr = TIME.substring(0, 2);
  String Mini  = TIME.substring(3, 5);
  //Serial.println(TIME);
  //Serial.print(Hr);Serial.print(":");Serial.println(Mini);

  seg.displayTime(Hr.toInt()+9, Mini.toInt(), true, false);  // do not display leading zero.
  seg.displayColon(1);
}

 Windows10は、デフォルトで1週間「604800秒」でNTPサーバにアクセスしに行っているようです。上記のように毎秒アクセスするのはあくまでも実験運用いうことで。長期運用時には、アクセス頻度を下げるべきでしょう。しかし、ローカルに時計を持っていない場合は、面倒です。下記記事に具体的な手法が掲載されています。
   ESP32 の 時刻取得のオフライン時の挙動

 JSTに修正するのに、Hr.toInt()+9とインチキをやっています。朝4時に見ると、28時という表示でした。プログラムは暴走していたわけではないようです。

修正

NTPClient timeClient(ntpUDP); を NTPClient timeClient(ntpUDP, "ntp.nict.jp", 3600*9, 60000);

seg.displayTime(Hr.toInt()+9, Mini.toInt(), true, false);seg.displayTime(Hr.toInt(), Mini.toInt(), true, false);に変更します。
 3600*9はオフセットで、秒単位です。60000は更新のインターバルです。GitHubにアクセスして、使い方がわかりました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1