İçindekiler:

Derin Uyku ile Pil Ömründen Tasarruf: 20 Adım
Derin Uyku ile Pil Ömründen Tasarruf: 20 Adım

Video: Derin Uyku ile Pil Ömründen Tasarruf: 20 Adım

Video: Derin Uyku ile Pil Ömründen Tasarruf: 20 Adım
Video: iPhone'da pil kullanım süresini arttırmak için 6 öneri. 2024, Kasım
Anonim
Image
Image
ESP32'yi Uyandırmanın Yolları
ESP32'yi Uyandırmanın Yolları

ESP32'nizle pil kullanmakla ilgileniyor musunuz? Eğer öyleyse, bugün bu konuyla ilgili bazı önemli teknik bilgileri tartışıyor olacağım. Bu mikrodenetleyicinin bilgi aktarırken çok fazla enerji harcadığını biliyoruz. 190 miliampere yakın tüketir. Bu videoda, "DERİN UYKU" adı verilen işlevle ESP32'den nasıl enerji tasarrufu yapılacağını göstereceğim. Çipi bu moda girecek şekilde ayarlayacağız, bu moddan çıkmanın yollarını öğreneceğiz ve ESP32'yi uyandırmanın üç farklı yolunu gösteren bir örnek oluşturacağız.

Telsizin işlemciden çok enerji harcadığını hatırlamak önemlidir. Enerji tasarrufu çok önemlidir. Bunun nedeni, Uç Noktaların (bilgi gönderen devreler) genellikle pille çalışması ve beş yıla kadar sürmesi gerektiğidir. On yıla kadar süre vaat eden bazı üreticiler var ve bu, Uç Noktaları fazla kullanmayan yüksek kaliteli piller için geçerlidir. Diğer tüm durumlarda, devrenizden enerji tasarrufu için Derin Uyku kullanmanızı tavsiye ederim.

Adım 1: Giriş

ESP32, "Derin Uyku" adı verilen bir güç tasarrufu moduna sahiptir. Bu modda CPU'lar, çoğu RAM ve tüm dijital saatli çevre birimleri kapatılır. Çipin hala bağlanabilen parçaları yalnızca RTC denetleyicisi, RTC çevre birimleri (ULP yardımcı işlemcisi dahil) ve RTC bellekleridir.

Uyurken ESP32'yi uyandırmanın birkaç yolu var. Uyandırma kaynakları, Derin Uyku moduna girmeden önce herhangi bir zamanda ayarlanabilir.

Adım 2: ESP32'yi Uyandırmanın Yolları

ESP32'yi uyandırmanın beş yolu vardır:

• Zamanlayıcı

• Harici uyandırma (harici)

• Harici uyandırma (harici 1)

• ULP yardımcı işlemci uyandırma

• Dokunmatik yüzey

Adım 3: Zamanlayıcı

RTC denetleyicisi, önceden tanımlanmış bir süre sonra çipi etkinleştirmek için kullanılabilecek yerleşik bir zamanlayıcıya sahiptir. Zaman, mikrosaniye hassasiyetinde belirtilir.

esp_deep_sleep_enable_timer_wakeup(uint64_t time_in_us)

time_in_us> mikrosaniye cinsinden zamandır

4. Adım: Harici Uyandırma (ext0)

RTC IO modülü, RTC GPIO'larından biri önceden tanımlanmış bir mantık düzeyine girdiğinde alarmı tetiklemek için mantık içerir. RTC IO, RTC çevre birimlerinin güç alanının bir parçasıdır, bu nedenle bu etkinleştirme kaynağı talep edilirse RTC çevre birimleri Derin Uyku sırasında canlı tutulacaktır.

esp_deep_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int seviye)

gpio_num> Aktivasyon kaynağı olarak kullanılan GPIO numarası. Yalnızca RTC işlevli GPIO'lar kullanılabilir: 0, 2, 4, 12-15, 25-27, 32-39.

seviye> alarmı tetikleyecek giriş seviyesi (0 = DÜŞÜK, 1 = YÜKSEK)

Adım 5: Harici Uyandırma (ext1)

RTC denetleyicisi, birden fazla RTC GPIO kullanarak çalar saati tetiklemek için mantık içerir.

esp_deep_sleep_enable_ext1_wakeup(uint64_t maskesi, esp_ext1_wakeup_mode_t modu)

mask> aktivasyona neden olacak GPIO numaralarının bit maskesi. Bu bit eşlemde yalnızca RTC etkin GPIO'lar kullanılabilir: 0, 2, 4, 12-15, 25-27, 32-39.

modu> etkinleştirme koşulunu belirlemek için kullanılan mantık işlevini seçin:

• ESP_EXT1_WAKEUP_ALL_LOW: seçilen tüm GPIO'lar DÜŞÜK olduğunda uyanır

• ESP_EXT1_WAKEUP_ANY_HIGH: seçilen GPIO'lardan herhangi biri YÜKSEK olduğunda uyanır

Adım 6: ULP Yardımcı İşlemci Uyandırma

ULP yardımcı işlemcisi, çip Derin Uykudayken çalışabilir ve sensörleri aramak, ADC veya kapasitif dokunmatik sensör değerlerini izlemek ve belirli bir olay algılandığında çipi etkinleştirmek için kullanılabilir.

ULP yardımcı işlemcisi, RTC çevre birimlerinin güç alanının bir parçasıdır ve yavaş bellek RTC'sinde depolanan programı çalıştırır. Bu nedenle, bu etkinleştirme modu istenirse, Derin Uyku sırasında RTC çevre birimleri ve RTC yavaş belleği etkinleştirilecektir.

7. Adım: Dokunmatik Yüzey

RTC denetleyicisi, kapasitif dokunmatik sensörleri kullanarak alarmı tetiklemek için mantık içerir. Ancak dokunmatik pimin tanımı farklıdır. İstenen pinlerin her biri için dokunmatik kesmeyi kullanmalıyız.

Kesintileri ayarladıktan sonra, sensörleri kullanmak için uyandırma modunu etkinleştirdik.

//Dokunmatik Yüzeyi uyandırma kaynağı olarak yapılandır esp_sleep_enable_touchpad_wakeup();

8. Adım: Derin Uyku Moduna Girme

Uyandırma modunu ayarladıktan sonra, ESP32'yi Derin Uyku moduna geçirmek için tek bir komut (2,5 μA veya daha az harcama) yeterlidir. Burada, bu masrafın plakadan değil, ESP çipinden kaynaklandığını vurguluyorum, çünkü ikincisi daha fazla harcıyor.

esp_deep_sleep_start();

Bu komuttan, ESP32 uykuya dalar ve örneğin sonraki kod satırlarını yürütmez.

Önemli: Yukarıdaki komut yürütülmeden önce tüm uyandırma ayarları yapılmalıdır.

9. Adım: İşte Bazı Daha Önemli Bilgiler

İşte Bazı Daha Önemli Bilgiler
İşte Bazı Daha Önemli Bilgiler

Aşağıdaki çağrı, ESP32 uyandırma nedenini döndürür.

1: EXT0 2: EXT1 3: ZAMANLAYICI 4: TOUCHPAD 5: ULP

esp_sleep_get_wakeup_Cause();

Uyandırmayı touchpad ile ayarlarsak, komut aracılığıyla dokunmanın hangi GPIO'da gerçekleştiğini kurtarabiliriz.

esp_sleep_get_touchpad_wakeup_status();

ESP32 her uyandığında, kurulumda tekrar dolaşır. Böylece RTC hafızasında tanımlanmayan tüm değişkenler ev durumlarına geri dönecektir.

Değişkenleri uykuya daldıktan sonra bile bellekte tutmak için aşağıdaki örnekteki değişken bildirimini kullanın:

//RTC_DATA_ATTR bir değişken ve bellek değişkeni RTCRTC_DATA_ATTR int bootCount = 0;

Adım 10: Gösteri

