PSO2をやっていると、時刻が変わった瞬間にクエストを受注するときがある。(多分)
NTPサーバと通信して(比較的)正確な時計が作れないか、いい物がないか探していたら発見した。
waves ESP32 0.96“ OLED モジュール ESP-WROOM-32 ESP-32 CPU Lolin Waves https://www.amazon.co.jp/dp/B07GWQSTJ3/ref=cm_sw_r_tw_dp_6W77QYN6QSNXA0HGJ0KR?_encoding=UTF8&psc=1
商品ページには、
* ボードはWEMOS LOLIN32を選ぶ
* Flash Frequencyは80MHz
* Upload Soeedは921600
* ボードに書き込むときは、Connectingの表示が出てからBootボタンを3秒程度押す
* SSD1306ライブラリを使う https://github.com/ThingPulse/esp8266-oled-ssd1306
* ディスプレイを使うときは次の文を入れる
SSD1306 display(0x3D, 5, 4);
…と書いてあった。
ちなみに購入したのが2019年の9月で完成したのが2021年の1月。始めるとすごい疲れるのでなかなかできなかった。
試した順番とか細かく思い出せない。
ファイル>環境設定>追加のボードマネージャのURL のところにURLを貼る。
貼るURLは、(1)にアクセスしてInstructions forBoards Managerのリンク先。上に書いてある安定版を選ぶ。
下の方のテキストボックスに貼る。
githubからライブラリをZIP形式でダウンロードする。展開はしなくて大丈夫。
スケッチ>ライブラリのインクルード>.ZIP形式のライブラリのインストール からダウンロードしたZIPファイルを選択する。
ファイル>スケッチ例>ESP32>SimpleTime を選ぶ。
4,5行目の、この部分は自分の環境に合わせて書き換える。
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";
次の行で、NTPサーバや時差の設定ができる。下2行は日本なら固定。
const char* ntpServer = "ntp.nict.jp";
const long gmtOffset_sec = 3600*9;
const int daylightOffset_sec = 0;
何故かルータと繋がらないので、スマホのテザリングで繋げた。
ツールからシリアルモニタを開くと、Wi-Fiに繋がった!とか、今の時間!をお知らせしてくれる。
多分C言語から入ったからなんだけど、日時を格納する変数があるのがどうもピンとこない。高機能すぎ!?
画面表示もスケッチ例から必要部分を抜き出そう…と思ったが、長すぎてポイントが分からない。
時計のデモが入っていたけど何故かアナログ時計。仕方ないのでgithubを見て考える。(2)
Amazonに書いてあったやつだ!!!
気合いで読む。
SSD1306は初めて使ったわけじゃなくて、なんとなく覚えていたんだけど、display関数を使ってやっと表示になるらしい。後、display関数を使う前にclear関数で残っているデータを消してあげる必要もある。
#include <WiFi.h>
#include<Wire.h>
#include "SSD1306Wire.h"
#include "time.h"
#define OLED_RESET 4
const char* ssid = "********";
const char* password = "********";
const char* ntpServer = "ntp.nict.jp";
const long gmtOffset_sec = 3600*9;
const int daylightOffset_sec = 0;
SSD1306Wire display(0x3c, 5, 4);
void printLocalTime()
{
struct tm timeinfo;
getLocalTime(&timeinfo);
display.setLogBuffer(5, 30);
display.clear();
display.println(&timeinfo, "%H:%M:%S");
display.drawLogBuffer(0, 0);
display.display();
}
void setup()
{
Serial.begin(115200);
display.init();
display.setFont(Walter_Turncoat_Regular_30);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop()
{
delay(100);
printLocalTime();
}
時計できたあ〜 pic.twitter.com/nWishPDHIV
— ヴヂュヴ (@x_vuchvu_x) January 16, 2021
やったね。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント