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 được 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 đi kèm với chế độ nghỉ, giúp các nhà phát triển thiết kế các thiết bị điện tử để tiêu thụ điện năng tối ưu. Chế độ nghỉ đặ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.
Trước đó, chúng tôi đã giải thích về chế độ Ngủ sâu trong ESP8266 để Tiết kiệm năng lượng. Hôm nay chúng ta sẽ tìm hiểu về Chế độ ngủ của Arduino và chứng minh mức tiêu thụ điện năng bằng cách sử dụng Ampe kế. Chế độ Ngủ Arduino còn được gọi là Chế độ tiết kiệm điện Arduino hoặc Chế độ chờ Arduino.
Chế độ ngủ Arduino
Chế độ Ngủ cho phép người dùng dừng hoặc tắt các mô-đun không sử dụng trong Vi điều khiển, giúp giảm đáng kể mức tiêu thụ điện năng. Arduino UNO, Arduino Nano và Pro-mini đi kèm với ATmega328P và nó có Bộ phát hiện màu nâu (BOD) giám sát điện áp cung cấp tại thời điểm ở chế độ ngủ.
Có sáu chế độ ngủ trong ATmega328P:
Để vào bất kỳ chế độ ngủ nào, chúng ta cần bật bit ngủ trong Thanh ghi điều khiển chế độ ngủ (SMCR.SE). Sau đó, các bit chọn chế độ ngủ chọn chế độ ngủ trong số Idle, giảm tiếng ồn ADC, Power-Down, Power-Save, Standby và External Standby.
Arduino bên trong hoặc bên ngoài ngắt hoặc Reset có thể đánh thức Arduino từ chế độ ngủ.
Chế độ nhàn rỗi
Để vào chế độ ngủ Chờ, hãy ghi các bit SM của bộ điều khiển '000'. Chế độ này dừng CPU nhưng cho phép SPI, giao diện nối tiếp 2 dây, USART, Cơ quan giám sát, bộ đếm, bộ so sánh tương tự hoạt động. Chế độ nhàn rỗi về cơ bản sẽ dừng CLK CPU và CLK FLASH. Arduino có thể được đánh thức bất kỳ lúc nào bằng cách sử dụng ngắt bên ngoài hoặc bên trong.
Mã Arduino cho Chế độ ngủ không hoạt động:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Có một thư viện để thiết lập các chế độ năng lượng thấp khác nhau trong arduino. Vì vậy, trước tiên hãy tải xuống và cài đặt thư viện từ liên kết đã cho và sử dụng đoạn mã trên để đặt Arduino ở Chế độ ngủ không hoạt động. Bằng cách sử dụng đoạn mã trên, Arduino sẽ chuyển sang trạng thái ngủ trong 8 giây và tự động thức dậy. Như bạn có thể thấy trong mã, chế độ nhàn rỗi sẽ tắt tất cả các bộ hẹn giờ, SPI, USART và TWI (giao diện 2 dây).
Chế độ giảm tiếng ồn ADC
Để sử dụng chế độ ngủ này, hãy viết bit SM thành '001'. Chế độ dừng CPU nhưng cho phép ADC, ngắt bên ngoài, USART, giao diện nối tiếp 2 dây, Cơ quan giám sát và bộ đếm hoạt động. Chế độ Giảm nhiễu ADC về cơ bản dừng CPU CLK, CLK I / O và CLK FLASH. Chúng tôi có thể đánh thức bộ điều khiển từ chế độ Giảm nhiễu ADC bằng các phương pháp sau:
- Đặt lại bên ngoài
- Thiết lập lại hệ thống cơ quan giám sát
- Cơ quan giám sát ngắt
- Thiết lập lại màu nâu
- Đối sánh địa chỉ giao diện nối tiếp 2 dây
- Ngắt mức bên ngoài trên INT
- Ngắt thay đổi pin
- Hẹn giờ / Bộ đếm ngắt
- Ngắt sẵn sàng SPM / EEPROM
Chế độ tắt nguồn
Chế độ Power-Down dừng tất cả các đồng hồ được tạo và chỉ cho phép hoạt động của các mô-đun không đồng bộ. Nó có thể được kích hoạt bằng cách ghi các bit SM thành '010'. Trong chế độ này, bộ dao động bên ngoài TẮT, nhưng giao diện nối tiếp 2 dây, cơ quan giám sát và ngắt bên ngoài tiếp tục hoạt động. Nó có thể bị vô hiệu hóa chỉ bằng một trong các phương pháp dưới đây:
- Đặt lại bên ngoài
- Thiết lập lại hệ thống cơ quan giám sát
- Cơ quan giám sát ngắt
- Thiết lập lại màu nâu
- Đối sánh địa chỉ giao diện nối tiếp 2 dây
- Ngắt mức bên ngoài trên INT
- Ngắt thay đổi pin
Mã Arduino cho Chế độ định kỳ ngắt nguồn:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Mã được sử dụng để bật chế độ tắt nguồn. Bằng cách sử dụng đoạn mã trên, Arduino sẽ chuyển sang trạng thái ngủ trong 8 giây và tự động thức dậy.
Chúng ta cũng có thể sử dụng chế độ ngắt nguồn với ngắt, nơi Arduino sẽ chuyển sang trạng thái ngủ nhưng chỉ thức dậy khi có ngắt bên ngoài hoặc bên trong.
Mã Arduino cho Chế độ ngắt nguồn:
void loop () { // Cho phép ghim đánh thức để kích hoạt ngắt ở mức thấp. mountInterrupt (0, awUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Tắt ngắt pin bên ngoài trên pin đánh thức. detachInterrupt (0); // Làm gì đó ở đây }
Chế độ tiết kiệm năng lượng
Để vào chế độ tiết kiệm năng lượng, chúng ta cần ghi chân SM thành '011'. Chế độ nghỉ này tương tự như chế độ tắt nguồn, chỉ có một ngoại lệ là nếu bộ hẹn giờ / bộ đếm được bật, nó sẽ vẫn ở trạng thái chạy ngay cả tại thời điểm ngủ. Thiết bị có thể được đánh thức bằng cách sử dụng bộ hẹn giờ tràn.
Nếu bạn không sử dụng bộ đếm thời gian, bạn nên sử dụng Chế độ giảm nguồn thay vì chế độ tiết kiệm điện.
Chế độ chờ
Chế độ chờ giống hệt với chế độ Tắt nguồn, điểm khác biệt duy nhất giữa chúng là bộ dao động bên ngoài tiếp tục chạy ở chế độ này. Để bật chế độ này, hãy ghi chân SM thành '110'.
Chế độ chờ mở rộng
Chế độ này tương tự như chế độ tiết kiệm năng lượng chỉ có một ngoại lệ là bộ tạo dao động vẫn tiếp tục chạy. Thiết bị sẽ chuyển sang chế độ Chờ mở rộng khi chúng tôi ghi chân SM thành '111'. Thiết bị sẽ mất sáu chu kỳ đồng hồ để đánh thức từ chế độ chờ mở rộng.
Dưới đây là các yêu cầu cho dự án này, sau khi kết nối mạch theo sơ đồ mạch. Tải mã chế độ ngủ lên Arduino bằng Arduino IDE. Arduino sẽ chuyển sang chế độ ngủ nhàn rỗi. Sau đó kiểm tra mức tiêu thụ hiện tại vào ampe kế USB. Ngoài ra, bạn cũng có thể sử dụng đồng hồ kẹp cho tương tự.
Thành phần bắt buộc
- Arduino UNO
- Cảm biến nhiệt độ và độ ẩm DHT11
- Ampe kế USB
- Breadboard
- Kết nối dây
Để tìm hiểu thêm về cách sử dụng DHT11 với Arduino, hãy theo liên kết. Ở đây chúng tôi đang sử dụng USB Ampe kế để đo điện áp được tiêu thụ bởi Arduino ở chế độ nghỉ.
Ampe kế USB
Ampe kế USB là thiết bị cắm và chạy được sử dụng để đo điện áp và dòng điện từ bất kỳ cổng USB nào. Dongle cắm giữa nguồn điện USB (cổng USB máy tính) và thiết bị USB (Arduino). Thiết bị này có một điện trở 0,05ohm phù hợp với chân nguồn qua đó nó đo giá trị dòng điện được rút ra. Thiết bị đi kèm với màn hình hiển thị bốn bảy đoạn, hiển thị ngay lập tức các giá trị của dòng điện và điện áp được tiêu thụ bởi thiết bị đính kèm. Các giá trị này thay đổi trong khoảng thời gian ba giây một lần.
Sự chỉ rõ:
- Dải điện áp hoạt động: 3.5V đến 7V
- Đánh giá hiện tại tối đa: 3A
- Kích thước nhỏ gọn, dễ mang theo
- Không cần nguồn cung cấp bên ngoài
Ứng dụng:
- Kiểm tra thiết bị USB
- Kiểm tra mức tải
- Gỡ lỗi bộ sạc pin
- Nhà máy, sản phẩm điện tử và mục đích sử dụng cá nhân
Sơ đồ mạch
Trong thiết lập ở trên để chứng minh các chế độ Ngủ sâu của Arduino, Arduino được cắm vào ampe kế USB. Sau đó, ampe kế USB được cắm vào cổng USB của máy tính xách tay. Chân dữ liệu của cảm biến DHT11 được gắn vào chân D2 của Arduino.
Giải thích mã
Mã hoàn chỉnh cho dự án với một video được đưa ra ở cuối.
Mã bắt đầu bằng cách bao gồm thư viện cho cảm biến DHT11 và thư viện LowPower . Để tải xuống thư viện Nguồn điện thấp, hãy làm theo liên kết. Sau đó, chúng tôi đã xác định số chân Arduino mà chân dữ liệu của DHT11 được kết nối và tạo một đối tượng DHT.
#include
Trong chức năng thiết lập void , chúng tôi đã bắt đầu giao tiếp nối tiếp bằng cách sử dụng serial.begin (9600), ở đây 9600 là tốc độ truyền. Chúng tôi đang sử dụng đèn LED tích hợp của Arduino làm chỉ báo cho chế độ ngủ. Vì vậy, chúng tôi đã đặt chân làm đầu ra và ghi kỹ thuật số ở mức thấp.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, THẤP); }
Trong chức năng vòng lặp khoảng trống , chúng tôi đang đặt đèn LED tích hợp ở mức CAO và đọc dữ liệu nhiệt độ và độ ẩm từ cảm biến. Đây, DHT.read11 (); đang đọc dữ liệu từ cảm biến. Sau khi dữ liệu được tính toán, chúng tôi có thể kiểm tra các giá trị bằng cách lưu nó vào bất kỳ biến nào. Ở đây, chúng ta đã lấy hai biến kiểu float là 't' và 'h' . Do đó, dữ liệu nhiệt độ và độ ẩm được in nối tiếp trên màn hình nối tiếp.
void loop () { Serial.println ("Lấy dữ liệu từ DHT11"); chậm trễ (1000); digitalWrite (LED_BUILTIN, CAO); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.tempether; float h = DHT.humidity; Serial.print ("Nhiệt độ ="); Serial.print (t); Serial.print ("C -"); Serial.print ("Độ ẩm ="); Serial.print (h); Serial.println ("%"); chậm trễ (2000);
Trước khi bật chế độ ngủ, chúng tôi đang in "Arduino: - Tôi đang ngủ trưa" và đặt đèn LED tích hợp ở mức Thấp. Sau đó, chế độ ngủ Arduino được kích hoạt bằng cách sử dụng lệnh được đề cập bên dưới trong mã.
Đoạn mã dưới đây cho phép chế độ ngủ định kỳ nhàn rỗi của Arduino và cho thời gian ngủ là 8 giây. Nó biến giao diện ADC, Bộ hẹn giờ, SPI, USART, 2 dây sang trạng thái TẮT.
Sau đó, nó tự động đánh thức Arduino khỏi chế độ ngủ sau 8 giây và in “Arduino: - Này, tôi vừa mới thức dậy”.
Serial.println ("Arduino: - Tôi đang đi ngủ ngắn"); chậm trễ (1000); digitalWrite (LED_BUILTIN, THẤP); LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF); Serial.println ("Arduino: - Này, tôi vừa mới thức dậy"); Serial.println (""); chậm trễ (2000); }
Vì vậy, bằng cách sử dụng mã này, Arduino sẽ chỉ thức dậy trong 24 giây trong một phút và sẽ ở chế độ ngủ trong 36 giây còn lại, điều này làm giảm đáng kể điện năng tiêu thụ của trạm thời tiết Arduino.
Do đó, nếu chúng ta sử dụng Arduino với chế độ ngủ, chúng ta có thể tăng gấp đôi thời gian chạy của thiết bị.