Talaan ng mga Nilalaman:

Pag-save ng Buhay ng Baterya Sa Malalim na Pagtulog: 20 Hakbang
Pag-save ng Buhay ng Baterya Sa Malalim na Pagtulog: 20 Hakbang

Video: Pag-save ng Buhay ng Baterya Sa Malalim na Pagtulog: 20 Hakbang

Video: Pag-save ng Buhay ng Baterya Sa Malalim na Pagtulog: 20 Hakbang
Video: Nagtatrabaho ako sa Private Museum for the Rich and Famous. Mga kwentong katatakutan. Horror. 2024, Nobyembre
Anonim
Image
Image
Mga paraan upang Gisingin ang ESP32
Mga paraan upang Gisingin ang ESP32

Interesado ka bang gumamit ng baterya sa iyong ESP32? Kung gayon, tatalakayin ko ngayon ang ilang mahahalagang impormasyong panteknikal patungkol sa paksang ito. Alam namin na ang microcontroller na ito ay gumastos ng maraming enerhiya kapag nagpapadala ito ng impormasyon. Kumokonsumo ito ng halos 190 milliamp. Sa video na ito, ipapakita ko kung paano makatipid ng enerhiya mula sa ESP32 na may tinaguriang "DEEP SLEEP" na pagpapaandar. Itatakda namin ang maliit na tilad upang ipasok ang mode na ito, alamin ang mga paraan upang lumabas sa mode na ito, at lumikha ng isang halimbawa na nagpapakita ng tatlong magkakaibang paraan upang gisingin ang ESP32.

Mahalagang tandaan na ang radyo ay gumastos ng maraming enerhiya, sa halip na ang nagpoproseso. Napakahalaga ng pag-save ng enerhiya. Ito ay dahil ang mga Endpoint (ang mga circuit na nagpapadala ng impormasyon) ay madalas na pinapatakbo ng baterya at dapat tumagal ng hanggang limang taon. Mayroong ilang mga tagagawa na nangangako ng hanggang sa sampung taon ang tagal, at ito ay may bisa para sa mga de-kalidad na baterya na hindi gumagamit ng mga Endpoint. Sa lahat ng iba pang mga kaso, pinapayuhan ko kayo na gumamit ng Deep Sleep upang makatipid ng enerhiya mula sa iyong circuit.

Hakbang 1: Panimula

Ang ESP32 ay may mode na nakakatipid ng kuryente, na tinawag na "Malalim na Pagtulog." Sa mode na ito, naka-off ang mga CPU, karamihan sa RAM, at lahat ng mga digital na orasan na peripheral. Ang mga bahagi lamang ng maliit na tilad na maaaring maiugnay pa rin ay ang RTC controller, RTC peripherals (kabilang ang ULP coprocessor), at mga alaala ng RTC.

Mayroon kaming maraming mga paraan upang gisingin ang ESP32 kapag natutulog. Maaaring mai-set up ang mga mapagkukunan sa anumang oras bago pumasok sa mode na Deep Sleep.

Hakbang 2: Mga Paraan upang Wake ang ESP32

Mayroong limang mga paraan upang gisingin ang ESP32:

• Timer

• Panlabas na paggising (ext0)

• Panlabas na paggising (ext1)

• paggising ng ULP coprocessor

• Touchpad

Hakbang 3: Timer

Ang tagontrol ng RTC ay may built-in na timer na maaaring magamit upang buhayin ang maliit na tilad pagkatapos ng isang paunang natukoy na tagal ng panahon. Ang oras ay tinukoy na may microsecond na katumpakan.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

Ang time_in_us> ay ang oras sa microseconds

Hakbang 4: Panlabas na Gumising (ext0)

Naglalaman ang module ng RTC IO ng lohika upang ma-trigger ang alarma kapag ang isa sa mga RTC GPIO ay pumasok sa isang paunang natukoy na antas ng lohika. Ang RTC IO ay bahagi ng domain ng kapangyarihan ng mga peripheral ng RTC, kaya't ang mga peripheral ng RTC ay mananatiling buhay habang Deep Sleep kung hinihiling ang mapagkukunang ito ng pag-activate.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, int level)

