ESP8266(Arduino)で、NTP時計+温湿度計を実装する
Table of Contents
ESP8266を使って、NTP(インターネット経由)で時刻を同期する時計を実装してみました。 ディスプレイ右下の2つの数字は、温度(小数点1位まで)と湿度(丸め込みした整数)です。
制作の背景 #
自宅の仕事部屋には以下の課題がありました。
- 電波時計が電波を受信しない
- 1週間で30秒近くずれることもある
- 大型7セグLEDの温度計がUBSハブの電力を使ってしまうっぽい
- ハブを共有しているスマホ等の充電に時間がかかる
- USBハブには、電力不足に備えたコンセントからの電力供給があるが……
そこで、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時間程かかりました。はんだ付けのときに基盤とワイヤを固定するクリップがほしいと、初めて思いました。
最後に、ちょうど手元にあった薄めのダンボールをカットし、箱にしてみました。 基盤むき出しだと、ホコリが溜まる心配もあるので、ひとまずこれで良さそう!
とりあえず箱に詰めてみた。超アンバランスだけど、基盤むき出しよりはマシかな。ひとまず、これでしばらく使ってみよう。 pic.twitter.com/JPexHLklzw
— 鈴木 孝宏 (@sussan0416) January 3, 2021
これで完成!
余談 #
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
- ~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/tools/pyserial/serial/tools/list_ports_osx.py を開く
- 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')