0

Sử dụng chế độ ngủ của arduino (arduino sleep mode) | 2019

arduino-che-do-ngu

Bạn đang thực hiện một dự án với board arduino và đang vướng mắc ở khâu tiết kiệm pin để có thể sử dụng lâu dài. Có thể tăng thời gian sử dụng pin lên con số gấp chục lần với cách sử dụng chế độ ngủ của arduino hay chế độ sleep mode trên board arduino.

Bảng dưới cho thấy kết quả đáng kinh ngạc khi sử dụng chế độ ngủ của arduino

Kết quả thử nghiệm chế độ ngủ của arduino

Bài viết bạn nên đọc:

Chế độ ngủ của arduino là thế nào?

Tiêu thụ điện năng là một vấn đề quan trọng đối với một thiết bị chạy liên tục trong một thời gian dài mà không bị tắt. Vì vậy, để khắc phục vấn đề này, hầu hết mọi bộ điều khiển đều có chế độ ngủ, giúp các nhà phát triển thiết kế các thiết bị điện tử để tiêu thụ năng lượng tối ưu nhất. Chế độ ngủ đặt thiết bị ở chế độ tiết kiệm năng lượng bằng cách tắt mô-đun không sử dụng.

Hôm nay chúng ta sẽ tìm hiểu về chế độ ngủ Arduino và kiểm chứng mức tiêu thụ năng lượng bằng cách sử dụng Ampe kế để so sánh giữa hai lần hoạt động bình thường và khi vào chế độ ngủ của arduino. Chế độ ngủ Arduino cũng được gọi là chế độ tiết kiệm năng lượng Arduino hoặc chế độ chờ Arduino.

Chế độ ngủ của arduino

Có 6 chế độ ngủ trong các dòng vi điều khiển ATmega328P (Arduino UNO, Arduino Nano và Pro-mini)

6 chế độ ngủ của arduino

Để vào bất kỳ chế độ ngủ nào, chúng ta cần kích hoạt bit ngủ trong thanh ghi điều khiển chế độ ngủ (SMCR.SE).

Sau đó, ADC Noise Reduction, Power-down, Power-save, Standby.

Để đánh thức arduino chúng ta có thể dùng các ngắt trong, ngắt ngoài hoặc reset lại arduino.

Idle Mode

Chế độ này cho phép dừng CPU nhưng vẫn có thể sử dụng SPI, USART, Watchdog, Timer, bộ so sánh tương tự vẫn có thể hoạt động.

LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);

Trước tiên hãy tải về thư viện cho Arduino và viết một đoạn code có sử dụng đoạn code trên để trải nghiệm chế độ ngủ của arduino nhé. Bạn sẽ thấy arduino ngủ trong 8s và sau đó tỉnh dậy.

ADC Noise Reduction Mode

Trong chế độ này, nó dừng CPU nhưng cho phép ADC, ngắt ngoài, USART,  Watchdog và Timer hoạt động. Chúng ta có thể đánh thức arduino bằng cách:

  • External Reset
  • Watchdog System Reset
  • Watchdog Interrupt
  • Brown-out Reset
  • 2-wire Serial Interface address match
  • External level interrupt on INT
  • Pin change interrupt
  • Timer/Counter interrupt
  • SPM/EEPROM ready interrupt

Power-Down Mode

Trong chế độ này, bộ tạo dao động ngoài TẮT, nhưng ngắt ngoài vẫn tiếp tục hoạt động. Nó chỉ có thể bị đánh thức bởi một trong các phương pháp dưới đây:

  • External Reset
  • Watchdog System Reset
  • Watchdog Interrupt
  • Brown-out Reset
  • 2-wire Serial Interface address match
  • External level interrupt on INT
  • Pin change interrupt

Hàm để sử dụng chế độ ngủ này:

LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

Tiến hành dùng thử:

void loop()
{
    // Allow wake up pin to trigger interrupt on low.
    attachInterrupt(0, wakeUp, LOW);

    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
    // Disable external pin interrupt on wake up pin.

    detachInterrupt(0);

    // Do something here
}

Power-Save Mode

Chế độ ngủ này của arduino tương tự như chế độ Power-down, nếu bộ hẹn giờ hoặc bộ đếm được bật, nó sẽ vẫn ở trạng thái chạy ngay cả khi ngủ. Thiết bị có thể được đánh thức bằng cách sử dụng bộ đếm thời gian đến lúc nó bị tràn.

Nếu bạn không sử dụng bộ hẹn giờ hoặc bộ đếm, bạn nên sử dụng chế độ Power-down thay vì chế độ Power-save.

Standby Mode

Chế độ chờ giống hệt với chế độ Power-down, sự khác biệt duy nhất giữa chúng là bộ dao động ngoài tiếp tục chạy ở chế độ này.

Extended Standby Mode

Chế độ này tương tự như chế độ Power-save chỉ với một ngoại lệ là bộ dao động tiếp tục chạy. Thiết bị sẽ mất 6 chu kỳ để thức dậy từ chế độ Standby.

Tiến hành thực hiện

Yêu cầu:

  • Arduino UNO
  • DHT11
  • USB Ammeter (có thể mua ở đây)
  • Breadboard
  • Dây cắm

Kết nối giữa Arduino Uno với module DHT11

Kết nối arduino uno và module dht11

Sử dụng module USB Tester để kiểm tra dòng và áp nhằm so sánh giữa lúc arduino uno vào chế độ ngủ và lúc hoạt động bình thường

module usb tester

Tiếp theo sơ đồ trên ta sẽ tiến hành nối cổng USB tester này vào cổng usb máy tính và cắm cổng của arduino vào đầu còn lại để có thể đo được dòng áp.

Code đo dòng arduino lúc vào chế độ ngủ

#include <dht.h>
#include <LowPower.h>
#define dataPin 2
dht DHT; 
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN,OUTPUT);
  digitalWrite(LED_BUILTIN,LOW);
}

void loop() {
  Serial.println("Get Data From DHT11");
  delay(1000);
  digitalWrite(LED_BUILTIN,HIGH);
  int readData = DHT.read11(dataPin); // DHT11
  float t = DHT.temperature; 
  float h = DHT.humidity; 
  Serial.print("Temperature = ");
  Serial.print(t);
  Serial.print(" C | ");
  Serial.print("Humidity = ");
  Serial.print(h);
  Serial.println(" % ");
  delay(2000);
  Serial.println("Arduino:- I am going for a Nap");
  delay(200);
  digitalWrite(LED_BUILTIN,LOW);
  LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, 
                 SPI_OFF, USART0_OFF, TWI_OFF);
  Serial.println("Arduino:- Hey I just Woke up");
  Serial.println("");
  delay(2000);
}

 

Arduino chạy chế độ ngủ

Code lúc arduino hoạt động bình thường

#include <dht.h>
#define dataPin 2
dht DHT; 
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN,OUTPUT);
  digitalWrite(LED_BUILTIN,LOW);
}

void loop() {
  digitalWrite(LED_BUILTIN,HIGH);
  int readData = DHT.read11(dataPin); // DHT11
  float t = DHT.temperature; 
  float h = DHT.humidity; 
  Serial.print("Temperature = ");
  Serial.print(t);
  Serial.print(" C | ");
  Serial.print("Humidity = ");
  Serial.print(h);
  Serial.println(" % ");
  delay(2000);

}

Arduino-Weather-Station-espitek

Có thể so sánh lúc arduino chạy vào chế độ ngủ và lúc hoạt động bình thường với công việc là đọc cảm biến DHT11 thì năng lượng lúc ngủ nó giảm đáng kể (0.008 A so với 0.028 A). Với năng lượng lúc ngủ tiêu thụ nhỏ như vậy, các ứng dụng IoT của bạn sẽ chạy được rất lâu đấy !.

Nhớ theo dõi các bài viết trong chuỗi bài 200+ ứng dụng của Arduino nhé

Chúc các  bạn thành công!

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 *