単にsleepする方法で動かしてきましたが、連続で動作させると、やはり電源が気になるので、deep sleepを使って、もう二桁ほど消費電力を下げます。
ESP8266のdeep sleepは内蔵時計を使って外から自分をRESETする
deep sleepは、ESP8266の内蔵時計RTC(RealTimeClock)を使って、設定時間になると外部PINに信号(Low)を出すようにできるので、それをESP8266のRESET端子に接続することによって、自分自身を外からRESETする、という事で実現するようです。
ESP8266 DevKITは、いくつかの会社から出されていますが、私が使っているのはAMICA製です。PIN配置、名称、機能などが違うようですので気をつけてください。
1.ハードウェアの設定 <D0とRSTを接続する>
RTCのタイムアウトによる外部への信号線は、ESP8266 DevKITのD0/GPIO16です。負論理。これを外部結線でDevKITのRST端子に接続します。RST端子はESP8266の内部で軽PullUpされているようなので、外部ノイズなど気にしなければ直結のみで大丈夫そうです(私は直結のみです)。気になる方は適当な抵抗(20kohm位?)を介してPullUpしてください。
2.ソフトウェアの設定(LUA)<node.dsleepを使う>
ソフトウェアは、node.dsleep(sleep_time_in_micro_seconds) を使います。
詳しくは、
https://nodemcu.readthedocs.io/en/master/modules/node/#nodedsleep
に出ています。他にもオプションがありますが、とりあえず入れなくても大丈夫なようです。時間はマイクロ秒です。桁を間違えないようにしてください。
TIPS:
(a)プログラムの中でdeep sleepしない状態に遷移する方法を用意する
deep sleepすると当然外部(serial/PC)からの制御が効かないので、次のRTCのtime outまで待つ必要があります。気をつけないといけないのは、RTCのtime out後のボードRESET、初期化から、自分が書いたプログラムがすぐに実行されてしまい、処理に時間がかからなければすぐに「次のdeep sleep」に入ってしまい、「debugできない状態」になります。他の方々のWEBなどを見ると、「Firmwareの書き込みからもう一度やっちゃった」のような、「やっちゃった事件」を経験されている方が少なからずいらっしゃいます。
ということですので、プログラムへの「debugができるよう」な仕組みの作り込みが必要です。私は、プログラムのシーケンスの中に、あるPINを見に行って、LOWに落ちていたらdeep sleepをしない処理を入れました。お気をつけください。
(b)RST端子とGND端子のshortでdeep sleepあけを模擬
deep sleepの時間を長くすると、当然その設定した時間分待たないとdebugできないのですが、あまりおすすめはできませんが、RST端子の隣がGNDなので、RST端子とGNDをピンセット等でshortしてあげると、deep sleepからの復帰の試験ができます。
(c)実際にdeep sleepに入るまでに多少時間がかかる
ソフトでnode.dsleepを設定したらすぐにdeep sleepに入るかというと、どうもちょっと時間が必要らしく、次の処理を開始してしまう、という事象があります。どうせdeep sleepで全リセットが掛かってしまうので気にしないか、タイマーを入れるなりして見栄え?を良くする方法があります。お好みで。
(d)とりあえずOnePass通ったらdeep sleepでもよい(かも)
deep sleepはDevKIT外部からのリセット信号でボードごと初期化されるので、とりあえずやりたい処理をして、後処理(次の工程に必要な環境、変数とかの設定など)はしても仕方無いので、DevKIT起動時の初期化さえきちんとできていれば、OnePass通ったら最後にnode.dsleepを入れての作りっぱ、でも大丈夫なような気がします、、。ご参考まで。(あまり勧められませんが、、)
その他の消費電力の削減方法:
とりあえずdeep sleepで消費電力を削減できるのではと思いますが、更に削減するのであれば、以下のような方法も考えられると思います(実際にやったわけではないですが、、、)
- 複数回分をまとめて送る →消費する電力の殆どはWiFiに関するものだと思いますので、まとめて送る事で消費電力の削減が期待できます。ちなみに、ESP8266には少量ですが、RESETでも消えないメモリエリアがあるようです。
- しきい値を作って、前回取得したデータと今回取得データ値の差分がある程度以上大きくなったら送信する →上と同様、送信する回数を減らす方法です
- 固定IPを使う→当初、WiFiへの接続の試験をしているときに、WiFiがUpしたらすぐにIPがもらえるかと思ったらそうでもなかったので、環境が許せば固定IPを設定して使うことでWiFiの使用量を減らすことができるかもしれません。
- どうても良い方法ですが、送信間隔を伸ばす、、。送信間隔を倍にすれば、消費電力は半分に、、、。
皆さんお楽しみください。
下のグラフは左のグラフが、温度と気圧の変化です。気圧が下がっていますが、明日は大荒れだということでどんどん下がってゆくのかもしれません。
右側のグラフは、adc.readvdd33(0)を使って読んだ内部電圧(DevKITのボード上では3V3の端子電圧)らしいのですが、3.0V位としか読めないので、どうなっているのかよくわかりません、、。(3V3端子をテスタで見ると3.3Vあるし)
ちなみに、このページのはじめにある写真は、2階のバルコニでビニール袋に入れられてテスト(放置)される僕、です。