アマゾンでVFDを購入したので時計にした

　アマゾンでVFDを売っていたので、時計にしてみた。
　　　[日本語取説付き 蛍光表示管 4桁 時計用 VFD IVL2-7/5 ソビエト ロシア ビンテージパーツ USSR](https://www.amazon.co.jp/gp/product/B08XBTYKZF/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)
　ヒータは2.5V、点灯電圧は24Vです。実験途中で電源がおかしくなりました。24Vは高めの電圧ですから慎重に扱ってください。

###マイコン・ボード
　Arduino UNO Wifi Rev.2のモデルは、Arduino UNOと同じくAVRマイコンを使っていますが、世代が新しいATMega4809を搭載しています。Arduino UNO用シールドにWi-Fiが利用できる製品がリリースされなくなって数年が経過しています。
　このモデルでは、Wi-FiデバイスにU-bloxのNINA-W102が搭載され、従来のEthernet とWiFiのライブラリと同じように使えるWiFiNINA libraryが用意されました。NINA-W102は2018年6月15日に技適（204-810001）に登録されています。
　最初のプログラムはUNOで動かしました。2番目の時計はArduino UNO Wifi Rev.2を利用しました。


![IMG_0674.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/6acde74b-0d55-5141-3aa6-5bc1032bfdb5.png)



###回路
　電圧レベルの変換は東芝のTBD62783を2個使いました。秋月電子通商で購入しました。Vihは2Vなので、3.3V系のマイコンボードでも駆動できるでしょう。
　1個目でアノードを制御します。2個目はグリッドで、桁の制御です。3番目はコロン（二つのドット）です。
　入力はArduinoのディジタル端子0～12をつなぎました。
![IMGP0889.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/9a3fa66f-5d29-c938-b89d-627e6ec7ec1e.png)


###プログラム
　表示のプログラムです。どうやって点灯するのか最初はわからなかったので、確認しながら作ったので、べたなセグメント・データの記述になっています。

```C
#define Grid1 8
#define Grid2 9
#define Grid3 10
#define Grid4 11
#define Grid5 12

#define anodeA 0
#define anodeB 1
#define anodeC 2
#define anodeD 3
#define anodeE 4
#define anodeF 5
#define anodeG 6
#define anodeDot 7

void digit1(){  // 1 ..  5
    digitalWrite(Grid1, HIGH);
  digitalWrite(Grid2, LOW);
  digitalWrite(Grid3, LOW);
  digitalWrite(Grid4, LOW);
  digitalWrite(Grid5, LOW);
}

void digit2(){  // 1 ..  5
    digitalWrite(Grid1, LOW);
  digitalWrite(Grid2, HIGH);
  digitalWrite(Grid3, LOW);
  digitalWrite(Grid4, LOW);
  digitalWrite(Grid5, LOW);
}

void digit3(){  // 1 ..  5
    digitalWrite(Grid1, LOW);
  digitalWrite(Grid2, LOW);
  digitalWrite(Grid3, HIGH);
  digitalWrite(Grid4, LOW);
  digitalWrite(Grid5, LOW);
}

void digit4(){  // 1 ..  5
    digitalWrite(Grid1, LOW);
  digitalWrite(Grid2, LOW);
  digitalWrite(Grid3, LOW);
  digitalWrite(Grid4, HIGH);
  digitalWrite(Grid5, LOW);
}

void digit5(){  // 1 ..  5
    digitalWrite(Grid1, LOW);
  digitalWrite(Grid2, LOW);
  digitalWrite(Grid3, LOW);
  digitalWrite(Grid4, LOW);
  digitalWrite(Grid5, HIGH);
}

void _1(){  //
  digitalWrite(anodeA, LOW);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, LOW);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, LOW);
  digitalWrite(anodeG, LOW);
}

void _2(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, LOW);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, HIGH);
  digitalWrite(anodeF, LOW);
  digitalWrite(anodeG, HIGH);
}

void _3(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, LOW);
  digitalWrite(anodeG, HIGH);
}

void _4(){  //
  digitalWrite(anodeA, LOW);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, LOW);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, HIGH);
}
void _5(){  //
  digitalWrite(anodeA, LOW);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, HIGH);
}
void _6(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, LOW);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, HIGH);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, HIGH);
}
void _7(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, LOW);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, LOW);
  digitalWrite(anodeG, LOW);
}
void _8(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, HIGH);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, HIGH);
}
void _9(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, LOW);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, HIGH);
}
void _0(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, HIGH);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, LOW);
}

void setup() {
  for (int i=0; i<14; i++) pinMode(i, OUTPUT);
  digitalWrite(Grid1, LOW);
  digitalWrite(Grid2, LOW);
  digitalWrite(Grid3, LOW);
  digitalWrite(Grid4, LOW);
  digitalWrite(Grid5, LOW);
}

void disp(int _1,int _2,int _3,int _4){
  VFD(_1);
  digit1();  delay(5);
  VFD(_2);
  digit2();  delay(5);
  digitalWrite(anodeDot, HIGH);
  digit3();  delay(5);
  VFD(_3);
  digit4();  delay(5);
  VFD(_4);
  digit5();  delay(5);
}

void VFD(int dispFig){
  switch (dispFig){
  case 0: //?
    _0() ;break;
  case 1:
    _1();break;
  case 2:
    _2();break;
  case 3:
    _3();break;
  case 4:
    _4();break;
  case 5:
    _5();break;
  case 6:
    _6();break;
  case 7:
    _7();break;
  case 8:
    _8();break;
  case 9:
    _9();break;
  }
}

void loop() {
  disp(2,3,8,0);
}
```

　ntpライブラリを追加して、時計にしました。
　Wi-Fiの部分はArduino.ccのWiFiNINAライブラリです。ここのntpは複雑だったので、[M5Stamp C3で時計](https://qiita.com/jamjam/items/a5252890b8e04ba46448)　で使ったNTPClientライブラリを利用しました。
　Wi-Fiルータへの接続に必要なSSIDとパスワードはarduino_secrets.h（別ファイル、同じディレクトリ）に記述しています。記述方法はWiFiNINAライブラリのサンプルを参照してください。

```C
#include <WiFiNINA.h>
#include <NTPClient.h>

#include "arduino_secrets.h" 
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int status = WL_IDLE_STATUS;

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

#define Grid1 8
#define Grid2 9
#define Grid3 10
#define Grid4 11
#define Grid5 12

#define anodeA 0
#define anodeB 1
#define anodeC 2
#define anodeD 3
#define anodeE 4
#define anodeF 5
#define anodeG 6
#define anodeDot 7

void digit1(){  // 1 ..  5
    digitalWrite(Grid1, HIGH);
  digitalWrite(Grid2, LOW);
  digitalWrite(Grid3, LOW);
  digitalWrite(Grid4, LOW);
  digitalWrite(Grid5, LOW);
}

void digit2(){  // 1 ..  5
    digitalWrite(Grid1, LOW);
  digitalWrite(Grid2, HIGH);
  digitalWrite(Grid3, LOW);
  digitalWrite(Grid4, LOW);
  digitalWrite(Grid5, LOW);
}

void digit3(){  // 1 ..  5
    digitalWrite(Grid1, LOW);
  digitalWrite(Grid2, LOW);
  digitalWrite(Grid3, HIGH);
  digitalWrite(Grid4, LOW);
  digitalWrite(Grid5, LOW);
}

void digit4(){  // 1 ..  5
    digitalWrite(Grid1, LOW);
  digitalWrite(Grid2, LOW);
  digitalWrite(Grid3, LOW);
  digitalWrite(Grid4, HIGH);
  digitalWrite(Grid5, LOW);
}

void digit5(){  // 1 ..  5
    digitalWrite(Grid1, LOW);
  digitalWrite(Grid2, LOW);
  digitalWrite(Grid3, LOW);
  digitalWrite(Grid4, LOW);
  digitalWrite(Grid5, HIGH);
}

void _1(){  //
  digitalWrite(anodeA, LOW);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, LOW);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, LOW);
  digitalWrite(anodeG, LOW);
}

void _2(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, LOW);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, HIGH);
  digitalWrite(anodeF, LOW);
  digitalWrite(anodeG, HIGH);
}

void _3(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, LOW);
  digitalWrite(anodeG, HIGH);
}

void _4(){  //
  digitalWrite(anodeA, LOW);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, LOW);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, HIGH);
}
void _5(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, LOW);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, HIGH);
}
void _6(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, LOW);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, HIGH);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, HIGH);
}
void _7(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, LOW);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, LOW);
  digitalWrite(anodeG, LOW);
}
void _8(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, HIGH);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, HIGH);
}
void _9(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, LOW);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, HIGH);
}
void _0(){  //
  digitalWrite(anodeA, HIGH);
  digitalWrite(anodeB, HIGH);
  digitalWrite(anodeC, HIGH);
  digitalWrite(anodeD, HIGH);
  digitalWrite(anodeE, HIGH);
  digitalWrite(anodeF, HIGH);
  digitalWrite(anodeG, LOW);
}
void _111(){  // blank
  digitalWrite(anodeA, LOW);
  digitalWrite(anodeB, LOW);
  digitalWrite(anodeC, LOW);
  digitalWrite(anodeD, LOW);
  digitalWrite(anodeE, LOW);
  digitalWrite(anodeF, LOW);
  digitalWrite(anodeG, LOW);
}

void disp(int _1,int _2,int _3,int _4){
  VFD(_1);
  digit1();  delay(4);
  VFD(_2);
  digit2();  delay(4);
  digitalWrite(anodeDot, HIGH);
  digit3();  delay(4);
  VFD(_3);
  digit4();  delay(4);
  VFD(_4);
  digit5();  delay(4);
}

void VFD(int dispFig){
  switch (dispFig){
  case 0: //?
    _0() ;break;
  case 1:
    _1();break;
  case 2:
    _2();break;
  case 3:
    _3();break;
  case 4:
    _4();break;
  case 5:
    _5();break;
  case 6:
    _6();break;
  case 7:
    _7();break;
  case 8:
    _8();break;
  case 9:
    _9();break;
  case 111:
    _111();break;
  }
}

void setup() {
  for (int i=0; i<14; i++) pinMode(i, OUTPUT);
  digitalWrite(Grid1, LOW);
  digitalWrite(Grid2, LOW);
  digitalWrite(Grid3, LOW);
  digitalWrite(Grid4, LOW);
  digitalWrite(Grid5, LOW);

  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // attempt to connect to WiFi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }

  Serial.println("Connected to WiFi");

  Serial.println("\nStarting connection to server...");
  timeClient.begin(); 
  delay(500);
}

void loop(){
  //delay(1000);
  timeClient.update();

  String TIME = timeClient.getFormattedTime();
  // Serial.println(TIME);
  String Hr_high = TIME.substring(0, 1);
  String Hr_low = TIME.substring(1, 2);
  String Mini_high   = TIME.substring(3, 4);
  String Mini_low  = TIME.substring(4, 5);
  if (Hr_high=="0") { 
    disp(111,Hr_low.toInt(),Mini_high.toInt(),Mini_low.toInt());
  } else {
    disp(Hr_high.toInt(),Hr_low.toInt(),Mini_high.toInt(),Mini_low.toInt());
  }
}
```

###製作中の様子
　プリント基板もアマゾンで入手しました。
　　　[KEYESTUDIO 10個 プロトタイプ プリント 回路基板 ブレイクアウトPCBボード シールド スターターキット for Arduino UNO R3 アルドゥイーノ アルデュイーノ アルディーノ ブレッドボード セット 電子工作](https://www.amazon.co.jp/gp/product/B07DRHG1QV/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1)
　部品を置いただけ
![IMGP0866s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/e8cc3e66-28d0-5deb-2354-4ae6de3c7d14.png)

　24V側の配線が終わった
![IMGP0868.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/6869f682-2ab6-ac71-35b8-1679dd28bfde.png)
　裏面
![IMGP0870.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/7d12235b-0806-815e-2125-59b472249682.png)

表示例
![IMGP0887.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/19b4ddd2-98ca-702c-d72a-46dc4b30f286.png)