以前、deep sleepをつかってLチカをしたのですが、
1秒間に2回,400[msec]程度のdeep sleepではかえって再起動時のオーバーヘッドでバッテリー消費が激しいのではないかと思い、計測してみることにしました。
まず、電圧変化を検知したらアップするカウンターを作成しました。LCDライブラリは割愛します。
counter.cpp
# include <Arduino.h>
# include "AQM1602LCD.h"
AQM1602LCD* pLcd;
long cnt=0;
int previous=LOW;
void cntUp(){
cnt++;
pLcd->SetCursor(0,0);
pLcd->WriteString(String(cnt));
delay(10);
}
void setup() {
Serial.begin(9600);
Serial.println("start");
Wire.begin();
pLcd = new AQM1602LCD();
// put your setup code here, to run once:
pLcd->SetCursor(0,0);
pLcd->WriteString("0 ");
pinMode(2, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
int val = digitalRead(2);
if(val != previous){
Serial.println("chg");
if(val==LOW)
cntUp();
previous = val;
delay(10); // チャタリング防止用
}
}
これを別のArduinoで起動しておき、
前回のdeep sleep Lチカの
LEDの足とつないで光った回数をカウントします。
電源としては3.7[V] 300[mAh] のリポバッテリーを使用しました。
deep_sleep_main.cpp
# include <Arduino.h>
RTC_DATA_ATTR bool bootCounter = false;
void setup() {
pinMode(4,OUTPUT);
pinMode(13,OUTPUT);
Serial.begin(115200);
Serial.println("ON");
digitalWrite((bootCounter = !bootCounter)?13:4,HIGH);
delay(100);
}
void loop() {
esp_sleep_enable_timer_wakeup(400 * 1000); // wakeup every 0.4secs
esp_deep_sleep_start();
}
光った回数は64513回、動作時間にして17時間55分13秒でした。
次にdeep sleepを使わず同じ動作を行うプログラムを用意し、同様にカウントしました。
delay_main.cpp
# include <Arduino.h>
void setup() {
pinMode(4,OUTPUT);
pinMode(13,OUTPUT);
Serial.begin(115200);
}
void loop() {
Serial.println("ON");
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,LOW);
delay(400);
Serial.println("ON");
digitalWrite(4,HIGH);
delay(100);
digitalWrite(4,LOW);
delay(400);
}
光った回数は29666回、動作時間にして8時間14分26秒でした。
試行回数はそれぞれ一回のみですが、倍以上の開きが出たので、短時間での頻繁なdeep sleep も効果はあるとみてよさそうです。