前回はハードウェア編でしたが今回がソフト編がメインとなります。

使用している部品・センサーは

気圧センサ SCP1000
湿度センサ AM2321
液晶 AQM0802A-RN-GBW

がメインなセンサ&パーツです。

湿度センサは安価で少し大きいAM2320を購入しましたが、
精度が悪いのか前の気圧計とズレが大きいので予備のAM2321に変更しました。

低消費電力化の要・スリープ&WDTによる復帰

気圧計など、気圧を計って液晶に表示・シリアルに送信などの処理が終わったら
delayなどで待ち時間を入れます。

ただし、delayを入れてもマイコンは普通に起動しているので
消費電流は9mA(実測3.3V・8Mhz)ほど。

せめて半分ぐらいにはしないと
単三電池2本での連続使用は難しいのでスリープを使う事にしました。

しかし、スリープを使うとそのままリセットなどをかけないと起きないので
そこでウォッチドッグタイマで復帰させる方法があったので
その方法にしました。

参考にしたのがこちら
【参考】消費電流が激減! delayWDT関数を作ってみた

まだソフト開発初期に低消費電力化を行ったので画面表示が
テスト中です。

この時、液晶上段には電源電圧
下段にはカウントアップした数値が表示されています。

上段のはみ出しているjpは起動時表示していた
@eaxjpをクリアし忘れたためjpだけ表示されています。

Arduinoで作った気圧計の消費電力がなんと0.9mA

 

この気圧計は3.3V・8Mhz駆動ですが普通のdelayでは9mA
スリープを使用したdelayWDT関数では0.9mAほどになります。

ただし、マイコンが動作している時はパルス的に3mAほどの電流が流れます。

まだセンサに通電してはいますが、
測定などをしていないので、常時ここまで低消費電力かは分かりませんが
比較としてかなり良い結果になりました。

スポンサーリンク

delayWDT関数のデメリット

delayWDT関数も低消費電力ですがデメリットがあります。
特にシリアル系です。

シリアル受信が出来ない

delayWDT関数でスリープしている間はクロックも停止するらしく
受信などは完全無視されます。

対策としては、別メニューなどを作って別メニューの時間待ちには
delayを使う様にすれば良いと思います。

ただし、消費電力は増えます。

シリアル送信が文字化ける

気圧値などをロガーなどで記録出来る様に気圧・気温などをシリアル送信
するのですが、1回目のデータ正常に送信されます。

しかし、2回目以降は文字化けしてしまって正常に送信されません。

シリアル送信が文字化けしてしまったArduinoベースの気圧計

いろいろ、設定を弄ったりしてもダメで数時間以上無駄に費やした所で
もしかしたらシリアル送信が完了する前にスリープに入っている為に
文字化けしているのではないか?という仮説に気付きました。

そこで、適当に普通のdelayを入れた所正常に送信される様になりました。

シリアル送信の通信速度は9600bps。
9600bpsをbyteに直すと1200 byte per sec
ミリ秒に直すと 1.2 byte / ms となり30文字送信するとなると
最低25msの待ち時間は必要になる様です。

待ち時間は文字数によって変化するので
長い文字列を流すなどの場合は、文字数をカウントしてそれに合わせて
delayでの待ち時間を調整すると良いと思います。

途中段階のスケッチ

気圧センサ SCP1000
湿度センサ AM2321
液晶 AQM0802A-RN-GBW
を使った気圧計のスケッチを公開します。
スケッチの一部には上で紹介したdelayWDT関数も含みます。

scp1000wm

SCP1000用-SPC1000
I2C液晶用ST7032のライブラリも含みます。

SCP1000用のライブラリのフォルダ名
何故かSCP1000にするとエラーになります。
なので、フォルダ名はそのままになっています。

scp1000wm.txtがスケッチ本体となっています。

完成後

新・旧気圧計と時計の温度の比較

時計はリセットした為、元旦になっていますが日付は正しくありません。

気温・湿度共にほぼ同じになっています。
気圧はちょっと開きがあるので気になります。

eneloop2本が電源のArduinoベースの気圧計

 

電池は青字のPanasonicが目立つeneloop2本。
左にあるドリルはケース加工で使ったドリル。

お気づきになっているかもしれませんが、
液晶の右側にまた何か、はいそうです放射温度計センサです。

前のLPS331ベースの気圧から取りました!

このセンサだと思いますが、消費電流が4mAになりました。

 

放射温度計センサまで組み込んだArduinoベースの気圧計

新しいスケッチでは気圧トレンドを表示出来る様になりました。

このグラフだとどのぐらいの気圧なのか分からないので
数秒おきにグラフと最大値・最小値の表示が切り替わる様になっています。

気圧トレンド(グラフ)も表示出来る様になったArduinoベースの気圧計

 

充電は秋月に売っているシャープの小型ソーラーパネルを使います。

窓の外にマスキングテープで貼り付けて充電した気圧計

やはり室内だと効率が悪いので、
前回の充電時は窓の外にマスキングテープで固定して充電しました。

あとがき

スケッチは公開していますが、著作権は一部しか私にありません。
本体であればdelayWDT関数以外は好きに使ってもらっても良いですが
自己責任でお願いします。

気圧センサSCP1000は日光で誤差が大きくなるので
できれば日光の当たらない所が良い様です。

放射温度計まで入れてみたものの、メモリが約2/ 3以上余っているので
今後どうしようか考えています。