gpio_num> Ang numero ng GPIO na ginamit bilang mapagkukunan ng pag-aktibo. Ang mga RTC-functional GPIO lamang ang maaaring magamit: 0, 2, 4, 12-15, 25-27, 32-39.

antas> antas ng pag-input na magpapalitaw ng alarma (0 = LOW, 1 = MATAAS)

Hakbang 5: Panlabas na Gumising (ext1)

Naglalaman ang RTC controller ng lohika upang ma-trigger ang alarm clock gamit ang maraming RTC GPIO.

esp_deep_sleep_enable_ext1_wakeup (uint64_t mask, esp_ext1_wakeup_mode_t mode)

mask> bit mask ng mga numero ng GPIO na magdudulot ng pag-aktibo. Ang mga GPIO na pinagana lang ng RTC ang maaaring magamit sa bitmap na ito: 0, 2, 4, 12-15, 25-27, 32-39.

mode> piliin ang pagpapaandar sa lohika na ginamit upang matukoy ang kondisyon ng pag-aktibo:

• ESP_EXT1_WAKEUP_ALL_LOW: nagigising kapag ang lahat ng mga napiling GPIO ay nasa Mababa

• ESP_EXT1_WAKEUP_ANY_HIGH: nagigising kapag ang alinman sa mga napiling GPIO ay TAAS

Hakbang 6: ULP Coprocessor Wakeup

Ang ULP coprocessor ay maaaring gumana habang ang maliit na tilad ay nasa Deep Sleep at maaaring magamit upang maghanap ng mga sensor, subaybayan ang mga halaga ng ADC o capacitive touch sensor, at buhayin ang maliit na tilad kapag nakita ang isang tukoy na kaganapan.

Ang ULP coprocessor ay bahagi ng domain ng kapangyarihan ng mga peripheral ng RTC at pinapatakbo ang program na nakaimbak sa mabagal na memorya ng RTC. Samakatuwid, ang mga peripheral ng RTC at mabagal na memorya ng RTC ay isasaaktibo sa panahon ng Deep Sleep kung hinihiling ang activation mode na ito.

Hakbang 7: Touchpad

Naglalaman ang RTC controller ng lohika upang ma-trigger ang alarma gamit ang capacitive touch sensors. Ang kahulugan ng touch pin, gayunpaman, ay magkakaiba. Dapat naming gamitin ang ugnay makagambala para sa bawat isa sa nais na mga pin.

Matapos itakda ang mga nakakagambala, pinagana namin ang mode na paggising upang magamit ang mga sensor.

// I-configure ang Touchpad bilang mapagkukunan ng paggising esp_sleep_enable_touchpad_wakeup ();

Hakbang 8: Pagpasok sa Deep Sleep Mode

Matapos magtakda ng isang mode na paggising, isang solong utos na ilagay ang ESP32 sa mode na Deep Sleep (paggastos ng 2.5 μA o mas kaunti) ay sapat na. Binibigyang diin ko dito na ang gastos na ito ay mula sa chip ng ESP at hindi sa plato, dahil ang huli ay gumagasta ng higit pa.

esp_deep_sleep_start ();

Mula sa utos na ito, natutulog ang ESP32 at hindi isinasagawa ang mga susunod na linya ng code halimbawa.

Mahalaga: Ang lahat ng mga setting ng paggising ay dapat gawin bago isagawa ang utos sa itaas.

Hakbang 9: Narito ang Ilang Mas Mahahalagang Impormasyon

Narito ang Ilang Mas Mahahalagang Impormasyon
Narito ang Ilang Mas Mahahalagang Impormasyon

Ibinabalik ng tawag sa ibaba ang sanhi ng paggising ng ESP32.

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

esp_sleep_get_wakeup_cause ();

Kung itinakda namin ang paggising sa pamamagitan ng touchpad, maaari naming mabawi kung aling GPIO na nangyari ang pagpindot sa pamamagitan ng utos

esp_sleep_get_touchpad_wakeup_status ();

Sa tuwing gigising ang ESP32, ikikot ito sa pag-setup muli. Sa gayon ang lahat ng mga variable na hindi tinukoy sa memorya ng RTC ay babalik sa kanilang estado sa bahay.

Upang mapanatili ang mga variable sa memorya kahit na makatulog, gamitin ang variable na deklarasyon sa halimbawa sa ibaba:

// RTC_DATA_ATTR aloca a variável na memória RTCRTC_DATA_ATTR int bootCount = 0;

Hakbang 10: Pagpapakita

Pagpapakita
Pagpapakita

Ipinapakita ng video ang paggana ng programa, alinsunod sa imahe.

Hakbang 11: WiFi NodeMCU-32S ESP-WROOM-32

WiFi NodeMCU-32S ESP-WROOM-32
WiFi NodeMCU-32S ESP-WROOM-32

Hakbang 12: Assembly

Assembly
Assembly

Hakbang 13: Programa

Gagawa kami ngayon ng isang programa kung saan mai-configure namin ang ESP32 upang pumasok sa mode na Deep Sleep. Gisingin ito sa tatlong magkakaibang paraan: isa para sa Panlabas na paggising (ext0), isa para sa Timer, at isa para sa Touchpad. Hindi sila maaaring magtulungan, kaya gagamit kami ng isang variable na magiging counter para sa bilang ng beses na binigyan ng ESP32 ng Boot upang i-configure ang paraan upang magising.

Hakbang 14: Kinakailangan ang Library

Kailangan ng Library
Kailangan ng Library

Upang makontrol ang pagpapakita ng OLED, kailangan namin ng isang panlabas na library. Para sa mga ito, mai-download namin ang library ng U8g2.

Sa Arduino IDE, pumunta sa menu ng Sketch >> Isama ang Library >> Pamahalaan ang Mga Aklatan ….

Hakbang 15: Mga Aklatan at Variable

Isinama namin ang silid-aklatan upang makontrol ang pagpapakita ng OLED, pati na rin isang tagapagbuo ng halimbawa ng display controller. Gayundin, inilalaan namin ang variable sa memorya ng RTC. Itinakda namin ang pagiging sensitibo para sa pagtanggap ng ugnay, ang kadahilanan ng conversion ng microsecond para sa mga segundo, at ang oras na ang ESP32 ay pupunta sa mode ng pagtulog (sa mga segundo).

#include // biblioteca para controle do display oled

// construtor da instancia do controlador do display // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C display (SCL, SDA, U8X8_PIN_NONE); // RTC_DATA_ATTR aloca a variável na memoria RTC RTC_DATA_ATTR int bootCount = 0; // sensibilidade para sa aceitação do toque #define Threshold 40 // fator de Conversão de microsegundos para segundos #define uS_TO_S_FACTOR 1000000 // tempo que o ESP32 ficará em modo sleep (em segundos) #define TIME_TO_SLEEP 3

Hakbang 16: Pag-setup

Sa Pag-setup, pinapalaki namin ang bilang ng beses na naganap ang Boot. Tinatawag namin ang pagpapaandar upang mai-print ang Boot motif. Kung ang numero ng Boot ay PAR, itinakda namin ang ESP32 upang magising sa pamamagitan ng (EXT0) na pindutan. Kung ito ay isang maramihang 3, itinakda namin ang ESP32 upang magising pagkatapos ng isang itinakdang oras. Kung hindi man, na-set up namin ang capacitive touch pin upang gisingin ang ESP32. Sa wakas, itinakda namin ang Touchpad bilang mapagkukunan ng paggising at pinipilit ang ESP32 na pumasok sa mode ng pagtulog.

void setup () {Serial.begin (115200); pagkaantala (1000); // incrementa o numero de vezes que o BOOT ocorreu ++ bootCount; configureDisplay (); // chama a função para imprimir o motivo do BOOT print_wakeup_reason (); // se o numero de boot para sa PAR configuramos o ESP32 para despertar através do botão (EXT0) kung (bootCount% 2 == 0) {esp_sidur_enable_ext0_wakeup (GPIO_NUM_39, 1); // 1 = Mataas, 0 = Mababa} // se for multiplo de 3 configuramos o ESP32 para despertar depois de um tempo definido else if (bootCount% 3 == 0) {esp_sidur_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); } // caso contrario configuramos os pinos de touch capacitivo para despertar o ESP32 else {// Pag-set up ng abala sa Touch Pad 5 (GPIO12) touchAttachInterrupt (T5, callback, Threshold); // I-configure ang Touchpad bilang mapagkukunan ng paggising esp_sleep_enable_touchpad_wakeup (); } Serial.println ("entrando em modo sleep"); esp_deep_sleep_start (); // força o ESP32 entrar em modo SLEEP}

Hakbang 17: Loop, Callback & ConfigureDisplay

Sa Loop, wala kaming gagawin. Pagkatapos ay nagpapatuloy kami upang makagambala sa callback kung mayroon kaming kailangang gawin kapag nangyari ang pagkagambala. Tungkol sa configureDisplay, isinisimulan namin ang pagpapakita at i-configure ang ilang mga parameter. Nai-print namin sa screen ang bilang ng beses na nangyari ang Boot.

// nada a se fazer no loopvoid loop () {} // callback das interrupções void callback () {// caso queira fazer algo ao ocorrer a interrupção} void configureDisplay () {// inicializa o display at configura alguns parametros display. simulan (); display.setPowerSave (0); // modo powerSave (0-Off? 1-On) display.setFont (u8x8_font_torussansbold8_u); // fonte utilizada // imprime no display os 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:"); }

Hakbang 18: Print_wakeup_reason (alam ang Sanhi ng Pagkagising)

Dito, mayroon kaming pagpapaandar upang mai-print ang sanhi ng paggising ng ESP32. Suriin ang pin at i-print sa display.

// função para imprimir a causa do ESP32 despertarvoid print_wakeup_reason () {esp_sleep_wakeup_cause_t wakup_reason; String dahilan = ""; wakup_reason = esp_sleep_get_wakeup_cause (); // recupera a causa do despertar switch (wakup_reason) {case 1: reason = "EXT0 RTC_IO BTN"; pahinga; case 2: reason = "EXT1 RTC_CNTL"; pahinga; kaso 3: dahilan = "TIMER"; pahinga; kaso 4: dahilan = "TOUCHPAD"; pahinga; kaso 5: dahilan = "ULP PROGRAM"; pahinga; default: reason = "NO DS CAUSE"; pahinga; } Serial.println (dahilan); display.clearLine (6); // apaga a linha 6 do display display.drawString (0, 6, reason.c_str ()); // imprime a causa do despertar no display // se despertou por TOUCHPAD, então vamos verificar em qual dos pinos ocorreu if (wakup_reason == 4) {print_wakeup_touchpad (); // verifica o pino e imprime no display}}

Hakbang 19: Print_wakeup_touchpad (alam ang GPIO Touch)

Ngayon, sa hakbang na ito, mayroon kaming pagpapaandar upang mai-print ang pin na hinawakan. Nakuha namin ang GPIO na gumising sa ESP32 at naka-print ito sa display.

// função para imprimir o pino que foi tocadovoid print_wakeup_touchpad () {touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status (); // recupera o GPIO que despertou o ESP32 String GPIO = ""; lumipat (touchPin) {case 0: GPIO = "4"; pahinga; kaso 1: GPIO = "0"; pahinga; kaso 2: GPIO = "2"; pahinga; kaso 3: GPIO = "15"; pahinga; kaso 4: GPIO = "13"; pahinga; kaso 5: GPIO = "12"; pahinga; kaso 6: GPIO = "14"; pahinga; kaso 7: GPIO = "27"; pahinga; kaso 8: GPIO = "33"; pahinga; kaso 9: GPIO = "32"; pahinga; default: Serial.println ("Wakeup not by touchpad"); pahinga; } Serial.println ("GPIO:" + GPIO); display.clearLine (7); // apaga a linha 7 do display display.drawString (0, 7, "GPIO:"); display.drawString (6, 7, GPIO.c_str ()); // imprime o GPIO}

Hakbang 20: I-download ang Mga File

PDF

INO

Inirerekumendang: