はじめに
M5Stackなどのマイコンの省電力化方法はいくつかあります.例えばスリープモードの活用やクロックの最適化,プログラムの最適化などです.今回はそれらの中でも比較的実装しやすいスリープモードの活用について紹介します.
本記事では以下の環境で実行します.
・M5Stack GRAY(ボード選択 → M5Stack-Core2)
・ArduinoIDE
目次
1.はじめに
2.スリープモードの紹介
3.esp_deep_sleep_start()の使用例
3.おわりに
スリープモードの紹介
"ディープスリープ" と "ライトスリープ"
・ディープスリープ:本体機能をほぼ停止させることで電力消費を大幅に抑えます.
復帰時に再起動されvoid setup()から実行されます.
・ライトスリープ:ディープスリープより電力消費は大きくなりますが,復帰時にスリープした行からプログラムが再開されます.
スリープモードには2種類あり,ディープスリープ(deepSleep)とライトスリープ(lightSleep)が存在します.ここでは,より電力消費を抑えることができるディープスリープについてプログラム例を示します.
また,M5Stackではスリープモードを実行するための関数が2つ(私が確認範囲では)用意されています.以下に例を示します.
1.esp_deep_sleep_start()
void sleep(){
// スリープ時間を設定
esp_sleep_enable_timer_wakeup(SLEEP_MIN(time));
// スリープ開始
esp_deep_sleep_start();
}
2.M5.Power.deepsleep()
void sleep(){
// スリープ実行
M5.Power.deepSleep(SLEEP_MIN(time));
}
2つの関数を比較すると,後者の方では1行で書くことができます.
M5Stackライブラリの中身を見ると M5.Power.deepSleep()
関数内ではesp_sleep_enable_timer_wakeup()
,esp_deep_sleep_start()
を実行していると分かります.さらに,M5.Power.deepSleep()
関数内ではディスプレイのオンオフ(M5.Lcd.setBrightness()
)まで行っているので,コードを省略できます.
ですが,ここでは esp_deep_sleep_start()
を使用した例を掲載します.
esp_deep_sleep_start()の使用例
esp_deep_sleep_start()
は esp_sleep_enable_timer_wakeup()
とセットで使用します.
esp_sleep_enable_timer_wakeup()
により復帰する時間を設定し,esp_deep_sleep_start()
によりスリープを開始します.また,電力消費を抑える観点からスリープ時と復帰時には画面をオンオフする必要があるため,それらの記述(M5.Lcd.setBrightness()
)も必要になります.
esp_deep_sleep_start()の使用例
#include <M5Stack.h>
// スリープ実行関数
void enable_deep_sleep(int time){
// 画面を消す(スリープに入るだけでは画面は点灯したままになるため)
M5.Lcd.setBrightness(0); //バックライトの明るさを0(消灯)~255(点灯)で制御
//スリープ復帰時間を設定
esp_sleep_enable_timer_wakeup(SLEEP_MIN(time));
//スリープ開始
esp_deep_sleep_start();
}
void setup(){
Serial.begin(115200);
M5.begin();
// スリープ復帰時に画面を点灯する
M5.Lcd.setBrightness(200); //バックライトの明るさを0(消灯)~255(点灯)で制御
}
void loop(){
M5.update();
// ボタンAを押したときにスリープを実行する
if(M5.BtnA.wasPressed()){
// スリープ開始(1分設定)
enable_deep_sleep(1);
}
}
上記の例は,enable_deep_sleep()
関数を作成し,Aボタンを押すとスリープが実行されるプログラムです.また,スリープ前に画面を消灯し,復帰時には点灯するように初期設定としてsetup()で画面の点灯処理を行っています.
おわりに
上記ではディーブスリープの例を掲載しましたが,最後に全スリープのコードも載せておきます.
esp_light_sleep_start()
// ライトスリープ
esp_deep_sleep_start()
// ディープスリープ
M5.Power.deepSleep()
// ライトスリープ
M5.Power.lightSleep()
// ディープスリープ
おわり