オボロソボロ

ひよっこエンジニアの外部記憶装置

【ESP32】ニキシー管時計を自作してみた_コード編:2_NTPで時刻取得

oborosoboro.hatenablog.com


いよいよ8桁のニキシー管を時計にしていきます。
WiFi経由でNTPサーバーから時刻を取得してニキシー管に表示します。

SimpleTime.ino
arduino-esp32/SimpleTime.ino at master · espressif/arduino-esp32 · GitHub
ESP32用のサンプルを参考にニキシー管時計用に改変しました。

プログラム

ESP32に下記プログラムを書き込みます。

  • Nixieclock_time.ino
#include <WiFi.h>
#include "time.h"

const char* ssid       = "YOUR_SSID";  //自分のSSID
const char* password   = "YOUR_PASS";  //自分のパスワード

const char* ntpServer = "pool.ntp.org";//接続するNTPサーバー
const long  gmtOffset_sec = 9 * 3600;  //UTC(世界標準時)から9時間進めJST(日本標準時)にする
const int   daylightOffset_sec = 0;    //サマータイムなし

#define DECODER_A 21  //数字表示に関するピンの定義
#define DECODER_B 18  //K155ID1(BCD to Decimal decoder)に送る
#define DECODER_C 17  //BCD(2進化10進数)を書き込むピン
#define DECODER_D 19

#define NIXIE_1 16    //光らせたいニキシー管を指定するためのピン
#define NIXIE_2 26    //HIGHでニキシー管が光る
#define NIXIE_3 13
#define NIXIE_4 25
#define NIXIE_5 14
#define NIXIE_6 33
#define NIXIE_7 27
#define NIXIE_8 32

#define PS_DOWN 4     //高電圧を出力するためのピン(TL494のDTCピン)
                      //LOWで高電圧を出力する

#define DISPLAY_MS 2     //1つのニキシー管を光らせる時間
#define BLANKING_US 200  //光らせる管を切り替える時に
                         //陽極をOFFにする時間(ゴースト対策)

/**
 * (表示したい数字(10進表現), 表示したいニキシー管名)で
 * 指定のニキシー管に指定の数字を表示させる関数
 */
void displayDigit(unsigned short digit, unsigned short pin)
{
  digitalWrite(DECODER_A, (1 << 0) & digit);
  digitalWrite(DECODER_B, (1 << 1) & digit);
  digitalWrite(DECODER_C, (1 << 2) & digit);
  digitalWrite(DECODER_D, (1 << 3) & digit);
  digitalWrite(pin, HIGH);
  delay(DISPLAY_MS);
  digitalWrite(pin, LOW);
  delayMicroseconds(BLANKING_US); 
}

/**
 * 8本のニキシー管に現在時刻を表示する関数
 */
void printNixiesLocalTime()
{
  struct tm timeinfo;
  //時間取得に失敗したら(00000500)を表示
  if(!getLocalTime(&timeinfo)){
    displayDigit(0, NIXIE_1);
    displayDigit(0, NIXIE_2);
    displayDigit(0, NIXIE_3);
    displayDigit(0, NIXIE_4);
    displayDigit(0, NIXIE_5);
    displayDigit(5, NIXIE_6);
    displayDigit(0, NIXIE_7);
    displayDigit(0, NIXIE_8);
    return;
  }
    //現在の(日付,時,分,秒)を表示
    displayDigit(timeinfo.tm_mday / 10, NIXIE_1);
    displayDigit(timeinfo.tm_mday % 10, NIXIE_2);
    displayDigit(timeinfo.tm_hour / 10, NIXIE_3);
    displayDigit(timeinfo.tm_hour % 10, NIXIE_4);
    displayDigit(timeinfo.tm_min / 10, NIXIE_5);
    displayDigit(timeinfo.tm_min % 10, NIXIE_6);
    displayDigit(timeinfo.tm_sec / 10, NIXIE_7);
    displayDigit(timeinfo.tm_sec % 10, NIXIE_8);
}

void setup() {
  //WiFiに接続
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
  }
  
  //時刻を取得して同期
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  
  //以降必要ないためWiFiとの接続を切る
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
  
  // 数字表示に関するピンの準備
  pinMode(DECODER_A, OUTPUT);
  pinMode(DECODER_B, OUTPUT);
  pinMode(DECODER_C, OUTPUT);
  pinMode(DECODER_D, OUTPUT);

  //ニキシー管点灯に関するピンの準備
  pinMode(NIXIE_1, OUTPUT);
  pinMode(NIXIE_2, OUTPUT);
  pinMode(NIXIE_3, OUTPUT);
  pinMode(NIXIE_4, OUTPUT);
  pinMode(NIXIE_5, OUTPUT);
  pinMode(NIXIE_6, OUTPUT);
  pinMode(NIXIE_7, OUTPUT);
  pinMode(NIXIE_8, OUTPUT);

  //高電圧出力に関するピンの準備
  pinMode(PS_DOWN, OUTPUT);

  digitalWrite(PS_DOWN, LOW);  //高電圧出力を開始
}

void loop() {
  printNixiesLocalTime();  //現在時刻をニキシー管に表示
}


WiFi経由でNTPサーバーから時刻を取得し同期しています。
時間だけだと2桁分ニキシー管が余ったので日付も表示してみました。



うしろにスマホの時間を出しているんですが、ぼけてて見にくいですね。。。