2021-01-31に更新

時計を手作りする

時計を手作りする

はじめに

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のリンク先。上に書いてある安定版を選ぶ。image
下の方のテキストボックスに貼る。
image

ライブラリのインクルード

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)
image.png
Amazonに書いてあったやつだ!!!
image.png
気合いで読む。
image.png
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();
}

やったね。

ツイッターでシェア
みんなに共有、忘れないようにメモ

vuchvu

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント