步驟1:所需的零件
在本教程中,我將使用以下部分,因此,如果您想自己嘗試本教程,則需要以下內容:
任何ESP32開發板?http://educ8s.tv/part/ESP32
A Firebeetle ESP32開發板?http://educ8s.tv/part/FireBeetle
面包板?http://educ8s.tv/part/LargeBreadboard
電線?http://educ8s。電視/零件/電線
LED?http://educ8s.tv/part/LEDs
萬用表?http://educ8s.tv/part/Multimeter
步驟2:在ESP32芯片內部
在ESP32芯片內部,我們可以找到兩種處理方式內核,RAM和ROM存儲器,WiFi模塊,藍牙模塊,用于加密應用程序的硬件加速模塊,RTC模塊以及許多外圍設備。在RTC模塊內部,我們可以找到一個PMU(相量測量單元),它是一種小型且低功耗的32位協處理器以及8Kbs的RAM存儲器。少量的內存非常有用,因為您很快就會發現。還要注意,即使ESP32芯片的RTC內存也比Arduino Uno的內存大4倍。
WiFi模塊,處理內核和藍牙模塊需要大量電流才能運行。因此,如果我們想節省電量,則必須在不使用它們時將其禁用。這就是我們現在要做的。我們將把ESP32設置為Deep – Sleep模式,在該模式下,除RTC模塊外,所有功能都將禁用。有輕度睡眠模式和深度睡眠模式。在深度睡眠模式下,ESP32功耗最低。 在深度睡眠模式下僅需要0.01 mAs的電流,這就是我們今天要嘗試的原因。
步驟3:ESP32深度睡眠模式
在這種模式下,如前所述,所有功能均被禁用。 CPU核心,WiFI模塊,藍牙模塊,外圍設備等。連同CPU一樣,芯片的主內存也被禁用,因此存儲在內存中的所有內容都會永遠丟失。處于深度睡眠模式時,唯一仍可以工作的模塊是RTC模塊,超低功耗協處理器及其內存!因此,如果將要在深度睡眠模式下生存的數據保存到RTC內存中,則在喚醒芯片后它們將保持完整。
有三種方法可以喚醒芯片。我們可以使用計時器,GPIO引腳或協處理器。
今天,我們將學習如何使用計時器在特定時間后喚醒芯片。讓我們看一個示例。
步驟4:深度睡眠示例
我已將兩個LED連接到此ESP32板。 ESP32開機時,黃色LED會亮三秒鐘,然后進入深度睡眠模式3秒鐘。喚醒后,它會點亮綠色指示燈3秒鐘,然后返回睡眠狀態。從現在開始,它只會閃爍綠色LED,因此該芯片記住這不是它第一次啟動,因為我們正在使用RTC內存來存儲整數值。
讓我們快速看一下。在這個項目的代碼。如您所見,代碼非常簡單。為了使ESP32進入深度睡眠模式,我們只需要兩行代碼。
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
我們使用esp_sleep_enable_timer_wakeup函數啟用計時器,輸入以秒為單位的睡眠時間,然后調用esp_deep_sleep_start函數。而已!
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP 3 /* Time ESP32 will go to sleep (in seconds) */
RTC_DATA_ATTR int bootCount = 0;
盡管與執行代碼有一點不同。當我們使用深度睡眠功能時,ESP32每次喚醒時,都會再次執行設置功能。從不調用循環函數。所有變量值都會丟失,除非我們使用此前綴將它們保存在RTC內存中。在此示例中,我將bootCount int變量保存到RTC內存中,以便程序知道它是否是第一次運行并打開正確的LED。像往常一樣,您可以找到此示例附帶的示例代碼。
步驟5:功耗
現在讓我們看看該板的功耗。 ESP32處于活動模式時,會從電池汲取約60mAs的電流。 ESP32處于深度睡眠模式時,它將消耗約19mAs的電流!這大大降低了電流消耗,但是該芯片的創建者聲稱在深度睡眠模式下需要0.01mA的電流。我們的設置有什么問題?
罪魁禍首是主板。我使用的是DOIT ESP32板,這是大約一年前上市的第一塊ESP32板。電路板的設計并未針對功耗進行優化,因此,即使在深度睡眠模式下,它也需要大量電流。幸運的是,那里有設計更好的ESP32板。
例如,DFrobot的Firebeetle ESP32板設計得更好,當使用3.3V電源供電時,其深度睡眠電流僅為0.01mAs。如果我們使用之前使用的相同電池組為電路板供電,其輸出約為4.8V,則可以看到在活動模式下的電流消耗為48mAs,而在深度睡眠模式下的電流僅為0.05mAs!印象深刻不是嗎!如果使用3.3V電池或電源,我們可以進一步降低電路板的功耗。我將在以后的視頻中嘗試。在深度睡眠模式下,該板所需的0.05mAs電流是我在功能齊全的ESP32板(具有USB至串行驅動器,調節器和電池電路)中消耗的最低電流。
如果您發現任何板子都能比Firebeetle板子取得更好的效果,請在下面的評論欄中告訴我,我想嘗試一下。
Firebeetle ESP32板子的功耗在深度睡眠模式非常低。如果使用4節AA充電電池供電,則每天需要大約1.44毫安時。因此,從理論上講,如果將其置于深度睡眠模式,則這種具有2.500mAhs容量的移動電源可以為該板供電近5年!當然,我們將不時喚醒電路板以執行需要更多功率的任務,因此電池壽命將大大減少。
步驟6:深入研究睡眠錯誤
不幸的是,ESP32的軟件和硬件尚未成熟。使用深度睡眠模式時,我嘗試在兩個ESP32板上都出現了一個軟件或硬件錯誤。隨機喚醒后,ESP32會進入睡眠狀態,并且不會再次喚醒。此錯誤可能在幾次喚醒后或100次之后發生。它只是隨機的。
我發現的一個簡單解決方案是在喚醒后和從RTC內存讀取之前添加500ms的小延遲。這樣,項目就可以正常工作,但是,當然,我們要付出的代價是減少了電池壽命,因為每次喚醒時芯片處于活動模式的時間要長500ms。我認為此錯誤將在不久的將來通過新的軟件或硬件修復得到解決。
void setup(){
pinMode(GREEN_LED_PIN,OUTPUT);
pinMode(YELLOW_LED_PIN,OUTPUT);
delay(500);
if(bootCount == 0) //Run this only the first time
{
digitalWrite(YELLOW_LED_PIN,HIGH);
bootCount = bootCount+1;
}else
{
digitalWrite(GREEN_LED_PIN,HIGH);
}
delay(3000);
digitalWrite(GREEN_LED_PIN,LOW);
digitalWrite(YELLOW_LED_PIN,LOW);
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
}
步驟7:最終想法
我已經在項目中使用了深度睡眠功能。您還記得幾周前我發布的In-Paper電子書溫度計嗎?不更新時需要60mAs的電流?,F在,使用芯片的深度睡眠功能,我設法將電流消耗降低到0.43mAs。因此,有了這種移動電源,我們現在的電池壽命估計約為3個月。很好,不是嗎?
但是我認為還有很多改進的余地。我的電路中某處有小電流泄漏。如果我們可以減少它,我們可以使該項目用電池運行一年以上!我認為這太神奇了!我們現在有了一塊功能非常強大的板,功耗非常低。最好的是,我們要做的就是利用這一點,只需使用兩行代碼!我將在以后的項目中大量使用此功能。
責任編輯:wv
-
ESP32
+關注
關注
18文章
960瀏覽量
17114
發布評論請先 登錄
相關推薦
評論