今から始める電子工作 Step3 ③ Wi-Fi、SPI グラフィック・ディスプレイ -テキスト
前回、SPIバスのグラフィック・ディスプレイをArduino UNO R4 WiFiに接続し、テキストの表示ができるところまで確認しました。
前々回、Wi-Fi経由でNTPで時刻を取得しました。今回、時刻をグラフィック・ディスプレイに表示します。
●環境
- Arduino IDE;2.3.4
- Windows11;24H2
- Arduino UNO R4 WiFi
●NTPで時刻を得る
時刻を得るための処理を最低限のスケッチで実現します。
前回のサンプルはスケッチが長いです。今回は、NTPClientがライブラリに用意されているので導入します。
ライブラリのソースは下記にあります。
https://github.com/arduino-libraries/NTPClient/tree/master
examplesにあるBasic.inoをベースに、修正しました。最初の時刻はUTCで、その次がJSTです。
#include <NTPClient.h>
#include <WiFiS3.h> // for WiFi shield
#include <WiFiUdp.h> #include "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) WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP); void setup(){ Serial.begin(9600); delay(2000); Serial.println("\nstart Wi-Fi connect"); WiFi.begin(ssid, pass); while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); } timeClient.begin(); } void loop() { timeClient.update(); Serial.println(""); Serial.println(timeClient.getFormattedTime()); int H = timeClient.getHours() + 9;
if (H > 24 ) H = H - 24;
Serial.print(H); Serial.print(":"); Serial.print(timeClient.getMinutes()); Serial.print(":"); Serial.println(timeClient.getSeconds()); delay(3000); }
実行している様子です。
●時刻をグラフィック・ディスプレイに表示する
前回のグラフィック・ディスプレイにテキストを表示するスケッチと上記のスケッチとを合体させます。
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#include <Fonts/FreeMonoBold18pt7b.h> #define TFT_CS 10 #define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC 8 #include <NTPClient.h>
#include <WiFiS3.h> // for WiFi shield
#include <WiFiUdp.h> #include "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) Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP); void setup(){ Serial.begin(9600); delay(2000); Serial.println("\nstart Wi-Fi connect"); tft.init(240, 320); // Init ST7789 320x240 Serial.println(F("Initialized TFT")); tft.fillScreen(ST77XX_BLACK); tft.setRotation(3); tft.setFont(&FreeMonoBold18pt7b); Serial.println(); WiFi.begin(ssid, pass); while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); } timeClient.begin(); } void loop() { timeClient.update(); Serial.println(""); Serial.println(timeClient.getFormattedTime()); int H = timeClient.getHours() + 9; if (H > 24 ) H = H - 24; Serial.print(H); Serial.print(":"); Serial.print(timeClient.getMinutes()); Serial.print(":"); Serial.println(timeClient.getSeconds()); tft.fillScreen(ST77XX_BLACK); tft.setCursor(10, 80); tft.setTextColor(ST77XX_YELLOW); tft.setTextSize(2); tft.print(H); tft.print(":"); tft.print(timeClient.getMinutes()); tft.print(":"); tft.print(timeClient.getSeconds()); delay(3000); }
フォントは下記のディレクトリに入っています。
C:\Users\ユーザ名\Documents\Arduino\libraries\Adafruit_GFX_Library\Fonts
実行中の様子です。