現在(2020年9月4日)、日本の南の海上に台風10号がいます。
台風の正体は発達した低気圧なので、近づくほど気圧が下がります。
なので、気圧を記録していけば台風が最接近したタイミングを知ることができます。
【注】こうした実験をするのもいいですが、テレビ・新聞や気象庁の台風情報を確認したり、対策をしたりといったこともお忘れなく。また、状況を見て避難などしてください。
もくじ [hide]
ハード・ソフトの準備
M5Stick + ENV HATの組み合わせで測定します。
過去(ブログを始めるよりも前)に作ったスケッチをほぼそのまま流用しています。スケッチは後で載せます。
動作はこんな感じです。
- 電源投入・リセット時にWifiに接続し、NTPサーバーを利用して内蔵RTCの時刻合わせをする。
(WiFiの名前とパスワードはスケッチ内に記載) - 温度・湿度・大気圧(海面更生済み)を液晶に表示する。
- 1分おき(RTCの情報を利用して毎分0秒)にAmbientにデータを送信する。
チャネルID・ライトキーはスケッチ中に記載、送信中は右上にメールのアイコンを表示 - Bボタンで「温度・湿度・大気圧表示モード」を表示するモード1と、「Wi-Fiアクセスポイント名、AmbientのチャネルID・ライトキー」を表示するモード0を切り替え
- モード0でAボタンを押すとデータ送信はON/OFFを切り替えられる
(時計表示の色で識別→ピンク:データ送信OFF/水色:データ送信ON) - モード1でAボタンを押すと表示のON/OFF切り替え
(画面をOFFすることでバッテリーでの動作時間を少しでも伸ばしたい)
本当はSDカードにローカルでログが取れたらいいんですが、M5STick-Cにはスロットがないので無理ですね。
かといってM5Stack系はRTCがないのでロギングに不向き。
なんだかなぁ…と思っていたらスイッチサイエンスさんでM5STACK Core2が発売されました。
https://www.switch-science.com/catalog/6530/
SDカードスロットもRTCもついているので、IoTサービスとローカルの両方にデータを記録できるデータロガーとして活用できそうです。
停電対策
台風がもろに接近した場合、停電(瞬停含む)する可能性があります。
M5Stick-Cには小容量ながらバッテリーがついているので、AC充電器に刺しっぱなしで運用しておき、停電が長引きそうならモバイルバッテリーに差し替える、という運用で大丈夫でしょう。
停電したとなればWi-Fiやインターネット回線(うちはWiMaxを使用)も落ちます。
今回は機種変して使っていないスマートフォンからテザリングして運用します。
(いわゆる格安simでサブ含めて2回線持っているので1回線をこちらに割り当て。画面がヒビいってますが気にしない気にしない)
こちらもAC充電器に刺しっぱなし運用します。停電してもそもそもスマートフォンなのでバッテリーはそこそこ持つはずです。
データ
こんな感じで、温度・湿度と大気圧とでAmbientのチャートを設定しました。
センサーを室内に置いていて、エアコンを使っている時間が長いので温度・湿度はあまり変わりません。
家が古い木造の建物で、気密性なにそれって感じなので大気圧は多分測定できるかと。
(一瞬チャートを公開しようかとも思ったけど、それ「留守にしてる時間帯」をリアルタイムに知れるデータやん…と気づいたのでやめておきます。IoTが流行ってますがデータセキュリティなどにもお気をつけあそばせ…)
1分間隔でデータを取っているので、ゲリラ雷雨の時の気圧の変動なども記録できそうです。
何か観測できたら追ってエントリ書きます。
…ところで、Ambient。なんかログインできなかったり設定がちゃんと反映されなかったりするんだけど大丈夫?
スケッチ
スケッチ内の以下の情報は使用する環境に合わせて書き換えます。
- 接続するWi-Fiのアクセスポイント名とパスワード
- Ambientのチャネル番号とライトキー
- 測定する地点の高度(海抜高度。スマホアプリなどでも調べられます。)
冒頭の写真で変なところに「NTP」と表示されている点、改善済みです。
また、アクセスポイント名やAmbientのライトキーなどは画面に収まらない部分は表示されません。
スケッチ修正について(2020.09.05 0:00ごろ追記)
当初アップしていたスケッチにミスがありました。上記スケッチは修正済みです。
修正点は3 2点。
Ambientデータアップロード条件変更
新スケッチ159行目のif文を
から
に変更しました。
「RTCの秒の数値が0」かつ
「RTCの分の数値が前回データアップ時の数値と違っている」かつ
「Ambientへのデータアップロード有効」
の3条件のANDから
「RTCの秒の数値が0」かつ ←無し
「RTCの分の数値が前回データアップ時の数値と違っている」かつ
「Ambientへのデータアップロード有効」
の2条件のANDになります。
「1分に1回」という条件を満たすだけなら、「RTCの秒の数値が0」がなくても成立します。
(というより、ボタン処理などで処理が停止している間にRTCの秒が59→0→1と変化してしまえばデータアップロードを一回し損ねることになります。秒=0という条件がなければ、「分の数値が変わった」ことを条件に動作できるので、多少遅れてでもデータアップロードできるはずです。)
→この条件がないと、「AmbientデータアップロードをOFF→ONにしたとき」にもデータがアップされてしまいますので、やっぱり元に戻します。(2020/9/5 2:30ごろ追記)
変数「MiniteData」のstatic変数化・初期値設定
旧スケッチ161行目
を
に修正しました。(新スケッチ158行目)
「RTCの分の数値が前回データアップ時の数値と違っている」かつ
「Ambientへのデータアップロード有効」
の2条件のANDでAmbientへのデータアップロード処理を走らせています。
データアップロード処理を1分に1回だけにするために、赤文字部分の条件を入れてあります。
当初の目論見は、この「前回データアップした際の分の数値」を保存しておくメモリとしてMinuteDataという変数を利用するというもの。このために、データアップロード処理の最後に現在のRTCの分の数値を代入しています。(新スケッチ175行目)
loop文が一周して帰ってきた時にも数値をキープしておく必要があるので、static化が必要です。
ここが普通のintになっていると、loop文の終わりでMinuteDataという変数が一度破棄されて、次のloop文の161行目で再度新たに宣言されます。このため、一度の送信タイミングで2~3度データが送られてしまいます。
また、変数を呼び出した際に初期化しなかった場合、値が不定になります。「分の数値が絶対に取らない、int型の取れる値」として、「-1」で初期化しておきます。
センサデータ取得タイミングの変更
もう一点、loop文の最初でtemp、humi、pressureの各変数(温度・湿度・大気圧を入れる変数)を宣言だけして、後から(新スケッチ116 119行目~のif文の中で)実際のセンサ値を代入していましたが、こちらは宣言と同時に代入を行うようにしました。
というのも、このロジックだと「モード1画面にいないと」データが更新されないからです。
スケッチ修正その2(2020.09.05 2:30ごろ追記)
もう一つバグを見つけました。。。
大気圧データ変換タイミングの変更
大気圧センサで読み取った気圧を海面更生する2行(コメント含めて新スケッチの98~100行目)を「センサデータ取得タイミングの変更」と同じ理由で同じ場所に移設しました。
データアップロードをOFF→ONに変更して、そのままモード0(アクセスポイント名などの表示画面)にとどまった場合に、Pa単位の大気圧(100,000Paとか)でアップされてしまうことがわかりました。
ちなみにこれでも時々データを取りこぼしていることがあり、調査中です。
コメント