• マイページ
  • カート 0
    0 0円
  • お問合せ
SGP30でつくる環境チェッカ

[企画・制作] ZEPエンジニアリング

ニキシー管風!M5Stackで作る高精度Wi-Fiクロック

 M5Stackを用いて様々なIoTデバイスやガジェットを製作する際に正確な時刻が欲しいことが多々あります。M5Stackには、Wi-Fiを介してインターネットに接続して、NTP(Network Time Protocol)サーバから正確な時刻を取得するための関数が用意されています。今回はその関数を用いて正確な時刻を表示する時計を製作しました。単なるテキスト表示だけでは面白くないので、レガシーなニキシー管風の表示にも挑戦してみました。ニキシー管をご存知の方には懐かしく、そうでない方には、レトロな雰囲気がとても新鮮でないでしょうか。


画面表示例 

NTP CLOCK TEXT表示
NTP Serverから時刻を取得し、テキスト表示
NTP CLOCK NIXIE風表示
ニキシー管風表示


対象機種はM5Stack Coreシリーズ(BASIC, FIRE等)です。Core2でも同様に動作します。 

M5Stack BASIC
M5Stack Basic V2.6
【M5STACK-K001-V26】
M5Stack FIRE IoT開発キット(PSRAM)V2.6
M5Stack FIRE IoT開発キット(PSRAM)V2.6
【M5STACK-K007-V26】
M5Stack Core2 IoT開発キット
M5Stack Core2 IoT開発キット
【M5STACK-K010】

NTP (Network Time Protocol)

 NTP (Network Time Protocol)とは、 ネットワークに接続されたコンピュータや各種機器の時刻同期に用いられるプロトコルで、 RFC 5905やRFC 7822で標準化されています。NTPはネットワークを介して時刻同期を行います。 NTPサーバが通知してきた時刻を信頼するだけでは、 ネットワークの遅延により時刻のずれが発生してしまうため、サーバ・クライアント間の通信において、 メッセージを送信した時刻、受信した時刻を、 それぞれがメッセージの中に含めています。 これにより、ネットワークでの遅延時間を推測し、ずれの少ない時刻同期を図っています。(引用: JPNIC)
 詳細については、JPNIC:一般社団法人 日本ネットワークインフォメーションセンターのウェブページなどを参照ください。

 正確な時刻を提供するNTPサーバは、様々な団体で運営されています。その代表例のひとつとして、NICT:国立研究開発法人情報通信研究機構の公開NTPサーバがあります。利用規約を守れば個人でも利用可能です。NICTのNTPサーバは日本標準時と直結されており、サーバのタイムスタンプ精度は日本標準時に対して 10ナノ秒以内ですが、インターネットを介したユーザ側で得られる精度は、途中のネットワークの混雑状況やクライアントに依存しますので、一概には保証できませんが、数ミリ秒~数十ミリ秒以下の範囲で同期可能と思われます。ただし同期後の時計精度はM5Stack内蔵の水晶の精度に依存します。一般的な水晶時計の精度は月差±20秒程度と言われていますので、日差±1秒以内には収まるでしょう。本プログラムでは、1日に1回NICTのNTPサーバと同期していますので、単なる置時計として用いるのであれば実用上問題ないと考えます。さらに高精度を求め、NTPサーバとの同期回数を増やすことも考えられますが、1日当たりの接続回数に制限がありますので注意してください。詳しくは、NICT公開NTP FAQを参照ください。

 精度を1ミリ秒以下に正確に抑えたいなどの要件がある場合には、NTPでの実現は難しく、GPS電波を受信して利用するなど別の方法が必要です。またその精度を確保しつつ他の処理を行うことは、M5Stackの現行アーキテクチャでは難しいかも知れません。

M5StackでNTPサーバから時刻情報を取得しテキスト表示する

 M5Stackでは、内蔵するWi-Fiインターフェースを介してインターネットに接続し、NTPサーバから正確な時刻情報を取得することができます。その機能は、configTime関数として、M5StackのArduino IDE開発環境(M5Stackライブラリ)に標準で含まれています。その関数を使ってM5StackのLCD画面に日付、曜日、時刻をテキスト表示するプログラムを最初に紹介します。

(1)開発環境構築

 M5StackのArduino IDE開発環境を用います。その構築方法については、別記事「いろいろなマイコンボードに使えるArduino IDE。環境構築メモ」の「M5StackをArduino IDEで使う」の章を参考にしてください。M5Stack CORE2を使用する場合には、「M5Core2 by M5Stack」ライブラリも併せてインストールしてください。時刻を表示するだけであれば、その他追加のI/Oライブラリは、特に必要ありません。

