2023年4月24日月曜日

ニキシー管時計はESP32でntp時計に

ニキシー管時計の制御マイコンにはESP32を使ってntp時計にしようと思い、秋月でESP32-WROOM-32Eマイコンボードを購入(800円)。ESP32単体でもよかったのですがユニバーサル基板での配線が大変なのでコレにしました。その他に色々と部品を購入。つい送料を薄めたくなって色々と買ってしまう。



取り合えずピンヘッダをはんだ付け。ついてきた実装用のピンヘッダは細ピンヘッダでした。プログラム書き込み用のピンヘッダは、秋月の写真の実装方法では裏面に付いていたが表面に付けてしまった。でもこっちの方が書き込み用のジャンパ線を挿し易い。


以前にも載せたことがありますが、ntpで日付と時間を取得して表示した様子。書き込みに使ったUSB to TTL変換アダプタはアリエクで数百円だったもの。1~2年前に買ってあって今回初めて使った。

無事に書き込めて動きました。
一応、プログラムは以前と同じ以下です。無保証です。
//------------------------------------------------------------------------
//                                                          '22.05.14 naka
//  ESP32 ntp時計(小型液晶に日付と時刻表示)
//
//------------------------------------------------------------------------
#include <WiFi.h>
#include <WiFiClientSecure.h>

#define SDAPIN  21
#define SCLPIN  22
#define SERIAL_OUT 25

#include <FaBoLCDmini_AQM0802A.h>
FaBoLCDmini_AQM0802A lcd;

char ssid[] = "Your-WiFi-SSID";
char password[] = "Your-SSID-Password";

void setup()
{
  char msg[128];

  pinMode(SERIAL_OUT, OUTPUT);
  digitalWrite(SERIAL_OUT, HIGH);
  
  Serial.begin(115200);

  // モニタLCD設定
  SetupLCD();
  dispLCD_msg("NTP-    ","   CLOCK");
  delay(1000);

  if (wifi_connect()) {
    // NTPサーバに接続し、時刻設定
    configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp"); 
    Serial.print("NTP done");
    disp_time();
    delay(1000);
  }

  // 監視時はWiFi未接続にする
  wifi_disconnect(); 
}

void loop()
{ 
  disp_time();
  delay(1000);
}

void disp_time() {
  char yymmdd[10],hhmmss[10];
  struct tm timeinfo;
  getLocalTime(&timeinfo);

  sprintf(yymmdd, "%02d.%02d.%02d",(timeinfo.tm_year + 1900)%100, timeinfo.tm_mon + 1, timeinfo.tm_mday);
  sprintf(hhmmss, "%02d:%02d:%02d",timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);

  dispLCD_msg(yymmdd,hhmmss);
}

void dispLCD_msg(char msg1[],char msg2[]) {
  lcd.clear();
  lcd.print(msg1);
  lcd.setCursor(0, 1); // Col,Raw
  lcd.print(msg2);
}

void SetupLCD() {
  lcd.begin();
  lcd.command(0x38);
  lcd.command(0x39);
  lcd.command(0x14);
  lcd.command(0x71);
//  lcd.command(0x51);  // 5V
  lcd.command(0x56);  // 3.3V
  delay(2);
  lcd.command(0x6c);
  delay(300);
  lcd.command(0x38);
  delay(1);
  lcd.command(0x01);
  delay(2);
  lcd.command(0x0c);
  delay(2);
}

// Wifi接続
bool wifi_connect() {
  char msg[128];

  // 静的アドレスとDNS指定(普通は要らないはずだが、我が家のWiFiルータは動的割り当てとDNSサーバ指定がないとダメだった)
  IPAddress myIP(192,168,0,78);
  IPAddress gateway(192,168,0,1);
  IPAddress subnet(255,255,255,0);
  IPAddress dns1(8, 8, 8, 8); // Google DNS primery server
  IPAddress dns2(8, 8, 4, 4); // Google DNS secondary server
  WiFi.config(myIP,gateway,subnet,dns1,dns2);
  
  for (int i=0;i<5;i++) { // WiFi接続、5回繰り返す
    WiFi.begin(ssid, password);
    delay(1000);
    Serial.print(msg);
    
    long int StartTime=millis();
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        if ((StartTime+10000) < millis()) break; // 10秒待って繋がらないときは諦める
    } 
  
    if (WiFi.status() == WL_CONNECTED) {
      IPAddress ip = WiFi.localIP();
      sprintf(msg,"WiFi connected IP:%d.%d.%d.%d",ip[0], ip[1], ip[2], ip[3]);
      Serial.print(msg);
      break;
    }
  } 

  if (WiFi.status() != WL_CONNECTED) return false;

  return true;
}

void wifi_disconnect() {
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

//-------------------------------------------------------------------------------
// EOF
//-------------------------------------------------------------------------------

発注したIN-14変換基板 はまだ届きませんが、ntpで取得した時刻をダイナミック点灯で表示するプログラムを書き始めようと思っています。

0 件のコメント:

コメントを投稿