Gösteri
Gösteri

Video, programın görüntüye uygun olarak çalıştığını gösterir.

11. Adım: WiFi NodeMCU-32S ESP-WROOM-32

WiFi DüğümüMCU-32S ESP-WROOM-32
WiFi DüğümüMCU-32S ESP-WROOM-32

Adım 12: Montaj

toplantı
toplantı

Adım 13: Program

Şimdi ESP32'yi Derin Uyku moduna girecek şekilde yapılandıracağımız bir program yapacağız. Bu, üç farklı şekilde uyandırılacaktır: biri Harici uyandırma (ext0) için, biri Zamanlayıcı için ve biri Dokunmatik Yüzey için. Birlikte çalışamazlar, bu yüzden uyanma yolunu yapılandırmak için ESP32'nin Önyükleme verme sayısı için bir sayaç olacak bir değişken kullanacağız.

Adım 14: Kitaplık Gerekli

Kütüphane Gerekli
Kütüphane Gerekli

OLED ekranı kontrol etmek için harici bir kütüphaneye ihtiyacımız var. Bunun için U8g2 kütüphanesini indireceğiz.

Arduino IDE'de Sketch menüsüne gidin >> Kütüphaneyi Dahil Et >> Kütüphaneleri Yönet ….

Adım 15: Kitaplıklar ve Değişkenler

OLED ekranını kontrol etmek için kitaplığın yanı sıra ekran denetleyicisi örneğinin yapıcısını ekledik. Ayrıca değişkeni RTC hafızasında tahsis ediyoruz. Dokunma kabulü için hassasiyeti, saniye olarak mikrosaniye dönüştürme faktörünü ve ESP32'nin uyku moduna geçme süresini (saniye olarak) ayarladık.

#include // biblioteca para kontrolü oled'i göster

//construtor ve instancia do kontrol cihazı gösterimi //SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C gösterimi(SCL, SDA, U8X8_PIN_NONE); //RTC_DATA_ATTR bellekte bir değişken olarak RTC RTC_DATA_ATTR int bootCount = 0; //ensibilidade para aceitação toque #define Threshold 40 //kişisel dönüşümler için mikrosegundos para segundos #define uS_TO_S_FACTOR 1000000 //ESP32 uyku modu (em segundos) #define TIME_TO_SLEEP 3

Adım 16: Kurulum

Kurulumda, Önyüklemenin gerçekleşme sayısını artırıyoruz. Boot motifini yazdırmak için fonksiyonu çağırıyoruz. Boot numarası PAR ise (EXT0) butonu ile ESP32'yi uyanacak şekilde ayarlıyoruz. 3'ün katı ise, ESP32'yi belirli bir süre sonra uyanacak şekilde ayarlıyoruz. Aksi takdirde, ESP32'yi uyandırmak için kapasitif dokunmatik pinleri kurduk. Son olarak Touchpad'i uyandırma kaynağı olarak ayarlıyoruz ve ESP32'yi uyku moduna girmeye zorluyoruz.

geçersiz kurulum() { Serial.begin(115200); gecikme(1000); //artırma o numero de vezes kuyruğu o BOOT ocorreu ++bootCount; configureDisplay(); // BOOT yapmak için bir işleve izin ver print_wakeup_reason(); // PAR yapılandırmaları için o numero de boot o ESP32 para despertar através do botão (EXT0) if(bootCount % 2 == 0) { esp_sleep_enable_ext0_wakeup(GPIO_NUM_39, 1); //1 = Yüksek, 0 = Düşük } //çoklu de 3 yapılandırması için o ESP32 para despertar depois de um tempo definido else if(bootCount % 3 == 0) { esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); } //caso contrario konfigürasyonları os pinos de touch capacitivo para despertar o ESP32 başka { //Touch Pad 5'te kurulum kesintisi (GPIO12) touchAttachInterrupt(T5, geri arama, Eşik); //Dokunmatik Yüzeyi uyandırma kaynağı olarak yapılandır esp_sleep_enable_touchpad_wakeup(); } Serial.println(“entrando em modo uyku ); esp_deep_sleep_start(); //esp o ESP32 entrar em modo UYKU }

Adım 17: Döngü, Geri Arama ve Ekranı Yapılandır

Döngüde yapacak bir şeyimiz yok. Daha sonra, kesinti meydana geldiğinde yapacak bir şeyimiz varsa, geri aramayı kesmeye devam ederiz. configDisplay ile ilgili olarak, ekranı başlatıyoruz ve bazı parametreleri yapılandırıyoruz. Ekrana Önyüklemenin kaç kez gerçekleştiğini yazdırıyoruz.

//döngüsüz döngü yok() { } //geri arama das interrupções void callback(){ //caso queira fazer algo ao ocorrer a interrupção } void configurationDisplay() { //incializa o display ve configura alguns parametros display. başlamak(); display.setPowerSave(0); //modo güç Tasarrufu (0-Kapalı ? 1-Açık) display.setFont(u8x8_font_torussansbold8_u); //fonte utilizada //görüntüleme yok numero de vezes que aconteceu o BOOT display.drawString(0, 0, "BOOT NUM:"); display.drawString(0, 2, String(bootCount).c_str()); display.drawString(0, 4, "MOTIVO:"); }

Adım 18: Print_wakeup_reason (Uyanışın Nedenini bilmek)

Burada, ESP32 uyandırma nedenini yazdırma işlevine sahibiz. Pimi kontrol edin ve ekrana yazdırın.

// ESP32 despertarvoid'i nedensel olarak onayla print_wakeup_reason(){ esp_sleep_wakeup_Cause_t wakeup_reason; Dize nedeni = ""; wakeup_reason = esp_sleep_get_wakeup_Cause(); // bir nedenden ötürü kurtarma anahtarı (wakeup_reason) { case 1:reason = "EXT0 RTC_IO BTN"; kırmak; durum 2:sebep = "EXT1 RTC_CNTL"; kırmak; durum 3:sebep = "ZAMANLAYICI"; kırmak; durum 4:sebep = "TOUCHPAD"; kırmak; durum 5:sebep = "ULP PROGRAMI"; kırmak; varsayılan:neden = "DS NEDENİ YOK"; kırmak; } Serial.println(neden); display.clearLine(6); //apaga a linha 6 display.drawString(0, 6, Reason.c_str()); //bir nedenden dolayı hiçbir gösterim yok //se despertou por TOUCHPAD, en iyi şekilde doğrulanabilir if(wakeup_reason == 4) { print_wakeup_touchpad(); //verifica o pino e imprime gösterim yok } }

19. Adım: Print_wakeup_touchpad (GPIO Touch'ı bilin)

Şimdi bu adımda dokunulan pini yazdırma fonksiyonumuz var. ESP32'yi uyandıran GPIO'yu kurtardık ve ekrana yazdırdık.

//çoğunlukla değiştirilen bir işleve sahip tocadovoid print_wakeup_touchpad() { touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status(); //recupera o GPIO que despertou o ESP32 String GPIO = ""; switch(touchPin) { durum 0: GPIO = "4"; kırmak; durum 1: GPIO = "0"; kırmak; durum 2: GPIO = "2"; kırmak; durum 3: GPIO = "15"; kırmak; durum 4: GPIO = "13"; kırmak; durum 5: GPIO = "12"; kırmak; durum 6: GPIO = "14"; kırmak; durum 7: GPIO = "27"; kırmak; durum 8: GPIO = "33"; kırmak; durum 9: GPIO = "32"; kırmak; varsayılan: Serial.println("Dokunmatik yüzey ile uyanma değil"); kırmak; } Serial.println("GPIO: "+GPIO); display.clearLine(7);//apaga a linha 7 display.drawString(0, 7, "GPIO: "); display.drawString(6, 7, GPIO.c_str()); // GPIO }

Adım 20: Dosyaları İndirin

PDF

BEN HAYIR

Önerilen: