ESP32を使った電源周波数モニタの製作 (ソフト解説編)
◆まえがき
前の記事に続いてソフト解説編(操作説明)です。
◆外観

◆操作スイッチ類

OLEDの画面の左下が表示モード切り替えスイッチ。これ以外のスイッチはケースの中にあります。
◆プログラム
少し長いので下記にリンクを置いておきます。
20210417AcFreqMonitor.ino (Shift JISエンコード)
以下は簡単な解説です。
1) 接続などに使うプライベートな情報は伏せ字になっています。
2) 電源周波数の平均値、最大値、最小値を30秒毎に Ambient に送信しています。sendAmbient() 関数
3) 電源周波数が設定値を下回ったら IFTTT をトリガしています。triggerIFTTT() 関数
4) IFTTTはセキュアなアクセスにしないといけないはずなのですが、普通のhttpアクセスになっています(証明書を使っていません)。このあたり、実は良く判っていません。こちらの記事にもそのあたりの話が少し出て来ます
5) 周波数低下アラームを出す周波数は下記で設定しています。現在は49.875Hz
#define ARM_FREQ 49.875 // 周波数の低下を検知する周波数(この値以下で通報)
6) OLEDの表示ライブラリはAdafruit_SSD1306.h を使っています。 u8g2を使えばもっと格好良いフォントが使えるのですが、面倒なので止めました。
7) 周波数測定のアルゴリズムは、交流波形を割り込みで50回(60回)検出した時の micros() の値の参照で行っています。これが原因かも知れませんが、少しばらつきが大きいようです。
◆機能解説
1)Ambientへ送信して可視化
電源周波数を1秒毎に測定し、30秒間の平均値、最大値、最小値を Ambient に送信しています。Ambientの該当ページに周波数の変化グラフを表示しています。
2) 周波数低下アラーム
周波数が設定値を下回ったら、IFTTT 経由で自分の LINE に通知を送ります。ちなみに、周波数低下を検出してから約5秒後に LINE にアラームが届きます。
3) 周波数/電圧表示
ボタンを押す毎に、周波数/電源電圧/非表示をサーキュレートに切り替えます。
OLEDの焼き付き防止のため、操作後1時間で自動消灯します。
自動消灯中に表示スイッチを押すと、以前のモードにかかわらず周波数を表示します。
周波数低下アラームを検出すると、自動的に周波数表示します。
・周波数表示画面

簡易的なアナログ指針があるので、変化が直感的に判り易いです。
・電圧表示画面

AC100Vの電圧です。ESP32の消費電流の影響を受けるので、表示される電圧は目安程度です。基板上の半固定抵抗で電圧の調整を行う時にはこの表示を見て行います。
4) テストスイッチ
このボタンを押すと、IFTTTへ強制的に通知を行い、LINE に通知が届きます。アラーム系の動作確認のために使います。
5) シリアル出力

1秒毎に、最後の表示からの経過時間(秒)、周波数(Hz)、電源電圧(V)を出力します。
30秒毎に、上記の後に平均周波数、最大周波数、最低周波数を表示します。なお、この値が Ambient にも送られます。
周波数が設定値を下回った場合(もしくはTESTボタンが押された場合)は、Frequency Low, と表示し、同時にIFTTTをトリガします。(LINEに通知が届きます)
◆不具合点
Ambientへのデーターのアップロードに失敗することがあり、その場合動作確認のLEDが長く(数秒間)点灯します(通常は0.1秒程度)。この現象が起きた場合、ENボタンを押して再起動することで正常に動くようになります。一度動けば、その後は何日でも問題無く動き続けるようです。
原因は、AmbientとIFTTTへの送信のプログラムの干渉だと思うのですが、うまい解決策が発見出来ていません。対策として、起動したら30秒待ってAmbientへの送信が成功することを確認し、もし失敗していたらENボタンを押して再起動することで逃げています。
◆まとめ
これで電源周波数の変化を長期間、連続記録することが可能になりました。
周波数低下から約5秒後に LINE に通知が届くので、どこにいてもアラームの発生を知ることが出来ます。
この LINE の通知には、測定結果の Ambient のグラフや、他の方が測定された電源周波数のグラフへの URL が入っている下記ページへのリンクが入っています。
電源周波数が低下した際に確認したいサイト
LINE の通知を受信したら、このページを見ることで、詳しい状況が把握できるはずです。
先々月(2月)の大きな地震の際、実際に揺れる前に電源周波数の低下が検出された、という話を聞きました。今回作った仕掛けなら、そういう現象を自動的に検知出来るはずなので、防災に役立つかも知れません。そうは言っても、この通知は自分だけにしか来ないので、しばらく動かして様子を見たいと思います。災害予知は難しそうですが、電力の需給バランスの変動に伴う周波数変動のクセくらいなら検出出来そうな気がします。
PS:IFTTT を通さず、ESP32 から直接 LINE に通知を送った方が簡単だし、遅延も小さくなった可能性があります。実は当初は IFTTT から E-mail の発信を考えていて、他のイベントも同時に実行、なんてことを考えていたのでこういうプログラムになっています。
前の記事に続いてソフト解説編(操作説明)です。
◆外観

◆操作スイッチ類

OLEDの画面の左下が表示モード切り替えスイッチ。これ以外のスイッチはケースの中にあります。
◆プログラム
少し長いので下記にリンクを置いておきます。
20210417AcFreqMonitor.ino (Shift JISエンコード)
以下は簡単な解説です。
1) 接続などに使うプライベートな情報は伏せ字になっています。
2) 電源周波数の平均値、最大値、最小値を30秒毎に Ambient に送信しています。sendAmbient() 関数
3) 電源周波数が設定値を下回ったら IFTTT をトリガしています。triggerIFTTT() 関数
4) IFTTTはセキュアなアクセスにしないといけないはずなのですが、普通のhttpアクセスになっています(証明書を使っていません)。このあたり、実は良く判っていません。こちらの記事にもそのあたりの話が少し出て来ます
5) 周波数低下アラームを出す周波数は下記で設定しています。現在は49.875Hz
#define ARM_FREQ 49.875 // 周波数の低下を検知する周波数(この値以下で通報)
6) OLEDの表示ライブラリはAdafruit_SSD1306.h を使っています。 u8g2を使えばもっと格好良いフォントが使えるのですが、面倒なので止めました。
7) 周波数測定のアルゴリズムは、交流波形を割り込みで50回(60回)検出した時の micros() の値の参照で行っています。これが原因かも知れませんが、少しばらつきが大きいようです。
◆機能解説
1)Ambientへ送信して可視化
電源周波数を1秒毎に測定し、30秒間の平均値、最大値、最小値を Ambient に送信しています。Ambientの該当ページに周波数の変化グラフを表示しています。
2) 周波数低下アラーム
周波数が設定値を下回ったら、IFTTT 経由で自分の LINE に通知を送ります。ちなみに、周波数低下を検出してから約5秒後に LINE にアラームが届きます。
3) 周波数/電圧表示
ボタンを押す毎に、周波数/電源電圧/非表示をサーキュレートに切り替えます。
OLEDの焼き付き防止のため、操作後1時間で自動消灯します。
自動消灯中に表示スイッチを押すと、以前のモードにかかわらず周波数を表示します。
周波数低下アラームを検出すると、自動的に周波数表示します。
・周波数表示画面

簡易的なアナログ指針があるので、変化が直感的に判り易いです。
・電圧表示画面

AC100Vの電圧です。ESP32の消費電流の影響を受けるので、表示される電圧は目安程度です。基板上の半固定抵抗で電圧の調整を行う時にはこの表示を見て行います。
4) テストスイッチ
このボタンを押すと、IFTTTへ強制的に通知を行い、LINE に通知が届きます。アラーム系の動作確認のために使います。
5) シリアル出力

1秒毎に、最後の表示からの経過時間(秒)、周波数(Hz)、電源電圧(V)を出力します。
30秒毎に、上記の後に平均周波数、最大周波数、最低周波数を表示します。なお、この値が Ambient にも送られます。
周波数が設定値を下回った場合(もしくはTESTボタンが押された場合)は、Frequency Low, と表示し、同時にIFTTTをトリガします。(LINEに通知が届きます)
◆不具合点
Ambientへのデーターのアップロードに失敗することがあり、その場合動作確認のLEDが長く(数秒間)点灯します(通常は0.1秒程度)。この現象が起きた場合、ENボタンを押して再起動することで正常に動くようになります。一度動けば、その後は何日でも問題無く動き続けるようです。
原因は、AmbientとIFTTTへの送信のプログラムの干渉だと思うのですが、うまい解決策が発見出来ていません。対策として、起動したら30秒待ってAmbientへの送信が成功することを確認し、もし失敗していたらENボタンを押して再起動することで逃げています。
◆まとめ
これで電源周波数の変化を長期間、連続記録することが可能になりました。
周波数低下から約5秒後に LINE に通知が届くので、どこにいてもアラームの発生を知ることが出来ます。
この LINE の通知には、測定結果の Ambient のグラフや、他の方が測定された電源周波数のグラフへの URL が入っている下記ページへのリンクが入っています。
電源周波数が低下した際に確認したいサイト
LINE の通知を受信したら、このページを見ることで、詳しい状況が把握できるはずです。
先々月(2月)の大きな地震の際、実際に揺れる前に電源周波数の低下が検出された、という話を聞きました。今回作った仕掛けなら、そういう現象を自動的に検知出来るはずなので、防災に役立つかも知れません。そうは言っても、この通知は自分だけにしか来ないので、しばらく動かして様子を見たいと思います。災害予知は難しそうですが、電力の需給バランスの変動に伴う周波数変動のクセくらいなら検出出来そうな気がします。
PS:IFTTT を通さず、ESP32 から直接 LINE に通知を送った方が簡単だし、遅延も小さくなった可能性があります。実は当初は IFTTT から E-mail の発信を考えていて、他のイベントも同時に実行、なんてことを考えていたのでこういうプログラムになっています。
- 関連記事