Mục lục:

Tiết kiệm pin với giấc ngủ sâu: 20 bước
Tiết kiệm pin với giấc ngủ sâu: 20 bước

Video: Tiết kiệm pin với giấc ngủ sâu: 20 bước

Video: Tiết kiệm pin với giấc ngủ sâu: 20 bước
Video: Cách thoát khỏi chế độ siêu tiết kiệm điện năng báo Thời lượng pin có thể kéo dài tới 2-3 ngày 2024, Tháng mười một
Anonim
Image
Image
Cách đánh thức ESP32
Cách đánh thức ESP32

Bạn có muốn sử dụng pin với ESP32 của mình không? Nếu vậy, hôm nay tôi sẽ thảo luận về một số thông tin kỹ thuật quan trọng liên quan đến chủ đề này. Chúng ta biết rằng bộ vi điều khiển này tiêu tốn rất nhiều năng lượng khi nó truyền thông tin. Nó tiêu thụ gần 190 miliampe. Trong video này, tôi sẽ chỉ cách tiết kiệm năng lượng từ ESP32 với cái gọi là chức năng "DEEP SLEEP". Chúng tôi sẽ đặt chip để vào chế độ này, tìm hiểu các cách thoát khỏi chế độ này và tạo một ví dụ cho thấy ba cách khác nhau để đánh thức ESP32.

Điều quan trọng cần nhớ là đài phát thanh tiêu tốn nhiều năng lượng hơn là bộ xử lý. Tiết kiệm năng lượng là rất quan trọng. Điều này là do các Điểm cuối (các mạch đang gửi thông tin) thường chạy bằng pin và có tuổi thọ lên đến 5 năm. Có một số nhà sản xuất hứa hẹn thời hạn sử dụng lên đến mười năm và điều này có hiệu lực đối với pin chất lượng cao không sử dụng nhiều Điểm cuối. Trong tất cả các trường hợp khác, tôi khuyên bạn nên sử dụng chế độ Ngủ sâu để tiết kiệm năng lượng từ mạch của bạn.

Bước 1: Giới thiệu

ESP32 có một chế độ tiết kiệm năng lượng, được gọi là “Ngủ sâu”. Trong chế độ này, CPU, hầu hết RAM và tất cả các thiết bị ngoại vi có xung nhịp kỹ thuật số đều bị tắt. Các phần duy nhất của chip vẫn có thể được kết nối là bộ điều khiển RTC, thiết bị ngoại vi RTC (bao gồm cả bộ đồng xử lý ULP) và bộ nhớ RTC.

Chúng tôi có một số cách để đánh thức ESP32 khi ở chế độ ngủ. Nguồn đánh thức có thể được thiết lập bất kỳ lúc nào trước khi vào chế độ Ngủ sâu.

Bước 2: Cách đánh thức ESP32

Có năm cách để đánh thức ESP32:

• Hẹn giờ

• Đánh thức bên ngoài (máy lẻ0)

• Đánh thức bên ngoài (máy lẻ1)

• Đánh thức bộ đồng xử lý ULP

• Bàn di chuột

Bước 3: Hẹn giờ

Bộ điều khiển RTC có bộ đếm thời gian tích hợp có thể được sử dụng để kích hoạt chip sau một khoảng thời gian xác định trước. Thời gian được chỉ định với độ chính xác micro giây.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> là thời gian tính bằng micro giây

Bước 4: Đánh thức bên ngoài (máy lẻ0)

Mô-đun RTC IO chứa logic để kích hoạt cảnh báo khi một trong các GPIO RTC đi vào mức logic được xác định trước. IO RTC là một phần của miền nguồn của thiết bị ngoại vi RTC, vì vậy thiết bị ngoại vi RTC sẽ được duy trì hoạt động trong chế độ Ngủ sâu nếu nguồn kích hoạt này được yêu cầu.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, int level)

gpio_num> Số GPIO được sử dụng làm nguồn kích hoạt. Chỉ các GPIO chức năng RTC mới có thể được sử dụng: 0, 2, 4, 12-15, 25-27, 32-39.

level> mức đầu vào sẽ kích hoạt cảnh báo (0 = LOW, 1 = HIGH)

Bước 5: Đánh thức bên ngoài (ext1)

Bộ điều khiển RTC chứa logic để kích hoạt đồng hồ báo thức bằng cách sử dụng nhiều GPIO RTC.

esp_deep_sleep_enable_ext1_wakeup (uint64_t mask, esp_ext1_wakeup_mode_t mode)

mask> mặt nạ bit của số GPIO sẽ gây ra kích hoạt. Chỉ các GPIO hỗ trợ RTC mới có thể được sử dụng trong bitmap này: 0, 2, 4, 12-15, 25-27, 32-39.

chọn chức năng logic được sử dụng để xác định điều kiện kích hoạt:

• ESP_EXT1_WAKEUP_ALL_LOW: đánh thức khi tất cả các GPIO được chọn ở mức THẤP

• ESP_EXT1_WAKEUP_ANY_HIGH: đánh thức khi bất kỳ GPIO nào đã chọn ở mức CAO

Bước 6: Đánh thức bộ đồng xử lý ULP

Bộ đồng xử lý ULP có thể hoạt động trong khi chip đang ở chế độ Ngủ sâu và có thể được sử dụng để tìm kiếm cảm biến, giám sát ADC hoặc các giá trị cảm biến cảm ứng điện dung và kích hoạt chip khi phát hiện một sự kiện cụ thể.

Bộ đồng xử lý ULP là một phần của miền nguồn của thiết bị ngoại vi RTC và chạy chương trình được lưu trữ trong bộ nhớ chậm RTC. Do đó, thiết bị ngoại vi RTC và bộ nhớ chậm RTC sẽ được kích hoạt trong chế độ Ngủ sâu nếu chế độ kích hoạt này được yêu cầu.

Bước 7: Bàn di chuột

Bộ điều khiển RTC chứa logic để kích hoạt cảnh báo bằng cách sử dụng các cảm biến cảm ứng điện dung. Tuy nhiên, định nghĩa của pin cảm ứng là khác nhau. Chúng ta phải sử dụng ngắt cảm ứng cho mỗi chân mong muốn.

Sau khi thiết lập ngắt, chúng tôi đã bật chế độ đánh thức để sử dụng các cảm biến.

// Cấu hình Touchpad làm nguồn đánh thức esp_sleep_enable_touchpad_wakeup ();

Bước 8: Vào Chế độ Ngủ sâu

Sau khi thiết lập chế độ đánh thức, một lệnh duy nhất để đặt ESP32 ở chế độ Ngủ sâu (chi tiêu 2,5 μA trở xuống) là đủ. Tôi nhấn mạnh ở đây rằng chi phí này là từ chip ESP chứ không phải từ đĩa, vì sau này chi tiêu nhiều hơn.

esp_deep_sleep_start ();

Từ lệnh này, ESP32 rơi vào trạng thái ngủ và không thực thi các dòng mã tiếp theo.

Quan trọng: Tất cả các cài đặt đánh thức phải được thực hiện trước khi thực hiện lệnh trên.

Bước 9: Đây là một số thông tin quan trọng hơn

Đây là một số thông tin quan trọng hơn
Đây là một số thông tin quan trọng hơn

Cuộc gọi dưới đây trả về nguyên nhân đánh thức ESP32.

1: EXT0 2: EXT1 3: TIMER 4: TOUCHPAD 5: ULP

esp_sleep_get_wakeup_cause ();

Nếu chúng tôi đặt đánh thức bằng bàn di chuột, chúng tôi có thể khôi phục GPIO nào mà lần chạm đã xảy ra thông qua lệnh

esp_sleep_get_touchpad_wakeup_status ();

Mỗi khi ESP32 thức dậy, nó sẽ quay lại quá trình thiết lập. Do đó tất cả các biến không được xác định trong bộ nhớ RTC sẽ trở về trạng thái ban đầu của chúng.

Để giữ các biến trong bộ nhớ ngay cả khi đã ngủ, hãy sử dụng khai báo biến trong ví dụ dưới đây:

// RTC_DATA_ATTR aloca a variável na memória RTCRTC_DATA_ATTR int bootCount = 0;

Bước 10: Trình diễn

Trình diễn
Trình diễn

Video cho thấy chương trình đang hoạt động, phù hợp với hình ảnh.

Bước 11: WiFi NodeMCU-32S ESP-WROOM-32

WiFi NodeMCU-32S ESP-WROOM-32
WiFi NodeMCU-32S ESP-WROOM-32

Bước 12: Lắp ráp

cuộc họp
cuộc họp

Bước 13: Chương trình

Bây giờ chúng tôi sẽ tạo một chương trình trong đó chúng tôi sẽ định cấu hình ESP32 để vào chế độ Ngủ sâu. Điều này sẽ được đánh thức theo ba cách khác nhau: một cho Đánh thức bên ngoài (ext0), một cho Bộ hẹn giờ và một cho Bàn di chuột. Chúng không thể hoạt động cùng nhau, vì vậy chúng tôi sẽ sử dụng một biến sẽ là bộ đếm số lần ESP32 đã cho Boot để định cấu hình cách thức đánh thức.

Bước 14: Yêu cầu thư viện

Thư viện Yêu cầu
Thư viện Yêu cầu

Để điều khiển màn hình OLED, chúng ta cần một thư viện bên ngoài. Đối với điều này, chúng tôi sẽ tải xuống thư viện U8g2.

Trong Arduino IDE, đi tới menu Phác thảo >> Bao gồm Thư viện >> Quản lý Thư viện….

Bước 15: Thư viện và biến

Chúng tôi đã bao gồm thư viện để điều khiển màn hình OLED, cũng như một phương thức khởi tạo của phiên bản bộ điều khiển màn hình. Ngoài ra, chúng tôi cấp phát biến trong bộ nhớ RTC. Chúng tôi đặt độ nhạy để chấp nhận chạm, hệ số chuyển đổi micro giây cho giây và thời gian ESP32 chuyển sang chế độ ngủ (tính bằng giây).

#include // biblioteca para control do display oled

// construtor da instancia do controlador do display // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C display (SCL, SDA, U8X8_PIN_NONE); // RTC_DATA_ATTR aloca a variável na memoria RTC RTC_DATA_ATTR int bootCount = 0; // sensibilidade para aceitação do toque #define Threshold 40 // fator de seekão de microsegundos para segundos #define uS_TO_S_FACTOR 1000000 // tempo que o ESP32 ficará em modo sleep (em segundos) #define TIME_TO_SLEEP 3

Bước 16: Thiết lập

Trong Thiết lập, chúng tôi tăng số lần Khởi động xảy ra. Chúng ta gọi hàm in họa tiết Boot. Nếu số Khởi động là PAR, chúng tôi đặt ESP32 đánh thức qua nút (EXT0). Nếu nó là bội số của 3, chúng tôi đặt ESP32 đánh thức sau một khoảng thời gian nhất định. Nếu không, chúng tôi thiết lập các chân cảm ứng điện dung để đánh thức ESP32. Cuối cùng, chúng tôi đặt Bàn di chuột làm nguồn đánh thức và buộc ESP32 vào chế độ ngủ.

