ESP8266を使って、NTP(インターネット経由)で時刻を同期する時計を実装してみました。 ディスプレイ右下の2つの数字は、温度(小数点1位まで)と湿度(丸め込みした整数)です。

NTPクロック+温湿度計

制作の背景

自宅の仕事部屋には以下の課題がありました。

  • 電波時計が電波を受信しない
    • 1週間で30秒近くずれることもある
  • 大型7セグLEDの温度計がUBSハブの電力を使ってしまうっぽい
    • ハブを共有しているスマホ等の充電に時間がかかる
    • USBハブには、電力不足に備えたコンセントからの電力供給があるが……

電波状態が悪く時刻同期しない電波時計と、割と電力食うっぽい大型7セグLEDの温度計

そこで、ESP8266(ESPr Developer)を使い、NTPで時刻を同期する時計を作ることにしました。

制作

使用したモジュール類

  • Arduino(ESPr Developer: ESP8266開発キット)
  • 16 x 2 キャラクタディスプレイ(AE-AQM1602A: ST7032のモジュールキット)
  • 温湿度センサ(DHT11)

制作の流れ

最終的なプログラムは、こちらのGISTです。 https://gist.github.com/sussan0416/07dffdf9359381009ba049199f16be1b

NTP時計の実装

大まかなプログラムの流れは、こちらのブログを参考にして作成しました。ほぼこれが原型です。 https://www.hiramine.com/physicalcomputing/espwroom02/ntp_clock.html

ただ、僕の環境だと I2CLiquidCrystal がうまく動作しませんでした。 そのため、 LCD_ST7032 を使って実装することにしました。実装方法はほとんど変わりません。 使えるメソッド名は、ヘッダファイル LCD_ST7032.h を読んで確認しました。

ここまでで、表示できることを確認。

時刻が表示できることを確認

温湿度センサの追加

いくつかのサイトを参考にし、まずDHTのライブラリを使うことを確認。 https://omoroya.com/arduino-lesson11/ https://iot.keicode.com/arduino/temperature-dht11.php https://qiita.com/masato/items/99e5dac91d13650e90a2

ライブラリマネージャから DHT sensor library をインストールすると、プログラムの実装例が見られるようになります。したがって、おおまかな実装は、その例を拝借しました。

ESP8266の3番ポートはRXDだから使わないようにする

DHTのライブラリ例では、3番のポートも使えると書いてあったので、そこにDATAの信号をアサインしました。 すると、スケッチの書き込みが、タイムアウトするようになりました。3番をやめて14番に差し替えたところ、症状は収まり、正常に書き込めるようになりました。

https://qiita.com/umi_kappa/items/ac3d37db44a2dcfe71fd

ここまでで、ブレッドボードで回路と挙動を確認。

温湿度センサも込みで動作確認

ユニバーサル基板に実装する

ユニバーサル基板に実装してみることにしました。今回が初めてです。 場所の検討から実装まで、トータル3時間程かかりました。はんだ付けのときに基盤とワイヤを固定するクリップがほしいと、初めて思いました。

最後に、ちょうど手元にあった薄めのダンボールをカットし、箱にしてみました。 基盤むき出しだと、ホコリが溜まる心配もあるので、ひとまずこれで良さそう!

これで完成!

余談

ESPr Developerの使い方をいまいち忘れていたというか……そもそも今使っているPCにArduino環境がなかったので、このサイトを参考に改めて開発環境を作りました。 https://www.mgo-tec.com/blog-entry-ss-wroom-howto01.html

ESP8266のボードがなかったので、またまたこのサイトを参考にしてボードをインストールしました。助かった……。 https://www.mgo-tec.com/esp8266-board-install01-html

ちなみにESP8266のライブラリはここ。ボードをインストールすると一緒に入ってきます。 https://github.com/esp8266/Arduino

そうそう、最初、ESP8266に書き込みができなくて困りました。 調べたところ、Big Surだとそうなるらしいです。以下のサイトを参考にして、対処しました。 https://forum.arduino.cc/index.php?topic=702144.0

  1. ~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/tools/pyserial/serial/tools/list_ports_osx.py を開く
  2. 29行目と30行目をコメントアウトし、以下に示すように変更する。
#iokit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('IOKit'))
#cf = ctypes.cdll.LoadLibrary(ctypes.util.find_library('CoreFoundation'))
iokit = ctypes.cdll.LoadLibrary('/System/Library/Frameworks/IOKit.framework/IOKit')
cf = ctypes.cdll.LoadLibrary('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation')