Зачастую при разработке электроники с автономным (батарейным) питанием возникает задача минимизации энергопотребления. Одним из способов решения данной задачи является отключение микроконтроллера и/или периферии. В данном материале мы рассмотрим реализацию данного метода с использованием модуля полевого МОП-транзистора MEM2313 для минимизации энергопотребления проектов на основе платы Lolin D32 с ESP32.

Модуль на основе MEM2313 прост в использовании, просто подключите кнопку к T и GND для включения/выключения питания. Триггер активен, когда напряжение на линии INPUT падает до НИЗКОГО уровня.

Итак, самый простой способ – это включение/выключение любой платы с помощью тактильного переключателя. Это не самый красивый метод, но максимально простой и рабочий. Достаточно лишь подключить модуль с транзистором, как показано далее.

Следующий метод – это включение платы с помощью тактильного переключателя и выключение ее, как только ваша задача будет выполнена. Здесь схема немного посложнее, но и сам метод поэффективнее.

Для работы метода в микроконтроллер необходимо записать следующий код.
void setup() {
Serial.begin(115200);
Serial.println("ON BY SWITCH");
delay(5000); // Ваша задача
pinMode(16,OUTPUT);
Serial.println("OFF BY MCU");
}
void loop() {
// Ваш основной код
}
Ну и наконец, самый изощренный метод – отключать периферию перед глубоким сном. Допустим, к вашей плате подключено 16 светодиодных модулей neopixel, и если вы переведете ее в режим глубокого сна, ваши модули neopixel все равно будут потреблять 7,62 мА. Наш транзисторный модуль является модулем-переключателем, и мы хотим быть уверены, что мы не включим наш светодиод, а выключим его. Поэтому мы подключим Vi к входному GPIO, чтобы проверить, включено ли питание или выключено.

Код данного метода.
#include <Adafruit_NeoPixel.h>
#define PIN 16
#define NUMPIXELS 16
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 50
#define uS_TO_S_FACTOR 1000000ULL
#define TIME_TO_SLEEP 5
RTC_DATA_ATTR int bootCount = 0;
void on() {
if (!digitalRead(15)) {
pinMode(17, OUTPUT);
digitalWrite(17, LOW);
delay(100);
digitalWrite(17, HIGH);
Serial.println("Turning ON");
} else {
Serial.println("Already ON");
}
}
void off() {
if (digitalRead(15)) {
pinMode(17, OUTPUT);
digitalWrite(17, LOW);
delay(100);
digitalWrite(17, HIGH);
Serial.println("Turning OFF");
} else {
Serial.println("Already OFF");
}
}
void setup() {
Serial.begin(115200);
pinMode(15, INPUT);
on();
pixels.begin();
pixels.clear();
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(0, 150, 0));
pixels.show();
delay(DELAYVAL);
}
pixels.clear();
pixels.show();
off();
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) + " Seconds");
Serial.println("Going to sleep now");
Serial.flush();
esp_deep_sleep_start();
}
void loop() {
}
© digitrode.ru