お父にゃんの電子工作 -3ページ目

お父にゃんの電子工作

暇なおじさんが、電子工作(主にラジオ製作)をして勝手な感想を書く

前回買ったCYD(Cheap Yellow Display)は技適マークの無いXH-32SというESP32互換モジュールが載った怪しい偽物?だった。

気を取り直してAli-Expressで別のベンダーにCYDを発注した。届いたCYDはちゃんと技適マークのESP32-WROOMが載った正規品?と思われる物だった。今回は「当たり」のようだ。

Ali-Expressでの買い物は一種の賭けみたいなもんである。届いてみるまでは、何が届くか分からない。なんとも困ったもんである。できるだけ写真付きのユーザーレビューを見て選ぶのが良いようだ。

 

今回は、ケースも一緒に購入。ケースと言っても板2枚をスペーサとネジで固定する簡易的な物だった。

電源を入れてみると、前に買ったのとは別のデモプログラムが動作する。

新しい証拠だろうか?

とりあえず動作はするようだ。

内部回路は、偽物も本物も同じはずで以下と思われる。

 

前にも書いたが、 こちらのページ等によると、USBコネクタが2つ付いた新しいのは、Displayコントローラーは ILI9341ではなくて、ST7789が使われているらしい。

前に届いた怪しい物は ILI9341だったので、確認のために、前に作ったDSPラジオのUIだけのプログラムを動かしてみる。

 

なお、Arduino/libraries/TFT_eSPI/User_Setup.h を編集して以下の内容に変更した。
青字部分が、ST7789用に追加、変更した部分
-------------------------------
#define ST7789_DRIVER
#define TFT_INVERSION_OFF
#define TFT_RGB_ORDER TFT_BGR
#define TFT_WIDTH  240 // ST7789 240 x 240 and 240 x 320
#define TFT_HEIGHT 320 // ST7789 240 x 320
#define TFT_MISO 12
#define TFT_MOSI 13
#define TFT_SCLK 14
#define TFT_CS   15
#define TFT_DC    2
#define TFT_RST  -1
#define TOUCH_CS 33
#define LOAD_GLCD
#define LOAD_FONT2
#define LOAD_FONT4
#define LOAD_FONT6
#define LOAD_FONT7
#define LOAD_FONT8
#define LOAD_GFXFF
#define SMOOTH_FONT

---------------------------------------------------

最初、色がおかしくて焦ったが、上記のように設定すると、ちゃんと表示出来た。

ST7789が使われているのは間違いないだろう。

 

次に、WiFiが使えるので、前に試したWiFiManagerでWiFi設定を移植する。

(WiFiManagerに関しては前の記事を参照)

 

画面を何処でもタッチしながら電源を入れると、WiFi設定モードになる。

無事WiFiに接続できると、こんな感じに表示してから立ち上がる。

 

次に、NTPサーバーに繋いで時刻を表示するサンプルプログラムをChatGPTにお願いして書いてもらった↓。これを移植する。

#include <WiFi.h>
#include <time.h>
#include <Ticker.h>
 
const char* ssid     = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
 
// 日本標準時 (UTC+9)
const long  gmtOffset_sec = 9 * 3600;
const int   daylightOffset_sec = 0;
 
// NTP サーバー
const char* ntpServer = "ntp.nict.jp";   // 日本向け
 
Ticker ntpTicker;
 
void syncTimeWithNTP() {
  Serial.println("NTPサーバーに接続して時刻同期します...");
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
 
  struct tm timeinfo;
  if (getLocalTime(&timeinfo, 10000)) {  // 最大10秒待つ
    Serial.println("NTP時刻同期成功");
  } else {
    Serial.println("NTP時刻同期失敗");
  }
}
 
void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("時刻取得失敗");
    return;
  }
 
  const char* weekStr[] = {
    "日", "月", "火", "水", "木", "金", "土"
  };
 
  Serial.printf(
    "%04d/%02d/%02d (%s) %02d:%02d:%02d\n",
    timeinfo.tm_year + 1900,
    timeinfo.tm_mon + 1,
    timeinfo.tm_mday,
    weekStr[timeinfo.tm_wday],
    timeinfo.tm_hour,
    timeinfo.tm_min,
    timeinfo.tm_sec
  );
}
 
void setup() {
  Serial.begin(115200);
 
  WiFi.begin(ssid, password);
  Serial.print("WiFi接続中");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi接続完了");
 
  // 起動時にNTP同期
  syncTimeWithNTP();
 
  // 10分ごと(600秒)にNTP再同期
  ntpTicker.attach(600, syncTimeWithNTP);
}
 
unsigned long lastPrint = 0;
 
void loop() {
  // 1秒ごとに内部RTCの時刻を表示
  if (millis() - lastPrint >= 1000) {
    lastPrint = millis();
    printLocalTime();
  }
}

 

日付と時刻を、このように表示するようにしてみた。

まぁ、こんなもんぢぁろう。

 

今回はここまで。

このプログラムは以下に入れておきますので、興味のある方はどうぞ

 

CYD_terminal_v01

 

これにいろいろ追加して、様々な情報が表示できる端末にして遊んでみたいのである。

 

 

 

「おいらで遊ばないで欲しいにゃ、おいらは眠いのニャ」

そんなこと言わずに、相手してよ