NodeMCUのMnaual*1より
- GPIO16とRSTピンを接続しておく
- 例えば以下の式で10分間DeepSleepする
node.dsleep(600000000) -- 10min
DeepSleepとは?? CPUコア、タイマー以外の周辺I/Oのクロック供給を止めて省電力モードに入るということだろうか??
init.luaの最終行に、node.dsleep(nnnn)の式を入れておけば、電源投入→希望する処理→DeepSleepに入る→希望する時間省電力でSleep→起動(最初に戻る)が繰り返されるはず。
■追記
確かに、DeepSleepに入った。しかし、、DeepSleep状態では外部と通信しないので、一見ハングアップしたような状態になる。もちろんリセットすれば起動するけど、起動後、init.luaが実行されて、DeepSleepの行まで走ってまた寝てしまう(すなわち入力待ちなしでSleepする、だからデバッグができない。init.luaの命令列実行中はシリアルからのCtrl-Cが効くのだろうか!?→だめだった。ファーム焼き直しだ)。まぁ動きとしては仕様通りだけど。理想的には、特定のPINでDeepSleepに入る、入らないを決められるようにコーディングしておき、実運用では自動でDeepSleepに入るが、デバッグ中は入力待ちに移行するように仕組まないと、デバッグができない。
ESP8266 Electrical characteristics*2より
In deep sleep mode, the ESP8266 maintains its RTC but shuts everything else off to hit about 60 µA.
超訳:ESP8266のDeep Sleepモードでは、RTCを除いたすべて(のハードウエア?)を停止させ、60uAを達成(!?)
周辺IOがてんこ盛りの普通のマイコンだと、Sleepさせるにもいろいろルールとかモードがあって大変なんですが、ESP8266だと(さらにNodeMCUなら)コマンド一発でSleep->Awakeになるのでめちゃ手軽だ。
■追記
sleepするか、入力待ちに入るかをGPIO13で切り替えられるように修正(init.luaの最終行)
PIN_SLP_SW = 7 -- switch to enable DeepSleep GPIO:13(ID:7) (ActiveLow) -- care!! GPIO13 is same as lcd reset pin!! gpio.mode(PIN_SLP_SW, gpio.INPUT) val = gpio.read(PIN_SLP_SW) if val == 1 then print("not to sleep mode") else print("enter sleep mode") -- deep sleep for 10min node.dsleep(600000000) -- 10min end
■ご参考URL
NodeMCU Documentation::node.sleep
http://nodemcu.readthedocs.io/en/dev/en/modules/node/#nodedsleep