功耗是設備長時間連續運行而不斷電的關鍵因素。因此,為了解決這個問題,幾乎每個控制器都帶有睡眠模式,這有助于開發人員設計電子設備以實現最佳功耗。休眠模式通過關閉未使用的模塊將器件置于省電模式。
今天我們將了解Arduino睡眠模式(Sleep Mode)并使用Ammeter演示功耗。 Arduino睡眠模式也稱為Arduino省電模式(Power Save mode)或Arduino待機模式(Standby Mode)。
Arduino睡眠模式
睡眠模式允許用戶停止或關閉微控制器中未使用的模塊,從而顯著降低功耗。 Arduino UNO、Arduino Nano和Pro-mini配備了ATmega328P,它有一個欠壓檢測器(BOD),用于監控睡眠模式時的電源電壓。
ATmega328P有六種睡眠模式:
要進入任何睡眠模式,我們需要在睡眠模式控制寄存器(SMCR.SE)中啟用睡眠位。然后,睡眠模式選擇位選擇Idle、ADC noise reduction、Power-Down、Power-Save、Standby和External Standby的睡眠模式。
內部或外部Arduino中斷或復位可以將Arduino從睡眠模式喚醒。
空閑(Idle)模式
要進入空閑休眠模式,請寫入控制器“000”的SM [2,0]位。此模式停止CPU,但允許SPI、2線串行接口、USART、看門狗、計數器、模擬比較器工作。空閑模式基本上停止CLKCPU和CLKFLASH。通過使用外部或內部中斷,可以隨時喚醒Arduino。
空閑睡眠模式的Arduino代碼:
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
有一個用于在arduino中設置各種低功耗模式的庫。因此,首先從給定鏈接下載并安裝庫,然后使用上面的代碼將Arduino置于空閑睡眠模式。通過使用上面的代碼,Arduino將進入8秒的睡眠狀態并自動喚醒。正如您在代碼中所看到的,空閑模式會關閉所有定時器、SPI、USART和TWI(2線接口)。
ADC降噪模式(ADC noise reduction)
要使用此睡眠模式,請將SM [2,0]位寫入“001”。該模式會停止CPU,但允許ADC、外部中斷、USART、2線串行接口、看門狗和計數器運行。 ADC降噪模式基本上停止CLKCPU、CLKI / O和CLKFLASH。我們可以通過以下方法從ADC降噪模式喚醒控制器:
● 外部復位
● 看門狗系統復位
● 看門狗中斷
● 欠壓復位
● 2線串行接口地址匹配
● INT上的外部電平中斷
● 引腳更改中斷
● 定時器/計數器中斷
● SPM / EEPROM就緒中斷
掉電模式(Power-Down Mode)
掉電模式會停止所有生成的時鐘,并且只允許異步模塊的操作。可以通過將SM [2,0]位寫入'010'來啟用它。在此模式下,外部振蕩器關閉,但2線串行接口、看門狗和外部中斷繼續運行。它只能通過以下方法之一禁用:
● 外部復位
● 看門狗系統復位
● 看門狗中斷
● 欠壓復位
● 2線串行接口地址匹配
● INT上的外部電平中斷
● 引腳更改中斷
用于掉電周期模式的Arduino代碼:
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
該代碼用于打開省電模式。通過使用上面的代碼,Arduino將進入8秒的睡眠狀態并自動喚醒。
我們還可以使用具有中斷的掉電模式,其中Arduino將進入休眠狀態,但僅在提供外部或內部中斷時才會喚醒。
用于掉電中斷模式的Arduino代碼:
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)
要進入省電模式,我們需要將SM [2,0]引腳寫入'011'。該睡眠模式類似于掉電模式,只有一個例外,即如果啟用定時器/計數器,即使在睡眠時它也將保持運行狀態。可以使用定時器溢出喚醒設備。
如果您沒有使用時間/計數器,建議使用掉電模式而不是省電模式。
待機模式(Standby)
待機模式與掉電模式相同,它們之間的唯一區別是外部振蕩器在此模式下保持運行。要啟用此模式,請將SM [2,0]引腳寫入“110”。
擴展待機模式(Extended Standby)
此模式類似于省電模式,只有振蕩器保持運行的一個例外。當我們將SM [2,0]引腳寫入'111'時,器件將進入擴展待機模式。從延長待機模式喚醒器件需要6個時鐘周期。
需要的組件
● Arduino UNO開發板
● DHT11溫濕度傳感器
● 面包板
● 連接線
USB電流表
USB電流表是一種即插即用設備,用于測量任何USB端口的電壓和電流。加密狗插入USB電源(計算機USB端口)和USB設備(Arduino)之間。該器件具有與電源引腳串聯的0.05歐姆電阻,通過它可以測量所消耗的電流值。該設備配有四個七段顯示屏,可立即顯示連接設備消耗的電流和電壓值。這些值以每三秒的間隔刷新。
電路原理圖
在上面的演示中演示了Arduino深度睡眠模式,Arduino插入USB電流表,然后將USB電流表插入筆記本電腦的USB端口。 DHT11傳感器的數據引腳連接到Arduino的D2引腳。
代碼說明
首先包含DHT11傳感器和LowPower庫。要下載LowPower庫,請單擊此鏈接。然后我們定義了DHT11的數據引腳所連接的Arduino引腳編號,并定義了一個DHT對象。
#include
#include
#define dataPin 2
dht DHT;
在void setup()函數中,我們使用serial.begin(9600)啟動了串行通信,這里9600是波特率。我們使用Arduino的內置LED作為睡眠模式的指示器。因此,我們將引腳設置為輸出,將數字寫入設置為低電平。
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN,OUTPUT);
digitalWrite(LED_BUILTIN,LOW);
}
在void loop()函數中,我們將內置LED設為HIGH,并從傳感器讀取溫度和濕度數據。在這里,DHT.read11();函數是從傳感器讀取數據。計算完數據后,我們可以通過將值保存到任何變量來檢查這些值。在這里,我們采用了兩個浮點型變量't'和'h'。因此,溫度和濕度數據在串口監視器上串行打印。
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);
在啟用睡眠模式之前,我們正在打印“Arduino: - I am going for a Nap”并使內置LED為低電平。之后,在代碼中使用下面提到的命令啟用Arduino睡眠模式。
下面的代碼啟用Arduino的空閑周期性睡眠模式,并提供8秒的睡眠。它將ADC、定時器、SPI、USART、2線接口轉為OFF狀態。
然后它會在8秒后自動從睡眠中喚醒Arduino并打印出“Arduino:- Hey I just Woke up”。
Serial.println("Arduino:- I am going for a Nap");
delay(1000);
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將在一分鐘內喚醒24秒,并在36秒的剩余時間內保持睡眠狀態,這將顯著降低Arduino氣象站的功耗。
因此,如果我們將Arduino與睡眠模式一起使用,我們可以將設備運行時間顯著增加。
編輯:hfy
-
控制器
+關注
關注
112文章
16336瀏覽量
177829 -
Arduino
+關注
關注
188文章
6469瀏覽量
186962 -
控制寄存器
+關注
關注
0文章
34瀏覽量
11484
發布評論請先 登錄
相關推薦
評論