Tìm hiểu về chế độ Deep Sleep ESP8266

Bài viết này sẽ hướng dẫn bạn cách sử dụng chế độ deep sleep với ESP8266 NodeMCU. Mình sẽ trình bày hai cách sử dụng đó là deep sleep với timer wake up và deep sleep với external wake up sử dụng chân reset (RST).

Xem video giới thiệu các chế độ sleep trên dòng chip ESP

Giới thiệu về Deep Sleep (Ngủ sâu)

Nếu bạn đang tạo một project với bo ESP8266 sử dụng nguồn chạy bằng pin, hoặc kết nối bo NodeMCU tới một cục xạc dự phòng. Sau đó chạy bo này một thời gian, bạn nhận ra rằng pin sẽ cung cấp nguồn không đủ lâu cho ứng dụng của bạn, đặc biệt khi bạn đang chạy ứng dụng WiFi.

Nếu bạn đặt ESP8266 vào chế độ deep sleep, nó sẽ giảm thiểu đáng kể năng lượng tiêu thụ và bạn cũng sẽ sử dụng được pin lâu hơn.

Việc ESP8266 làm việc ở chế độ deep sleep cũng đồng nghĩa với việc cắt giảm những hoạt động tiêu thụ năng lượng lớn như kết nối Wifi  và duy trì những hoạt động cần thiết để đánh thức vi xử lý khi một sự kiện gì đó xẩy ra.

Các loại Sleep

Có ba loại chế độ sleep khác nhau: modem sleep, light sleep và deep sleep. Bảng sau miêu tả sự khác nhau giữa các chế độ

ItemModem-sleepLight-sleepDeep-sleep
Wi-FiOFFOFFOFF
System clockONOFFOFF
RTCONONON
CPUONPendingOFF
Substrate current15 mA0.4 mA~20 uA
Average current (DTIM = 1)16.2 mA1.8 mA
Average current (DTIM = 3)15.4 mA0.9 mA
Average current (DTIM = 10)15.2 mA0.55 mA

Chúng có các mục đích khác nhau và được sử dụng trong các ứng dụng khác nhau.

Trong bài viết này, mình sẽ đề cập tới chế độ deep sleep. Với chế độ này, tất cả các hoạt động đều bị tắt, ngoại trừ Real Time Clock (RTC) – một chức năng giúp ESP8266 theo dõi được thời gian.

Deep sleep là một chế độ tốt nhất cho việc tiết kiệm năng lượng và chip ESP chỉ tiêu thụ dòng điện xấp xỉ 20uA. Tuy nhiên, nếu bạn sử dụng tất cả các chức năng trên bo với một mạch nạp code tích hợp, LEDs, v.v.., bạn sẽ không thể đạt được mức tiêu thụ năng lượng thấp mong muốn.

Kịch bản ứng dụng sử dụng chế độ deep sleep

Với deep sleep, một ứng dụng có thể được thực thi như sau:

  1. ESP8266 kết nối tới Wifi
  2. ESP8266 thực thi nhiệm vụ (Đọc giá trị cảm biến, gửi bản tin MQRR, v.v..)
  3. Đi vào chế độ sleep trong một khoảng thời gian cho trước
  4. ESP8266 thức dậy
  5. Quá trình này được lặp lại

Các cách đánh thức ESP8266 khi đang trong chế độ deep sleep

Sau khi đặt ESP8266 vào chế độ deep sleep, một số cách để đánh thức nó như sau:

  • #1 Timer wake up: ESP8266 tự thức dậy sau một khoảng thời gian đã được cho trước
  • #2 External wake up: ESP8266 thức dậy khi bạn ấn nút RST (ESP8266 khởi động lại)

#1 ESP8266 deep sleep với Timer wake up

Để sử dụng timer wake up, bạn cần kết nối chân RST tới GPIO16 được gán nhãn D0 trên bo NodeMCU. Một cách đơn giản, chỉ việc làm theo sơ đồ nguyên lý sau:

Chỉ kết nối chân RST tới GPIO16 sau khi nạp code

Nếu bạn để ý sơ đồ chân của NodeMCU, bạn có thể thấy GPIO16 là một chân đặc biệt và có chức năng WAKE. Để biết chi tiết hơn, bạn nên đọc bài Sơ đồ chân ESP8266.

Chân RST của ESP8266 luôn ở mức HIGH trong khi ESP8266 đang chạy. Tuy nhiên, khi chân RST nhận một tín hiệu mức LOW, ESP8266 sẽ khởi động lại.

Nếu bạn thiết lập deep sleep timer với ESP8266, một khi timer kết thúc, GPIO16 sẽ gửi một tín hiệu mức LOW trên nó. Điều đó có nghĩa là GPIO16, khi kết nối tới chân RST, có thể đánh thức ESP8266 sau một khoảng thời gian định trước.

Arduino code cho ESP8266 NodeMCU timer wake up

Đây là code bạn có thể sử dụng để nạp cho ESP.

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(2000);

  // Wait for serial to initialize.
  while(!Serial) { }
  
  // Deep sleep mode for 30 seconds, the ESP8266 wakes up by itself when GPIO 16 (D0 in NodeMCU board) is connected to the RESET pin
  Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds");
  ESP.deepSleep(30e6); 
  
  // Deep sleep mode until RESET pin is connected to a LOW signal (for example pushbutton or magnetic reed switch)
  //Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
  //ESP.deepSleep(0); 
}

void loop() {
}

Trong ví dụ này, chúng ta sẽ in ra một bản tin trên serial monitor:

Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");

Sau đó, ESP8266 kích hoạt chế độ deep sleep trong vòng 30s.

ESP.deepSleep(30e6);

Để đặt ESP8266 vào chế độ deep sleep, bạn sử dụng hàm ESP.deepsleep(uS) và thêm tham số là thời gian ngủ với đơn vị là micro giây.

Trong trường hợp này, 30e6 tương đương với 30.000.000 micro giây và bằng 30 giây.

Sau khi nạp code thành công, ấn nút RST để bắt đầu chạy chương trình, và sau đó kết nối chân RST tới GPIO16. ESP8266 sẽ thức dậy cứ sau 30 giây và in ra màn hình một bản tin như hình dưới.

Ví dụ này in ra một bản tin đơn giản, nhưng trong các ứng dụng thực tế, bạn sẽ phải thực hiện các nhiệm vụ phức tạp hơn như là tạo một request hoặc truyền các giá trị cảm biến, v.v..

Mạch ESP-01 timer wake up

Nếu bạn muốn cài đặt ví dụ tương tự trên bo ESP-01, bạn cần kết nối các chân như trong hình bên dưới. Cái chân nhỏ đó là GPIO16 và nó cần được kết nối tới chân RST.

#2 ESP8266 deep sleep với external wake up

Bạn có thể đánh thức ESP8266 với một external wake up, như nhấn một nút bấm hoặc sử dụng công tắc từ. Bạn chỉ cần đặt ESP8266 vào chế độ deep sleep trong một khoảng thời gian vô hạn, và sau đó thiết lập chân RST mức LOW để đánh thức nó.

Để test thiết lập này, bạn hãy nối dây từ một nút bấm tới bo ESP8266 như trong sơ đồ nguyên lý bên dưới. Khi bạn bạn ấn nút, chân RST sẽ chuyển thành mức LOW.

Nếu bạn đang sử dụng ESP-01, hãy sử dụng sơ đồ sau.

Arduino code cho ESP8266 external wake up

Sau đó, nạp code sau vào bo ESP8266 của bạn.

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(2000);

  // Wait for serial to initialize.
  while(!Serial) { }
  
  // Deep sleep mode for 30 seconds, the ESP8266 wakes up by itself when GPIO 16 (D0 in NodeMCU board) is connected to the RESET pin
  //Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds");
  //ESP.deepSleep(30e6); 
  
  // Deep sleep mode until RESET pin is connected to a LOW signal (for example pushbutton or magnetic reed switch)
  Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
  ESP.deepSleep(0); 
}

void loop() {
}

Đoạn code này đặt ESP8266 vào chế độ deep sleep trong một khoảng thời gian vô hạn. Để làm được điều này, bạn cần thiết lập tham số bằng 0 trong hàm deepSleep():

ESP.deepSleep(0);

ESP sẽ chỉ thức dậy khi cái gì đó reset lại bo. Trong trường hợp này, việc ấn nút sẽ kéo chân RST xuống mức thấp, đồng nghĩa với việc reset lại ESP8266.

Khi bạn ấn nút, ESP8266 thức dậy, thực thi các tác vụ đã được lập trình sẵn và tiếp tục ngủ cho đến khi một sự kiện reset mới được kích hoạt.

Đo dòng điện tiêu thụ

Khi một bo ESP8266 ở trong chế độ sleep, việc đo đạc dòng điện tiêu thụ với một đồng hồ vạn năng sẽ giúp chúng ta thấy được năng lượng mà nó tiêu thụ.

Hình sau sẽ miêu tả cách kết nối và đo trong thực tế

Khi ESP-01 đang trong chế độ deep sleep, nó chỉ sử dụng 0.3mA tức là xấp xỉ 300uA.

Lưu ý rằng trong suốt quá trình sử dụng Wifi, ESP8266 có thể tiêu thụ dòng lớn hơn (giữa 50mA tới 170mA).

Bản quyền bài viết thuộc về NhaThongMinhPlus.com

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *