毎朝、みなさんはどのようなアラーム時計で目覚めていますか?一般的なアラーム時計でやってしまいがちな、「ベッドから手を伸ばして、アラームを止めて二度寝する」ということが簡単にできてしまう問題。
そこで今回、ESP32を使って、この問題を解決する「二度寝防止アラーム時計」を作ってみることにしました。
今回の電子工作レシピ
完成までの時間目安:120分
名前 | 購入元 | 値段 |
---|---|---|
ESP32-DevKitC(2個) | 秋月電子通商 | 1,480円 |
DS3231モジュール | Amazonなど | 300円程度 |
LIR2032(ボタン充電池) | Amazonなど | 360円程度 |
スピーカー | 秋月電子通商など | 100~200円程度 |
2.8インチSPI接続320×240ピクセル液晶ディスプレイ | Amazonなど | 1,480円程度 |
※上記のほかに、タクトスイッチ1個、LED1個、100Ω程度の抵抗1個も必要
今回の記事の流れ
- 今回作るアラーム時計について
- 日時を刻む「RTC」
- 液晶ディスプレイに日時を表示
- MP3モジュールでアラーム音を出す
- アラーム時計本体の配線
- 子機の配線
- ライブラリとフォントファイルのインストール
- アラーム時計本体のプログラム
- 子機のプログラム
- 動作の確認
- まとめ
今回作るアラーム時計について
ESP32を使って、一般的なアラーム時計のように日付や時刻をディスプレイに表示し、指定した時刻にアラーム音を出せるようにしてみます。さらに「二度寝防止アラーム時計」にするために、アラーム時計本体と、アラームを止めるためのボタンがついた子機を別々の場所に置き、起き上がって子機のところまで歩かないとアラームを止められないという仕組みを考えてみました。
以下の動画のように、ESPを2つ使って、片方を本体、もう片方を子機にします。動画では本体と子機が隣にありますが、WiFiで接続できる範囲であれば、離して置くことが可能です。
本体と子機を離した場所に置くために、ESP32のWiFiの機能を活用します。2つのESP32をWebサーバーかつクライアントとして動作させて、HTTPで図1のように通信するようにします。
日時を刻む「RTC」
Arduinoなどのマイコンでは、起動時からの経過時間を取得できることが一般的です。それを応用して、時計の表示に使うこともできなくはありません。ただ、得られる時刻があまり正確ではありませんし、電源を切ると経過時間がリセットされるという問題もあります。
ESP32なら、WiFiを経由してインターネットに接続することができますので、インターネット上のNTPサーバーから定期的に日時を取得し、それをESP32に設定して利用することも可能です。しかし、Arduino Unoなど、インターネット接続機能がないマイコンもあり、日時を扱いやすくする仕組みがあると便利です。
そこで、「RTC」(Realtime Clock)というICを使うことがよくあります。RTCは、一定周期の信号を発する素子を元にして、時刻を刻むことができるICです。また、電池などの外部電源を接続して、マイコン本体の電源がオフの間でも時刻を刻み続けることができます。RTCにはいろいろな製品がありますが、今回は「DS3231」というRTCがモジュール化されたものを使います。
DS3231のモジュールは、電子工作で使うRTCモジュールの中ではポピュラーで、入手しやすいものです。接続はI2Cなので、線は4本で済みます。また、RTCの機能だけでなく、温度センサーの機能もあります(ただし、温度センサーは今回の記事では使いません)。
なお、写真1のDS3231では、マイコンの電源を切っても日時を刻み続けるように、「LIR2032」というボタン電池を取り付けます。LIR2032はCR2032と同じ大きさの電池ですが、充電池になっている点が異なります。
液晶ディスプレイに日時を表示
時計は現在の日時の確認に使うものですので、日時を分かりやすく表示できることが必要です。日時を表示するのに使うデバイスとしては、以下のようなものがあります。
- 7セグメントLED
- マトリックスLED
- OLEDディスプレイ
- キャラクタ液晶ディスプレイ
- グラフィック液晶ディスプレイ
デバイスによってライブラリが違いますし、プログラムの方法も違いがあります。また、作りたいものに適しているかどうかも異なってきます。例えば、7セグメントLEDは数字だけを安価に表示するのに適していますが、細かな表示には向いていません。上記の中では、グラフィック液晶ディスプレイが最も汎用的で、様々な工作に活用できるため、今回はそちらを使うことにしました。
液晶ディスプレイモジュールにもいろいろなものがありますが、今回は「ILI9341」というコントローラを搭載していて、SPI接続のものを使います(写真2)。液晶ディスプレイモジュールの中ではよく見かけるものであり、また2.2インチ/2.4インチ/2.8インチの3つの大きさの製品が販売されていますので、工作するものに合わせて使い分けやすいというメリットがあります。
MP3モジュールでアラーム音を出す
アラーム時計なので、指定の時刻に音を出すことも必要です。ESP32にブザーを接続して単音を出すこともできますが、できれば自分の好きな音を使いたいところです。そこで、任意のMP3データを再生することができる「DFPlayer Mini」というモジュールを使うことにします(写真3)。
DFPlayer Miniは、シリアル接続でコマンドを送ることで、microSDカード内のMP3を再生することができるモジュールです。スピーカー出力のピンに、小さなスピーカーを接続して音を出すことができます。
アラーム時計本体の配線
それでは、実際の制作に入りましょう。まず、アラーム時計本体の配線を行います。
2枚のブレッドボードを使い、1枚にESP32とDS3231、もう1枚に液晶ディスプレイとDFPlayer Miniを接続します。各パーツの配線は図2のようになります。
ESP32は幅が広く、通常のブレッドボードだと片側にしかジャンプワイヤを刺すことができません。そこで、電源ラインが片側だけで、その代わりに穴が1列多いブレッドボードを使います(サンハヤトのSAD-101など)。
ESP32と液晶ディスプレイはSPIで接続します。ESP32ではSPIを2系統使うことができますが(VSPIとHSPI)、VSPI(18/19/23番ピン)を使います(表1)。
ESP32とDS3231は、I2Cで接続します。ESP32では任意のピンにI2Cを割り当てることができますが、標準のピン(SDA=21番、SCL=22番)を使います(表2)。
DFPlayer Miniはシリアルで接続します。ESP32では3系統のシリアルを使うことができますが、16番ピンと17番ピンの組み合わせのものを使います(表3)。また、DFPlayer Miniの「SPK1」と「SPK2」のピンにスピーカーを接続します。
ESP32のピン | 液晶ディスプレイのピン |
---|---|
5V | VCC |
GND | GND |
5 | CS |
4 | RESET |
2 | DC |
23 | MOSI |
18 | SCK |
19 | MISO |
表1 ESP32と液晶ディスプレイの接続
ESP32のピン | DS3231のピン |
---|---|
5V | VCC |
GND | GND |
21 | SDA |
22 | SCL |
表2 ESP32とDS3231の接続
ESP32のピン | DFPlayer Miniのピン |
---|---|
5V | VCC |
GND | GND |
16 | TX |
17 | RX |
表3 ESP32とDFPlayer Miniの接続
子機の配線
次に、子機も配線します。こちらの配線は図3のようになります。
ESP32にスイッチとLEDを接続するだけです。スイッチの片側をESP32の3V3のピンに接続し、もう片方を4番ピンに接続します。また、ESP32の13番ピンから、抵抗→LEDと経由して、GNDに接続します。
なお、スイッチの状態を読み取る回路では、本来ならプルアップ抵抗もしくはプルダウン抵抗を入れます。ただ、ESP32では内蔵の抵抗でプルアップ/プルダウンを行うことができますので、外付けの抵抗は省略します。
ライブラリとフォントファイルのインストール
配線ができたら、今度はプログラムを作っていきます。まず、以下の各ライブラリをインストールします。
- Adafruit GFX
- Adafruit ILI9341
- RTCLib
- DFRobotDFPlayerMini
インストールの手順は以下の通りです。
- Arduino IDEを起動します。
- 「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」メニューを選び、ライブラリマネージャを開きます。
- 「検索をフィルター」の欄に「Adafruit GFX」と入力します。
- ライブラリの一覧にAdafruit GFXが表示されますので、「インストール」ボタンをクリックします(図4)。
- 同じ要領で、各ライブラリを順にインストールします。
なお、RTCLibとDFPlayerのライブラリは、似たような名前の物が複数あります。RTCLibは「RTCLib by Adafruit」を、DFPlayerは「DFRobotDFPlayerMini by DFRobot」をインストールします。
また、時刻を大きな文字で表示するために、フォントファイルもインストールします。以下のZipファイルをダウンロードして解凍すると、「FreeSans40pt7b.h」というファイルができます。
Arduino IDEの標準のスケッチ保存先フォルダを開き、その中にある「libraries」→「Adafruit_GFX_Library」→「Fonts」フォルダを開いて、そこにフォントのファイルをコピーします。
アラーム時計本体のプログラム
次に、Arduino IDEでアラーム時計本体のプログラムを作り、ESP32に書き込みます。プログラムの内容はリスト1のようになります。
リスト1 アラーム時計本体のプログラム
ただし、17行目〜21行目は、以下のように書き換えることが必要です。
お手持ちのWiFiルーターのSSID/パスワードに合わせて書き換えます。
ESS32に割り当てるIPアドレスを指定します。お手持ちのWiFiルーターのネットワーク構成に合わせて、ご自分でIPアドレスを決めます。
なお、通常のIPアドレスは4つの数値をピリオドで区切りますが、この行では関数の引数の形になっていますので、4つの数値をコンマで区切ります。
ネットワークのデフォルトゲートウェイのIPアドレスを指定します。通常はWiFiルーターのIPアドレスになります。IPアドレスの4つの数値はコンマで区切ります。
子機のESP32に割り当てるIPアドレスに合わせて書き換えます。
例えば、表4のように設定したい場合、17〜21行目をリスト2のように書き換えます。
項目 | 設定値 |
---|---|
WiFiルーターのSSID | my_wifi |
WiFiルーターのパスワード | my_password |
本体のESP32に割り当てるIPアドレス | 192.168.1.101 |
デフォルトゲートウェイのIPアドレス | 192.168.1.1 |
子機のESP32に割り当てるIPアドレス | 192.168.1.102 |
表4 本体のネットワーク関係の設定の例
リスト2 17〜21行目の書き換えの例
const char *pass = “my_password”;
IPAddress ip(192, 168, 1, 101);
IPAddress gateway(192, 168, 1, 1);
const char* notify_url = “http://192.168.1.102/alarm”;
子機のプログラム
一方、子機のプログラムはリスト3のようになります。
なお、リストの5〜9行目は、アラーム時計本体と同じ要領で書き換えます。ただし、7行目には子機に割り当てるIPアドレスを指定します。また、9行目の「本体のIPアドレス」には、アラーム時計本体のIPアドレスを指定します。
リスト3 子機のプログラム
動作の確認
本体/子機ともにプログラムの書き込みが終わったら、動作を確認します。手順は以下の通りです。
- 32GB以下のmicroSDカードを用意し、「mp3」というフォルダを作ります。
- アラーム音に使いたいMP3ファイルを用意し、「0001.mp3」というファイル名を付けて、1のmp3フォルダに保存します。
- microSDカードをDFPlayer Miniに装着します。
- 本体および子機を起動します。
- しばらくするとWiFiなどの初期化が終わり、本体に現在の日時が表示されます。
- 本体/子機と同じネットワークにあるパソコンなどでWebブラウザを起動し、「http://本体のIPアドレス/」のアドレスに接続します。
- 写真4のようにWebブラウザにアラーム設定のフォームが表示されますので、時刻を指定して「アラーム設定」ボタンをクリックします。
- 「アラームを 10:00:00 に設定しました。」のようにアラームをセットした時刻が表示されます。
- アラームをセットした時刻に、本体で音が鳴ることを確認します。
- アラームをセットした時刻に、子機のLEDが点灯することを確認します。
- 子機のスイッチを押して、アラームが止まることを確認します。
なお、アラームの設定を解除するには、Webブラウザで「http://本体のIPアドレス/」のアドレスに接続し、「アラームOff」のボタンをクリックします。
まとめ
ESP32はWiFiでネットワークに接続することができます。インターネットに接続するのはもちろんのこと、今回の事例のように、ネットワーク内の機器同士の接続に使うこともでき、様々な電子工作に活用することができます。v