chakokuのブログ(rev4)

日々のごった煮ブログです

ESP8266をDeepSleepさせる(NodeMCU版)

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