(2)制御プログラム

 Wi-Fi のアクセスポイントに接続し、NICT:国立研究開発法人情報通信研究機構の公開NTPサーバから時刻を取得し、M5StackのLCD画面にテキスト表示するプログラムを以下に示します。本プログラムをベースに正確な時刻を必要とする様々なプログラムに拡張可能です。

制御プログラムリスト

  1. // NTP Clock. (c)2022 @logic_star Allrights reserved.
  2. //#define CORE2 //CORE2を使用する場合は有効化要
  3. #ifndef CORE2
  4.   #include <M5Stack.h>
  5. #else
  6.   #include <M5Core2.h>
  7. #endif
  8. #include <WiFi.h>
  9. #include <time.h>
  10. // Wi-Fi 関連定義
  11. const char* ssid = "SSID"; //WiFi APのSSID
  12. const char* password = "PASSWORD"; //WiFi APのPassword
  13. const char* ntpServer = "ntp.nict.jp";
  14. const long gmtOffset_sec = 9 * 3600;
  15. const int daylightOffset_sec = 0;
  16. WiFiClient client;
  17. // 時間関連
  18. struct tm timeinfo;
  19. uint8_t secLastReport = 0;
  20. const char* week[7] = {"Sun", "Mon", "Tue", "wed", "Thu", "Fri", "Sat"};
  21. // NTPによる時刻取得関数
  22. int ntp(){
  23. uint8_t wifi_retry_cnt;
  24.   M5.Lcd.fillScreen(TFT_BLACK); //画面初期化
  25.   M5.Lcd.setTextSize(1);
  26.   M5.Lcd.setCursor(0, 0);
  27.   M5.Lcd.printf("Connecting to %s\n", ssid);
  28.   WiFi.begin(ssid, password); //WiFi接続開始
  29.   wifi_retry_cnt = 20; //0.5秒×20=最大10秒で接続タイムアウト
  30.   while (WiFi.status() != WL_CONNECTED){
  31.     delay(500);
  32.     M5.Lcd.printf("*"); //0.5秒毎に”*”を表示
  33.     if(--wifi_retry_cnt == 0) {
  34.       WiFi.disconnect(true); //タイムアウトでWiFiオフ
  35.       WiFi.mode(WIFI_OFF);
  36.       M5.Lcd.printf("\nCONNECTION FAIL"); //WiFi接続失敗表示
  37.       return(false); //接続失敗でリターン
  38.     }
  39.   }
  40.   M5.Lcd.printf("\nCONNECTED"); //WiFi接続成功表示
  41.   configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); //NTPによる時刻取得
  42.   if (!getLocalTime(&timeinfo)) {
  43.     M5.Lcd.printf("/nFailed to obtain time"); //時刻取得失敗表示
  44.     WiFi.disconnect(true); //時刻取得失敗でWiFiオフ
  45.     WiFi.mode(WIFI_OFF);
  46.     M5.Lcd.printf("/nFailed to obtain time"); //時刻取得失敗表示
  47.     return (false); //時刻取得失敗でリターン
  48.   }
  49.   WiFi.disconnect(true); //WiFi切断
  50.   WiFi.mode(WIFI_OFF); //WiFiオフ
  51.   M5.Lcd.fillScreen(TFT_BLACK); //画面消去
  52.   return (true); //時刻取得成功でリターン
  53. }
  54. void setup() {
  55.   M5.begin();
  56.   M5.Lcd.fillScreen(TFT_BLACK); //M5Stackの画面初期化
  57.   M5.Lcd.setTextFont(4);
  58.   M5.Lcd.setTextSize(1);
  59.   M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
  60.   M5.Lcd.setTextDatum(TL_DATUM);
  61.   if(ntp() == false) while(1); //時刻取得に失敗した場合は、動作停止
  62. }
  63. void loop() {
  64.   getLocalTime(&timeinfo);
  65.   if((timeinfo.tm_hour == 2)&&(timeinfo.tm_min == 0)&&(timeinfo.tm_sec == 0)) ntp(); //毎日午前2時に時刻取得。時刻取得に失敗しても動作継続
  66.   if(secLastReport != timeinfo.tm_sec) { //秒が更新されたら、表示をupdate
  67.     secLastReport = timeinfo.tm_sec;
  68.     M5.Lcd.setCursor(0, 0);
  69.     M5.Lcd.printf("%02d/%02d/%02d(%s) %02d:%02d:%02d",
  70.       timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday, week[timeinfo.tm_wday],
  71.       timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
  72.   }
  73.   delay(100); //0.1秒ウェイト
  74. }
  • 2行目 M5Stack CORE2を使用する場合には、「//」を外しCORE2定義を有効化してください。
  • 11~17行目 Wi-Fi関連の設定とNTPサーバのURL定義です。アクセスポイントのSSIDとパスワードを各自の値に設定してください。
  • 24~56行目は、時刻取得のための関数です。Wi-Fiアクセスポイントに接続し、NTPサーバから時刻を取得した後にWi-Fi 接続を切断します。本プログラムを拡張し、他の用途でもWi-Fi接続を使用する場合には接続したままでも構いませんが、本プログラムではNTPサーバに接続するときのみWi-Fi接続をしています。
  • 58~66行目は、M5Stackの画面の初期化や最初のNTP時刻取得を行っています。Wi-FiアクセスポイントのSSIDやパスワード違いなどにより、Wi-Fiアクセスポイントに接続できなかった場合には、エラーを表示して動作を停止します。
  • 68~79行目が、メインルーチンで、getLocalTime関数により、時刻を取得して、秒が更新されていたら、画面に現在の日付、曜日、時刻を表示します。また、毎日午前2時にNTPサーバへ接続し、時刻の修正を行います。所有している複数のM5Stackでは、1日1回の時刻修正で日差±1秒以内の精度が得られています。

表示をニキシー管風にする

 M5StackにはTFカード(microSD)から読み込んだJPEGイメージデータをLCD表示するための関数drawJpgFileとメモリ上のJPEGイメージデータをLCD表示するための関数drawJpgがあります。今回はそれらを用いて時刻表示をニキシー管風にしてみました。独自のJPEGイメージデータを作成することにより、異なるデザインの表示にも簡単に変更できます。

(1)ニキシー管風JPEGイメージデータの作成

  ニキシー管風表示のイメージデータの作成は、本物のニキシー管の表示を参考にPhotoshopで作成しました。基本となるフォントは、Jovanny Lemonad氏デザインの「Nixie One」フォントを使用し、本物のニキシー管のように陽極に相当する数字を10層に重ね合わせ、また陰極に相当するメッシュなども重ね合わせて作成しました。重ね合わせの課程でどの数字が何層目が良いかなどかなり試行錯誤を行い、見栄えを調整しました。本物のニキシー管も0~9が順番に並んでいないので、同様の設計上の苦労があったと思われます。
 イメージデータの作成は、以下のとおり数字の0~9と曜日を表すSun~Satの計17種類を作成しました。
Nixie image 0 Nixie image 1 Nixie image 2 Nixie image 3 Nixie image 4 Nixie image 5 Nixie image 6 Nixie image 7 Nixie image 8 Nixie image 9
Nixie image Sun Nixie image Mon Nixie image Tue Nixie image Wed Nixie image Thu Nixie image Fri Nixie image Sat
 M5StackのLCDにフィットする文字サイズから、イメージデータの大きさは、数字が 高さ84ピクセル、幅52ピクセル。曜日は、高さ58ピクセル、幅105ピクセルでデザインしています。

(2)制御プログラム

 ニキシー管風のイメージデータをTFカード(microSD)から表示の都度読込む方法と、イメージデータをプログラムと一緒にコンパイルしてしまう方法があります。前者はTFカード(microSD)内のデータを別のJPEGイメージデータを入れ替えることによって、容易に表示デザインを変更することができますが、TFカード(microSD)が必要です。一方、後者は、イメージデータを一緒にコンパイルしてしまうため、TFカード(microSD)は不要ですが、表示デザインを変えるにはデータのソース化や再コンパイルなどが必要となります。
 今回のプログラムでは、どちらにも対応できるように記述しました。以下にプログラムを示します。

制御プログラムリスト

  1. // NTP Clock. (c)2022 @logic_star Allrights reserved.
  2. //#define IMAGE_FROM_SD //SDカードからイメージを読み込む場合は有効化要
  3. //#define CORE2 //CORE2を使用する場合は有効化要
  4. #ifndef CORE2
  5.   #include <M5Stack.h>
  6. #else
  7.   #include <M5Core2.h>
  8. #endif
  9. #include <WiFi.h>
  10. #include <time.h>
  11. #ifndef IMAGE_FROM_SD
  12.   #include "image.h"
  13. #endif
  14. // Wifi 関連定義
  15. const char* ssid = "SSID"; //WiFi APのSSID
  16. const char* password = "PASSWORD"; //WiFi APのPassword
  17. const char* ntpServer = "ntp.nict.jp";
  18. const long gmtOffset_sec = 9 * 3600;
  19. const int daylightOffset_sec = 0;
  20. WiFiClient client;
  21. // 時間関連
  22. struct tm timeinfo;
  23. uint8_t secLastReport = 0;
  24. // NTPによる時刻取得関数
  25. int ntp(){
  26. uint8_t wifi_retry_cnt;
  27.   M5.Lcd.fillScreen(TFT_BLACK); //画面初期化
  28.   M5.Lcd.setTextSize(1);
  29.   M5.Lcd.setCursor(0, 0);
  30.   M5.Lcd.printf("Connecting to %s\n", ssid);
  31.   WiFi.begin(ssid, password); //WiFi接続開始
  32.   wifi_retry_cnt = 20; //0.5秒×20=最大10秒で接続タイムアウト
  33.   while (WiFi.status() != WL_CONNECTED){
  34.     delay(500);
  35.     M5.Lcd.printf("*"); //0.5秒毎に”*”を表示
  36.     if(--wifi_retry_cnt == 0) {
  37.       WiFi.disconnect(true); //タイムアウトでWiFiオフ
  38.       WiFi.mode(WIFI_OFF);
  39.       M5.Lcd.printf("\nCONNECTION FAIL"); //WiFi接続失敗表示
  40.       return(false); //接続失敗でリターン
  41.     }
  42.   }
  43.   M5.Lcd.printf("\nCONNECTED"); //WiFi接続成功表示
  44.   configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); //NTPによる時刻取得
  45.   if (!getLocalTime(&timeinfo)) {
  46.     M5.Lcd.printf("/nFailed to obtain time"); //時刻取得失敗表示
  47.     WiFi.disconnect(true); //時刻取得失敗でWiFiオフ
  48.     WiFi.mode(WIFI_OFF);
  49.     M5.Lcd.printf("/nFailed to obtain time"); //時刻取得失敗表示
  50.     return (false); //時刻取得失敗でリターン
  51.   }
  52.   WiFi.disconnect(true); //WiFi切断
  53.   WiFi.mode(WIFI_OFF); //WiFiオフ
  54.   M5.Lcd.fillScreen(TFT_BLACK); //画面消去
  55.   return (true); //時刻取得成功でリターン
  56. }
  57. //イメージデータ関連
  58. #ifdef IMAGE_FROM_SD //SDからイメージデータを読み込む場合
  59.   //SDカード上のファイル名を定義
  60.   const char* image_data[17] = {"/0.jpg", "/1.jpg", "/2.jpg", "/3.jpg", "/4.jpg",
  61.     "/5.jpg", "/6.jpg", "/7.jpg", "/8.jpg", "/9.jpg",
  62.     "/sun.jpg", "/mon.jpg", "/tue.jpg", "/wed.jpg", "/thu.jpg", "/fri.jpg", "/sat.jpg"};
  63. #else //image.hでインクルードしたイメージデータを使用する場合
  64.   //各イメージデータの配列名を定義
  65.   const unsigned char* image_data[17] = {image0, image1, image2, image3, image4,
  66.     image5, image6, image7, image8, image9,
  67.     sun, mon, tue, wed, thu, fri, sat};
  68.   //各イメージデータのサイズを定義
  69.   const uint32_t image_size[17] = {sizeof image0, sizeof image1, sizeof image2, sizeof image3, sizeof image4,
  70.     sizeof image5, sizeof image6, sizeof image7, sizeof image8, sizeof image9,
  71.     sizeof sun, sizeof mon, sizeof tue, sizeof wed, sizeof thu, sizeof fri, sizeof sat};
  72. #endif
  73. // x, yの位置にnumberの数字または曜日を表示
  74. void PutJpg(uint16_t x, uint16_t y, uint16_t number){
  75. #ifdef IMAGE_FROM_SD
  76.   M5.Lcd.drawJpgFile(SD, image_data[number], x, y);
  77. #else
  78.   M5.Lcd.drawJpg(image_data[number], image_size[number], x, y);
  79. #endif
  80. }
  81. // x, yの位置からnumberの数値をdigit桁で表示。文字間隔はx_offset
  82. void PutNum(uint16_t x, uint16_t y, uint16_t x_offset, uint8_t digit, uint16_t number){
  83. int temp = number;
  84. int loop;
  85.   for(loop = digit ; loop > 0 ; loop--){
  86.     PutJpg(x + x_offset * (digit - loop), y, temp / int(pow(10, (loop - 1))));
  87.     temp = temp % int(pow(10, (loop - 1)));
  88.   }
  89. }
  90. void setup() {
  91.   M5.begin();
  92.   M5.Lcd.fillScreen(TFT_BLACK); //M5Stackの画面初期化
  93.   M5.Lcd.setTextFont(4);
  94.   M5.Lcd.setTextSize(1);
  95.   M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
  96.   M5.Lcd.setTextDatum(TL_DATUM);
  97.   if(ntp() == false) while(1); //時刻取得に失敗した場合は、動作停止
  98. }
  99. void loop() {
  100.   getLocalTime(&timeinfo);
  101.   if((timeinfo.tm_hour == 2)&&(timeinfo.tm_min == 0)&&(timeinfo.tm_sec == 0)) ntp(); //毎日午前2時に時刻取得。時刻取得に失敗しても動作継続
  102.   if(secLastReport != timeinfo.tm_sec) { //秒が更新されたら、表示をupdate
  103.     secLastReport = timeinfo.tm_sec;
  104.     delay(10);
  105.     M5.Lcd.setCursor(76, 14);
  106.     M5.Lcd.printf("NTP Nixie Tube Clock");
  107.     M5.Lcd.setCursor(0, 14);
  108.     M5.Lcd.printf("DATE");
  109.     PutNum(0, 36, 52, 2, timeinfo.tm_mon + 1); //月の表示
  110.     PutNum(108, 36, 52, 2, timeinfo.tm_mday); //日の表示
  111.     PutJpg(216, 63, timeinfo.tm_wday + 10); //曜日の表示
  112.     M5.Lcd.setCursor(0, 136);
  113.     M5.Lcd.printf("TIME");
  114.     PutNum(0, 156, 52, 2, timeinfo.tm_hour); //時の表示
  115.     PutNum(108, 156, 52, 2, timeinfo.tm_min); //分の表示
  116.     PutNum(216, 156, 52, 2, timeinfo.tm_sec); //秒の表示
  117.   }
  118.   delay(100); //0.1秒ウェイト
  119. }

  • 2行目 JPEGイメージデータをTFカード(microSD)から読み込む場合は、冒頭の「//」を削除して、IMAGE_FROM_SD定義を有効にしてください。
  • 3行目 M5Stack CORE2を使用する場合には、「//」を外しCORE2定義を有効にしてください。
  • 15~21行目 Wi-Fi関連の設定とNTPサーバのURL定義です。アクセスポイントのSSIDとパスワードを各自の値に設定してください。
  • 27~59行目は、時刻取得のための関数です。Wi-Fiアクセスポイントに接続し、NTPサーバから時刻を取得した後にWi-Fi 接続を切断します。本サンプルプログラムを拡張し、他の用途でもWi-Fi接続を使用する場合には接続したままでも構いませんが、本プログラムではNTPサーバに接続するときのみWi-Fi接続をしています。
  • 60~75行目は、イメージデータの定義です。TFカード(microSD)から読み込む場合のイメージデータのファイル名や一緒にコンパイルする場合のイメージデータの配列名を定義しています。
  • 77~84行目は、ひとつのイメージデータを表示するための関数です。引数x、yは表示位置、numberは表示するイメージデータを表し、0~9の場合は対応する数字、10~16の場合は曜日に相当するイメージを表示します。
  • 86~94行目は、引数numberの値を引数digit桁の数字で表示する関数です。
  • 96~104行目は、M5Stackの画面の初期化や最初のNTP時刻取得を行っています。Wi-FiアクセスポイントのSSIDやパスワード違いなどにより、Wi-Fiアクセスポイントに接続できなかった場合には、エラーを表示して動作を停止します。
  • 106~126行目が、メインルーチンで、getLocalTime関数により、時刻を取得して、秒が更新されていたら、画面に現在の日付、曜日、時刻を表示します。また、毎日午前2時にNTPサーバへ接続し、時刻の修正を行います。所有している複数のM5Stackでは、1日1回の時刻修正で日差±1秒以内の精度が得られています。

(3)プログラムの実行方法

 必要なプログラムならびにイメージデータは、以下のリンクからダウンロードして解凍してください。

    NTP_Nixie_Tube_Clock.zip

  • プログラムとイメージデータを一緒にコンパイルする場合 ※TFカード(microSD)不要
    1. 解凍したファイルのうち、NTP_NIXIE.inoとimage.hを同一のフォルダにコピーする。
    2. ArduinoIDEでNTP_NIXIE.inoを開き、Wi-FiアクセスポイントのSSID、パスワードを適宜書き換える。
    3. ArduinoIDEでコンパイルして、M5Stackに書き込んで実行。

  • イメージデータをTFカードから読み込む場合 ※TFカード(microSD)要
    1. 解凍したファイルのうち、imagesフォルダ内にあるイメージデータをTFカード(microSD)のルートディレクトリにコピーして、M5Stackに装着する。
    2. ArduinoIDEでNTP_NIXIE.inoを開き、2行目の「//」を削除し、#define IMAGE_FROM_SDを有効化する。また、Wi-FiアクセスポイントのSSID、パスワードを適宜書き換える。
    3. ArduinoIDEでコンパイルして、M5Stackに書き込んで実行。

うまく表示できましたか?表示例(動画)を以下に示します。

※ご注意:2019年より以前に出荷されたM5Stackは液晶がTNタイプのためJPEG画像の発色があまり良くありません。2019年以降に出荷されたものは、IPS液晶となっているため発色性や視野角が改善されています。

(4)イメージデータの変更例

 新たなイメージデータ(漢数字版)を作成し、TFカード(microSD)に格納して実行してみました。

(5)トラブルシューティング

著者自身がプログラムの作成中に遭遇したトラブルと対処をご参考に記載します。

  • TFカード(microSD)からイメージデータが読込めない
    M5StackとTFカード(microSD)の相性問題があるようです。複数のTFカード(microSD)を試して見ることをお勧めします。また、TFカード(microSD)を新たにフォーマットすることで以降使えるようになった場合もありました。
  • TFカード(microSD)からイメージデータを読込み表示する場合、表示が異常に遅い
    M5Stack用のボードパッケージ、ライブラリのバージョンが最新であるか確かめてください。また、M5Stack用のボードパッケージは複数あるようなので、いずれかで試すこともお勧めします。
  • M5Stack CORE2で動作しない
    COREシリーズとCORE2では、インクルードする定義ファイルが異なります。正しい定義ファイルが読み込まれるようにCORE2を使用する場合には、プログラムの3行目の「//」を外しCORE2定義を有効にしてください。
 

CO2センサを接続して、時計&環境モニタ(CO2濃度、温湿度表示)に仕上げる

  時計表示だけでは、もったいないので、別記事「高精度!超定番センサ SCD30で作るCO2&温湿度計」で紹介したSCD30 CO2、温湿度センサも接続して時刻の他、CO2濃度、温湿度も表示するようにしてみました。毎分10秒、40秒から7秒間表示が時刻表示からCO2濃度、温湿度表示に切り替わるようにしています。また、左下のボタンを押下すると、すぐにCO2濃度、温湿度表示に切り替わります。

興味のある方は、以下プログラムをダウンロードして動作させてみてください。

    NTP_Nixie_Tube_Clock_SCD30.zip

 SCD30 CO2、温湿度センサとM5Stackの接続は、以下の図を参考に接続してください。また、別記事「高精度!超定番センサ SCD30で作るCO2&温湿度計」を併せてご覧ください。
SCD30の接続

まとめ

 「ニキシー管風!M5Stackで作る高精度Wi-Fiクロック」いかがでしたか?NTPサーバへの基本的な接続、時刻取得の方法についてご理解いただけたと思います。もし眠っているM5Stackが、あればニキシー管時計として復活させてみてはいかがでしょうか?M5Stackをお持ちでない方は、マルツで購入できます。以下リンクから購入をご検討ください。

M5Stack BASIC
M5Stack Basic V2.6
【M5STACK-K001-V26】
M5Stack FIRE IoT開発キット(PSRAM)V2.6
M5Stack FIRE IoT開発キット(PSRAM)V2.6
【M5STACK-K007-V26】
M5Stack Core2 IoT開発キット
M5Stack Core2 IoT開発キット
【M5STACK-K010】

c2022ー @logic_star All rights reserved.



Page Top