ESP32 同様に、2.05V まで粘るぽい ESP-01M ですが、これまた ESP32 同様に電源電圧の上限が 3.6V ということでリチウムイオン系の充電池との相性は悪く、ニッケル水素充電池×2直列が最適です。
ちゃんと過放電防止をしないと電池がすぐに駄目になってしまうので、まず真っ先に施策しようと思います。
ESP32 のときは EN ピンを自己制御し、最終的に消費電流 0.2〜0.3μA という PowerOff モードを 実現できました が、こちら ESP-01M はモジュール内で EN ピンが 12kΩ でプルアップされている感じで同様の手が使えません。
ENピンとGNDの間にテスターを挿入して強制 PowerOff 状態にして電流測定したところ、270〜280μA だったので、内蔵のプルアップ抵抗は 12kΩ で間違いないと思う。
よって、外付け MOSFET などを使って自己への給電を断たない限り、PowerOff は無理のようです。
それはそれで必要な方はそうしていただくとして、安直に deep sleep 発動させる方法を紹介します。
電圧測定に際して、フルスケールが 1V なため ADC に突っ込む前に分圧しないといけないのですが、電源とGNDの間で分圧すると常に(過放電防止が発動しても)電力消費し続けてしまうため、電測用に1ピン使うことにします。
ADC の近くにある GP14 を用いましたが、どのピンでも大丈夫です。
#include <ESP8266WiFi.h> const int adcPin = 0; const int vccPin = 14; const int RA = 30000; const int RB = 10000; void setup() { // put your setup code here, to run once: Serial.begin(115200); Serial.println(); pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH); } void loop() { // put your main code here, to run repeatedly: float value = analogRead(adcPin); float voltage = 1.048576F * value * (RA+RB) / RB / 1024; Serial.print("ADC:"); Serial.println(voltage); if(voltage < 2.05F) ESP.deepSleep(0, WAKE_RF_DISABLED); delay(1000); }
起動したら測定用のピン(上記の例だと GP14)を HIGH にした上で1秒おきに電測し、一瞬でも 2.05V を割ったら deep sleep に移行するということをしています。
通常時は電源の電圧に関わらず、70mA ちょっとの消費のようです。
ってことは、なるべく低電圧のほうが電力的に有利な気がしますが、電圧が下がると WiFi の出力も落ちるのかなぁ
んで、一瞬でも 2.05V を割り込むと・・・
ご覧の通り deep sleep 発動です。
データシートには 20μA と書かれていたのですが、実測すると 10.6μA@2.05V でした。
ESP32 の Hibernation mode(4μA) よりは多いですが、まぁ及第点でしょう。
IO16 を RST に繋いでおけば、指定時間後にリセットかけて起動させられる、という点は ESP8266 と一緒です。
フラッシュメモリー4MB も要らないって方には、ESP-WROOM-02 よりも作動電圧が広くて使いやすい ESP-01M のほうがいいですね。
1.6mmピッチの専用エッジコネクタも一緒に併売されたら、ESP-WROOM-02 の流通在庫が不良化してしまうくらい馬鹿売れするんじゃないのかな?