- Gereksinimler
- ESP32 Uyku Modu Devre Şeması
- ESP32'de Uyku Modlarına Genel Bakış
- Derin Uyku Modu için ESP32'yi Programlama
- ESP32'yi Derin Uyku Modunda Test Etme
ESP32, en popüler Wi-Fi tabanlı mikrodenetleyici modüllerinden biridir ve birçok Taşınabilir IoT Uygulamasında popüler bir seçimdir. Çift Çekirdekli Programlamayı destekleyen güçlü bir denetleyicidir ve aynı zamanda dahili Bluetooth Düşük Enerji (BLE) desteğine sahiptir, bu da onu iBeacon cihazları, GPS İzleyiciler vb. Gibi taşınabilir uygulamalar için iyi bir seçim haline getirir. Bununla birlikte, bunun gibi Pille çalışan uygulamalarda en büyük sorun pil yedeklemesidir. Bu pil yedeği, cihazın pil yedeklemesini artırmak için ideal durumda ESP32'yi uyku modunda programlayabileceği gibi, mikro denetleyici birimi üzerinde daha akıllı kontrol ile artırılabilir.
Bu projede, yaygın olarak kullanılan Wi-Fi ve Bluetooth özellikli mikro denetleyici birimi ESP32'nin normal çalışma modunda ve derin uyku modunda mevcut tüketimini kontrol edeceğiz. Ayrıca, farkı test edeceğiz ve ESP32'yi derin uyku moduna nasıl geçireceğimizi kontrol edeceğiz. Tasarımınızı çok daha verimli hale getirmek için kullanılabilecek diğer ipuçları için mikrodenetleyicilerde güç tüketiminin nasıl en aza indirileceğine ilişkin makaleye de göz atabilirsiniz. Ayrıca, diğer mikrodenetleyicilerin uyku moduyla ilgileniyorsanız, Arduino Uyku modunu ve ESP8266 NodeMCU Uyku modunu da kontrol edebilirsiniz.
Gereksinimler
Bunu yapmak için, USB'den UART köprüsüne ve kolay bağlantı için diğer ESP32 pin çıkışlarına sahip Espressif'in ESP32 tabanlı Devkit V4.0'ını kullanacağız. Programlama Arduino IDE ile yapılacaktır. Tamamen yeniyseniz, Arduino kullanarak ESP32 ile Başlarken için, devam etmeden önce bağlantılı makaleyi okuyun.
Bu projenin gereksinimleri şunlardır:
- Bir düğmeye basarak derin uyku moduna geçecektir.
- Başka bir düğmeye basılarak derin uyku modundan uyanacaktır.
- ESP32'nin durumunu tespit etmek için, 1000 milisaniye açılma süresiyle bir LED yanıp sönecektir. Uyku modu sırasında kapatılacaktır.
Bu nedenle, ek bileşenler gereklidir-
- LED - 1 adet
- Basmalı düğme (Dokunsal anahtar) - 2 adet
- 4.7k direnç - 2 adet
- 680R direnç - 1 adet
- Breadboard
- Tel bağla
- 5V adaptör veya güç kaynağı ünitesi
- Bir mikro USB kablosu
- Bir PC veya Dizüstü Bilgisayarda ESP32 programlama arabirimli Arduino IDE
ESP32 Uyku Modu Devre Şeması
ESP32'yi basmalı düğme ile uyku moduna geçirme şeması aşağıda gösterilmiştir.
Şematik oldukça basit. İki düğmesi vardır. Uyku düğmesi ESP32'yi derin uyku moduna geçirir ve ESP32'yi uyku modundan uyandırmak için başka bir anahtar kullanılır. Her iki düğme de PIN 16 ve PIN 33 olarak bağlanmıştır. Her iki düğme basıldığında aktif düşük olarak yapılandırılmıştır, bu nedenle ek bir yukarı çekme sağlanır. Bununla birlikte, ESP 32'nin uyku modunda mı yoksa normal çalışma koşulu modunda mı olduğunu tespit etmek için LED, IO Pin 4'e bağlanır.
ESP32'de Uyku Modlarına Genel Bakış
ESP32 için birçok farklı güç modu vardır; bunlar, aktif mod, modem uyku modu, hafif uyku modu, derin uyku modu ve hazırda bekletme modu.
Normal çalışma koşulu sırasında, ESP32 aktif modda çalışır. ESP32 etkin modu sırasında, CPU, WiFi / BT donanımı, RTC belleği ve RTC çevre birimleri, ULP yardımcı işlemcileri etkinleştirilir ve iş yüküne bağlı olarak çalışır. Ancak, farklı güç modlarında bir veya daha fazla çevre birimi kapatılır. Farklı güç modu işlemlerini kontrol etmek için aşağıdaki tabloyu izleyin.
Donanım |
Aktif Mod |
Modem-uyku Modu |
Hafif Uyku Modu |
Derin uyku modu |
Hazırda bekletme |
İşlemci |
AÇIK |
AÇIK |
DURAKLAT |
KAPALI |
KAPALI |
WiFi / BT |
AÇIK |
KAPALI |
KAPALI |
KAPALI |
KAPALI |
RTC ve RTC Çevre Birimleri |
AÇIK |
AÇIK |
AÇIK |
AÇIK |
KAPALI |
ULP-Co İşlemci |
AÇIK |
AÇIK |
AÇIK |
AÇIK KAPALI |
KAPALI |
Yukarıdaki tabloda görebileceğimiz gibi, genellikle ULP sensörü izlenen model olarak adlandırılan ESP32 derin uyku modunda - CPU, WiFi / BT, RTC belleği ve çevre birimleri, ULP yardımcı işlemcilerin tümü kapalı. Yalnızca RTC belleği ve RTC çevre birimleri açılır.
Uyanma durumu sırasında, ESP32'yi derin uyku modundan uyandıracak bir uyandırma kaynağı tarafından ESP32'ye bildirilmesi gerekir. Ancak, RTC çevre birimleri açık olduğundan ESP32, RTC etkin GPIO'lar aracılığıyla uyandırılabilir. Başka seçenekler de var. Harici bir uyandırma kesinti pini aracılığıyla veya ESP32'yi uyandırmak için bir zamanlayıcı kullanılarak uyandırılabilir. Bu projede, 33 numaralı pin üzerinde ext0 wakeup kullanıyoruz.
Derin Uyku Modu için ESP32'yi Programlama
Programın tamamı bu sayfanın alt kısmında bulunabilir. Arduino IDE için yazılmıştır ve bu nedenle gereksinimlerinize kolayca uyarlanabilir. Kodun açıklaması aşağıdaki gibidir.
Kodun başında, // Bir PushButton değişkeni oluşturun PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // Led Pinini tanımlayın uint8_t led_pin = GPIO_NUM_4; // uyandırma pinini tanımlayın uint8_t wakeUp_pin = GPIO_NUM_33;
Yukarıdaki üç satır uyandırma pini, LED pini ve uyku modu pini tanımlar.
void setup () { // bir kez çalıştırmak için kurulum kodunuzu buraya yerleştirin: // seri bağlantı noktasını 115200 Serial.begin (115200) olarak ayarlayın; gecikme (1000); // pushButton pinini dahili PullUp pinMode (pushBtn.pin, INPUT_PULLUP) ile girdi olarak ayarlayın ; // Düşme modunda pushButton piniyle Interrupt işleyicisini ayarlayın attachInterrupt (pushBtn.pin, isr_handle, FALLING); // Led pinini ouput pinMode (led_pin, OUTPUT) olarak ayarlayın; // öncelik 1 ile blinkLed () işlevinde yürütülecek ve core 0 xTaskCreate ( blinkLed, / * Task işlevi. * / "blinkLed", / * görev adı) üzerinde yürütülecek bir görev oluşturun. * / 1024 * 2, / * Görevin yığın boyutu * / NULL, / * görevin parametresi * / 5, / * görevin önceliği * / & taskBlinkled); / * Oluşturulan görevi takip etmek için görev tutacağı * / delay (500); // Pin 33'ü DÜŞÜK mantık seviyesi esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0) ile ext0 uyandırma kaynağı olarak yapılandırın ; }
Yukarıda, kesme, kod parçacığı tarafından düşme moduna ayarlanmıştır.
attachInterrupt (pushBtn.pin, isr_handle, DÜŞEN);
Bu nedenle, anahtara her basıldığında, mantık seviyesi mantık 1'den (3.3V) mantık 0'a (0V) değiştirilecektir. Düğme piminin voltajı düşecek ve ESP32 anahtara basıldığını belirleyecektir. LED'in yanıp sönmesi için oluşturulmuş bir görev de vardır.
xTaskCreate ( blinkLed, / * Task function. * / "blinkLed", / * görev adı. * / 1024 * 2, / * Görevin yığın boyutu * / NULL, / * görev parametresi * / 5, / * öncelik görevin * / & taskBlinkled); / * Oluşturulan görevi takip etmek için görev tutacağı * / delay (500);
Pim 33 ayrıca aşağıdaki kod parçacığı kullanılarak ext0 olarak tanımlanan harici bir uyandırma kaynağı olarak yapılandırılır.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Sonra, while döngüsünde-
void loop () { // tekrar tekrar çalıştırmak için ana kodunuzu buraya yerleştirin: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Basıldı \ n", pushBtn.pin); Serial.printf ("'BlinkLed' Görevini Askıya Al \ n"); // yanıp sönen Görevi askıya alın vTaskSuspend (taskBlinkled); digitalWrite (led_pin, DÜŞÜK); Serial.printf ("Uyumaya gidiyor….. \ n", pushBtn.pin); pushBtn.pressed = yanlış; // Şimdi uyuyun esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); switch (wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println ("Uykudan Uyandırma için ext0 harici sinyal kullanarak"); kırmak; case ESP_SLEEP_WAKEUP_EXT1: Serial.println ("Uykudan Uyanmak için harici sinyal ext1 kullanarak"); kırmak; case ESP_SLEEP_WAKEUP_TIMER: Serial.println ("Uykudan Uyanmak için Zamanlayıcı sinyalini kullanma"); kırmak; case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("Uykudan Uyandırma için Dokunmatik Yüzey sinyalini kullanarak"); kırmak; case ESP_SLEEP_WAKEUP_ULP: Serial.println ("Uykudan Uyanmak için ULP sinyalini kullanarak"); kırmak; varsayılan: ara; Serial.printf ("'BlinkLed' Görevini Devam Ettir \ n"); // blinkLed Task vTaskResume (taskBlinkled) 'i yeniden başlatın ; } }
While döngüsü sürekli olarak uyku düğmesine basılıp basılmadığını kontrol eder. Düğmeye basılırsa, LED yanıp sönme görevini durdurur veya askıya alır ve esp derin uyku başlatma işlevini çalıştırır.
esp_deep_sleep_start ();
Bu durumda ext0 harici kesme butonuna basılırsa derin uyku modundan hemen uyanacak ve led yanıp sönme görevine devam edecektir.
Son olarak, LED yanıp sönme işlevi aşağıdaki snippet'lerde görülebilir, LED'i 1000 ms saniye yanıp söner.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // pin değerini değiştirin pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "Açık": "Kapalı"); / * LED'i her 1000 ms veya 1 saniyede bir değiştirin * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
ESP32'yi Derin Uyku Modunda Test Etme
Devre bir devre tahtasında oluşturulur ve akımı ölçmek için bir Metravi XB sürümü multimetre kullanılır. Devrenin aktif modda çektiği akım neredeyse 58 mA'dır, ancak derin uyku modunda akım neredeyse 4,10 mA'dır. Aşağıdaki resim ESP32 aktif mod akım tüketimini göstermektedir -
Derin uyku modunda, akım tüketimi yaklaşık 3,95mA'ya düştüğü kaydedilir, aşağıdaki görüntü ESP32 Derin Uyku Modu Mevcut Tüketimi gösterir.
Ancak derin uyku modunda ESP32'nin akım tüketimi neredeyse 150 uA'dır. Ancak bu ESP32 Devkit kartı için kaydedilen akım tüketimi neredeyse 4,10 mA'dır. Bunun nedeni CP2102 ve Doğrusal Regülatördür. Bu ikisi 5V güç hattına bağlıdır. Neredeyse 2mA akım tüketen güç hattına bağlı bir güç LED'i de vardır.
Bu nedenle, ESP32'nin batarya ile çalışan işlemler için çok yararlı olan derin uyku modunda çok düşük miktarda enerji tükettiği kolayca tespit edilebilir. Nasıl çalıştığı hakkında daha fazla bilgi için, aşağıda bağlantısı verilen videoya göz atın. Herhangi bir sorunuz varsa, aşağıdaki yorum bölümüne bırakın veya diğer teknik sorular için Forumlarımızı kullanın.