- Yêu cầu
- Sơ đồ mạch chế độ ngủ ESP32
- Tổng quan về Chế độ Ngủ trong ESP32
- Lập trình ESP32 cho Chế độ Ngủ sâu
- Kiểm tra ESP32 ở Chế độ Ngủ sâu
ESP32 là một trong những mô-đun vi điều khiển dựa trên Wi-Fi phổ biến nhất và nó là một lựa chọn phổ biến trong nhiều Ứng dụng IoT di động. Đây là một bộ điều khiển mạnh mẽ hỗ trợ Lập trình lõi kép và cũng có hỗ trợ Bluetooth Low Energy (BLE) tích hợp, khiến nó trở thành lựa chọn tốt cho các ứng dụng di động như trong thiết bị iBeacon, GPS Trackers, v.v. Tuy nhiên, trong các ứng dụng chạy bằng pin như thế này, mối quan tâm chính là pin dự phòng. Lượng pin dự phòng này có thể được tăng lên bằng cách kiểm soát thông minh hơn đối với bộ vi điều khiển như người ta có thể lập trình ESP32 ở chế độ nghỉ trong điều kiện lý tưởng để tăng lượng pin dự phòng của thiết bị.
Trong dự án này, chúng tôi sẽ kiểm tra mức tiêu thụ hiện tại của bộ vi điều khiển hỗ trợ Wi-Fi và Bluetooth phổ biến rộng rãi ESP32 ở chế độ làm việc bình thường và chế độ ngủ sâu. Ngoài ra, chúng tôi sẽ kiểm tra sự khác biệt và kiểm tra cách đặt ESP32 ở chế độ ngủ sâu. Bạn cũng có thể xem bài viết về cách giảm thiểu tiêu thụ điện năng trong bộ vi điều khiển để biết các mẹo khác có thể được sử dụng để giúp thiết kế của bạn tiết kiệm điện hơn nhiều. Ngoài ra, nếu bạn quan tâm đến chế độ ngủ của các bộ vi điều khiển khác, bạn có thể chọn chế độ Ngủ của Arduino và chế độ Ngủ của ESP8266 NodeMCU.
Yêu cầu
Để thực hiện việc này, chúng tôi sẽ sử dụng Devkit V4.0 dựa trên ESP32 từ Espressif có cầu nối USB với UART cũng như các sơ đồ chân ESP32 khác để dễ dàng kết nối. Việc lập trình sẽ được thực hiện với Arduino IDE. Nếu bạn là người mới hoàn toàn, thì để bắt đầu với ESP32 bằng Arduino, hãy đọc bài viết được liên kết trước khi bạn tiếp tục.
Các yêu cầu của dự án này là:
- Nó sẽ chuyển sang chế độ ngủ sâu chỉ bằng một lần nhấn nút.
- Nó sẽ thức dậy từ chế độ ngủ sâu bằng cách nhấn vào một nút khác.
- Để phát hiện trạng thái của ESP32, một đèn LED sẽ nhấp nháy với thời gian bật là 1000 mili giây. Trong chế độ ngủ, nó sẽ bị tắt.
Do đó, các thành phần bổ sung được yêu cầu-
- LED - 1 cái
- Nút nhấn (Công tắc xúc giác) - 2 chiếc
- Điện trở 4,7k - 2 chiếc
- Điện trở 680R - 1 pc
- Breadboard
- Trèo lên dây
- Bộ chuyển đổi 5V hoặc bộ cấp nguồn
- Cáp micro-USB
- Arduino IDE với giao diện lập trình ESP32 trong PC hoặc Laptop.
Sơ đồ mạch chế độ ngủ ESP32
Sơ đồ để đưa ESP32 vào chế độ ngủ bằng nút nhấn được hiển thị bên dưới.
Sơ đồ này khá đơn giản. Nó có hai nút. Nút ngủ sẽ đặt ESP32 ở chế độ ngủ sâu và một công tắc khác được sử dụng để đánh thức ESP32 từ chế độ ngủ. Cả hai nút đều được kết nối bằng mã PIN 16 và mã PIN 33. Cả hai nút đều được định cấu hình là hoạt động ở mức thấp khi được nhấn, do đó sẽ có thêm một thao tác kéo lên. Tuy nhiên, để phát hiện xem ESP 32 đang ở chế độ nghỉ hay chế độ điều kiện làm việc bình thường, đèn LED được kết nối với IO Pin 4.
Tổng quan về Chế độ Ngủ trong ESP32
Có nhiều chế độ năng lượng khác nhau cho ESP32, cụ thể là chế độ hoạt động, chế độ ngủ của modem, chế độ ngủ nhẹ, chế độ ngủ sâu và chế độ ngủ đông.
Trong điều kiện làm việc bình thường, ESP32 chạy ở chế độ hoạt động. Trong chế độ hoạt động của ESP32, CPU, phần cứng WiFi / BT, bộ nhớ RTC và thiết bị ngoại vi RTC, bộ đồng xử lý ULP, tất cả đều được kích hoạt và hoạt động tùy thuộc vào khối lượng công việc. Tuy nhiên, trên các chế độ nguồn khác nhau, một hoặc nhiều thiết bị ngoại vi bị tắt. Để kiểm tra các hoạt động chế độ nguồn khác nhau, hãy làm theo bảng bên dưới-
Phần cứng |
Chế độ hoạt động |
Chế độ ngủ trên modem |
Chế độ ngủ nhẹ |
Chế độ ngủ sâu |
Ngủ đông |
CPU |
TRÊN |
TRÊN |
TẠM NGỪNG |
TẮT |
TẮT |
WiFi / BT |
TRÊN |
TẮT |
TẮT |
TẮT |
TẮT |
Thiết bị ngoại vi RTC và RTC |
TRÊN |
TRÊN |
TRÊN |
TRÊN |
TẮT |
Bộ xử lý ULP-Co |
TRÊN |
TRÊN |
TRÊN |
BẬT / TẮT |
TẮT |
Như chúng ta có thể thấy trong bảng trên, ở chế độ ngủ sâu ESP32 thường được gọi là mẫu theo dõi cảm biến ULP - CPU, WiFi / BT, bộ nhớ RTC và thiết bị ngoại vi, bộ đồng xử lý ULP đều bị tắt. Chỉ bộ nhớ RTC và thiết bị ngoại vi RTC mới được bật.
Trong tình huống đánh thức, ESP32 cần được thông báo bởi một nguồn đánh thức sẽ đánh thức ESP32 từ chế độ ngủ sâu. Tuy nhiên, vì các thiết bị ngoại vi RTC được bật, ESP32 có thể được đánh thức thông qua các GPIO được kích hoạt RTC. Ngoài ra còn có các tùy chọn khác. Nó có thể được đánh thức thông qua một chân ngắt đánh thức bên ngoài hoặc sử dụng bộ hẹn giờ để đánh thức ESP32. Trong dự án này, chúng tôi đang sử dụng đánh thức ext0 trên chân 33.
Lập trình ESP32 cho Chế độ Ngủ sâu
Chương trình hoàn chỉnh có thể được tìm thấy ở cuối trang này. Nó được viết cho Arduino IDE và do đó có thể dễ dàng điều chỉnh theo yêu cầu của bạn. Giải thích về mã như sau.
Ở đầu mã, // Tạo một biến PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // định nghĩa Led Pin uint8_t led_pin = GPIO_NUM_4; // định nghĩa đánh thức pin uint8_t awUp_pin = GPIO_NUM_33;
Ba dòng trên xác định pin đánh thức, pin LED và pin chế độ ngủ.
void setup () { // đặt mã thiết lập của bạn ở đây, để chạy một lần: // đặt cổng nối tiếp ở 115200 Serial.begin (115200); chậm trễ (1000); // đặt chân pushButton làm đầu vào với mã pin PullUp nội bộ (pushBtn.pin, INPUT_PULLUP); // thiết lập trình xử lý ngắt với chân pushButton ở chế độ Falling attachmentInterrupt (pushBtn.pin, isr_handle, FALLING); // đặt chân Led là ouput pinMode (led_pin, OUTPUT); // tạo một tác vụ sẽ được thực thi trong hàm flashLed (), với mức độ ưu tiên 1 và được thực thi trên lõi 0 xTaskCreate ( flashLed, / * Hàm tác vụ. * / "flashLed", / * tên tác vụ. * / 1024 * 2, / * Kích thước ngăn xếp của tác vụ * / NULL, / * tham số của tác vụ * / 5, / * ưu tiên của nhiệm vụ * / & taskBlinkled); / * Điều khiển tác vụ để theo dõi tác vụ đã tạo * / delay (500); // Định cấu hình Pin 33 làm nguồn đánh thức ext0 với mức logic LOW esp_sleep_enable_ext0_wakeup ((gpio_num_t) awUp_pin, 0); }
Ở trên, đoạn mã được đặt ở chế độ giảm dần
mountInterrupt (pushBtn.pin, isr_handle, FALLING);
Do đó, bất cứ khi nào công tắc được nhấn, mức logic sẽ được thay đổi từ mức logic 1 (3.3V) sang mức logic 0 (0V). Điện áp của chân nút sẽ giảm và ESP32 sẽ xác định rằng công tắc được nhấn. Ngoài ra còn có một nhiệm vụ được tạo để nhấp nháy đèn LED.
xTaskCreate ( flashLed, / * Chức năng tác vụ. * / "flashLed", / * tên tác vụ. * / 1024 * 2, / * Kích thước ngăn xếp của tác vụ * / NULL, / * tham số của tác vụ * / 5, / * ưu tiên của nhiệm vụ * / & taskBlinkled); / * Điều khiển tác vụ để theo dõi tác vụ đã tạo * / delay (500);
Chân 33 cũng được định cấu hình bằng đoạn mã bên dưới làm nguồn đánh thức bên ngoài được xác định là ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) awUp_pin, 0);
Tiếp theo, trong vòng lặp while-
void loop () { // đặt mã chính của bạn ở đây, để chạy lặp lại: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Tạm dừng Nhiệm vụ 'flashLed' \ n"); // Tạm dừng Task FlashLed vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Đi ngủ….. \ n", pushBtn.pin); pushBtn.pressed = false; // Đi ngủ ngay esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; awupReason = esp_sleep_get_wakeup_cause (); switch (awupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println ("sử dụng tín hiệu bên ngoài ext0 cho WakeUp Từ chế độ ngủ"); phá vỡ; case ESP_SLEEP_WAKEUP_EXT1: Serial.println ("sử dụng tín hiệu bên ngoài ext1 cho WakeUp Từ chế độ ngủ"); phá vỡ; case ESP_SLEEP_WAKEUP_TIMER: Serial.println ("sử dụng tín hiệu Timer cho WakeUp From sleep"); phá vỡ; case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("sử dụng tín hiệu TouchPad cho WakeUp From sleep"); phá vỡ; case ESP_SLEEP_WAKEUP_ULP: Serial.println ("sử dụng tín hiệu ULP cho WakeUp Từ chế độ ngủ"); phá vỡ; default: nghỉ; Serial.printf ("Tiếp tục công việc 'flashLed' \ n"); // khởi động lại Task flashLed vTaskResume (taskBlinkled); } }
Vòng lặp while liên tục kiểm tra xem nút ngủ có được nhấn hay không. Nếu nút được nhấn, nó sẽ dừng hoặc tạm dừng tác vụ nhấp nháy đèn LED và chạy chức năng khởi động chế độ ngủ sâu đặc biệt-
esp_deep_sleep_start ();
Trong tình huống này, nếu nút ngắt bên ngoài ext0 được nhấn, nó sẽ ngay lập tức thức dậy từ chế độ ngủ sâu và tiếp tục tác vụ nhấp nháy đèn led.
Cuối cùng, chức năng nhấp nháy đèn LED có thể được nhìn thấy trong các đoạn mã dưới đây, nó sẽ nhấp nháy đèn LED 1000 ms giây.
void flashLed (void * param) { while (1) { static uint32_t pin_val = 0; // chuyển đổi giá trị pin pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Chỉ cần bật tắt đèn LED sau mỗi 1000ms hoặc 1 giây * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Kiểm tra ESP32 ở Chế độ Ngủ sâu
Mạch được cấu tạo trong một breadboard và một đồng hồ vạn năng phiên bản Metravi XB được sử dụng để đo dòng điện. Dòng điện được vẽ bởi mạch ở chế độ hoạt động là gần 58 mA nhưng ở chế độ ngủ sâu, dòng điện gần như là 4,10 mA. Hình ảnh dưới đây cho thấy mức tiêu thụ hiện tại của chế độ hoạt động ESP32 -
Ở chế độ ngủ sâu, mức tiêu thụ hiện tại được ghi lại giảm xuống khoảng 3,95mA, hình ảnh dưới đây cho thấy Mức tiêu thụ hiện tại của Chế độ ngủ sâu ESP32-
Tuy nhiên, ở chế độ ngủ sâu, mức tiêu thụ hiện tại của ESP32 là gần 150 uA. Nhưng mức tiêu thụ hiện tại được ghi lại cho bảng ESP32 Devkit này là gần 4,10 mA. Điều này là do CP2102 và Bộ điều chỉnh tuyến tính. Hai cái này được kết nối với đường điện 5V. Ngoài ra còn có một đèn LED nguồn được kết nối trong đường dây điện đang tiêu thụ dòng điện gần 2mA.
Do đó, có thể dễ dàng nhận ra rằng ESP32 tiêu thụ một lượng năng lượng rất thấp trong điều kiện chế độ ngủ sâu, rất hữu ích cho các hoạt động sử dụng pin. Để biết thêm thông tin về cách nó hoạt động, hãy xem video được liên kết bên dưới. Nếu bạn có bất kỳ câu hỏi nào, hãy để lại trong phần bình luận bên dưới hoặc sử dụng Diễn đàn của chúng tôi cho các câu hỏi kỹ thuật khác.