void setup () {Serial.begin (115200); chậm trễ (1000); // incrementa o numro de vezes que o BOOT ocorreu ++ bootCount; configDisplay (); // chama a função para printmir o motivo do BOOT print_wakeup_reason (); // se o số khởi động cho các cấu hình PAR o ESP32 para despertar através do botão (EXT0) if (bootCount% 2 == 0) {esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); // 1 = Cao, 0 = Thấp} // se cho cấu hình nhiều cấp độ 3 o ESP32 para despertar depois de um tempo Defdo else if (bootCount% 3 == 0) {esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); } // caso contrario configramos os pinos de touch Capacityitivo para despertar o ESP32 else {// Thiết lập ngắt trên Touch Pad 5 (GPIO12) touchAttachInterrupt (T5, callback, Threshold); // Cấu hình Touchpad làm nguồn đánh thức esp_sleep_enable_touchpad_wakeup (); } Serial.println (“entrando em modo sleep ); esp_deep_sleep_start (); // força o ESP32 entrar em modo SLEEP}

Bước 17: Loop, Callback & ConfigureDisplay

Trong Vòng lặp, chúng tôi không có gì để làm. Sau đó, chúng tôi tiến hành ngắt gọi lại nếu chúng tôi phải làm gì đó khi xảy ra gián đoạn. Về configDisplay, chúng tôi khởi tạo màn hình và cấu hình một số thông số. Chúng tôi in trên màn hình số lần Khởi động đã xảy ra.

// nada a se fazer no loopvoid loop () {} // callback das interrupções void callback () {// caso queira fazer algo ao ocorrer a interrupção} void configDisplay () {// inicializa o display e configura alguns parametros display. bắt đầu(); display.setPowerSave (0); // modo powerSave (0-Off? 1-On) display.setFont (u8x8_font_torussansbold8_u); // fonte Pracizada // printme no display os numberro de vezes que aconteceu o BOOT display.drawString (0, 0, "BOOT NUM:"); display.drawString (0, 2, String (bootCount).c_str ()); display.drawString (0, 4, "MOTIVO:"); }

Bước 18: Print_wakeup_reason (biết Nguyên nhân của Thức tỉnh)

Ở đây, chúng ta có chức năng in ra nguyên nhân đánh thức ESP32. Kiểm tra mã pin và in trên màn hình.

// função para printmir a causa do ESP32 despertarvoid print_wakeup_reason () {esp_sleep_wakeup_cause_t wakeup_reason; Chuỗi lý do = ""; awup_reason = esp_sleep_get_wakeup_cause (); // recupera a causa do despertar switch (wakeup_reason) {case 1: reason = "EXT0 RTC_IO BTN"; nghỉ; trường hợp 2: reason = "EXT1 RTC_CNTL"; nghỉ; trường hợp 3: reason = "TIMER"; nghỉ; trường hợp 4: reason = "TOUCHPAD"; nghỉ; case 5: reason = "CHƯƠNG TRÌNH ULP"; nghỉ; default: reason = "KHÔNG CÓ NGUYÊN NHÂN DS"; nghỉ; } Serial.println (lý do); display.clearLine (6); // apaga a linha 6 do display display.drawString (0, 6, reason.c_str ()); // in dấu một nguyên nhân do despertar không hiển thị // se despertou bởi TOUCHPAD, então vamos Verificar em Qual dos pinos ocorreu if (wakeup_reason == 4) {print_wakeup_touchpad (); // verifyfica o pino e printme no display}}

Bước 19: Print_wakeup_touchpad (biết GPIO Touch)

Bây giờ, trong bước này, chúng ta có chức năng in mã pin đã được chạm vào. Chúng tôi đã khôi phục GPIO đánh thức ESP32 và in nó trên màn hình.

// função para printmir o pino que foi tocadovoid print_wakeup_touchpad () {touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status (); // recupera o GPIO que despertou o ESP32 String GPIO = ""; switch (touchPin) {case 0: GPIO = "4"; nghỉ; trường hợp 1: GPIO = "0"; nghỉ; trường hợp 2: GPIO = "2"; nghỉ; trường hợp 3: GPIO = "15"; nghỉ; trường hợp 4: GPIO = "13"; nghỉ; trường hợp 5: GPIO = "12"; nghỉ; trường hợp 6: GPIO = "14"; nghỉ; trường hợp 7: GPIO = "27"; nghỉ; trường hợp 8: GPIO = "33"; nghỉ; trường hợp 9: GPIO = "32"; nghỉ; default: Serial.println ("Đánh thức không phải bằng bàn di chuột"); nghỉ; } Serial.println ("GPIO:" + GPIO); display.clearLine (7); // apaga a linha 7 do display.drawString (0, 7, "GPIO:"); display.drawString (6, 7, GPIO.c_str ()); // in chìm o GPIO}

Bước 20: Tải xuống tệp

PDF

NS

Đề xuất: