- Keperluan
- Diagram Litar Mod Tidur ESP32
- Gambaran Keseluruhan Kaedah Tidur di ESP32
- Pengaturcaraan ESP32 untuk Mod Tidur Dalam
- Menguji ESP32 dalam Mod Tidur Dalam
ESP32 adalah salah satu modul mikrokontroler berasaskan Wi-Fi yang paling popular dan ia adalah pilihan yang popular di banyak Aplikasi IoT Portable. Ia adalah pengawal yang kuat yang menyokong Pengaturcaraan Teras Dwi dan juga mempunyai sokongan Tenaga Rendah Bluetooth (BLE) yang terpasang menjadikannya pilihan yang baik untuk aplikasi mudah alih seperti dalam peranti iBeacon, Penjejak GPS, dll. Walau bagaimanapun, dalam aplikasi berkuasa Bateri seperti ini, kebimbangan utama adalah sandaran bateri. Sandaran bateri ini dapat ditingkatkan dengan kawalan yang lebih pintar ke atas unit mikrokontroler seperti yang dapat diprogramkan ESP32 dalam mod tidur dalam keadaan ideal untuk meningkatkan sandaran bateri peranti.
Dalam projek ini, kami akan memeriksa penggunaan semasa unit mikrokontroler ESP32 yang didayakan Wi-Fi dan Bluetooth yang popular dalam mod kerja biasa dan mod tidur nyenyak. Juga, kami akan menguji perbezaannya dan memeriksa cara meletakkan ESP32 dalam mod tidur nyenyak. Anda juga boleh melihat artikel tentang cara meminimumkan penggunaan kuasa di mikrokontroler untuk petua lain yang boleh digunakan untuk menjadikan reka bentuk anda lebih cekap tenaga. Tambahan pula, jika anda berminat dengan mod tidur mikrokontroler lain, anda boleh melihat mod Tidur Arduino dan mod Tidur NodeMCU ESP8266 juga.
Keperluan
Untuk melakukan ini, kami akan menggunakan Devkit V4.0 berasaskan ESP32 dari Espressif yang mempunyai jambatan USB ke UART serta pinout ESP32 lain untuk sambungan yang mudah. Pengaturcaraan akan dilakukan dengan Arduino IDE. Sekiranya anda benar-benar baru, maka untuk Bermula dengan ESP32 menggunakan Arduino, baca artikel yang dipautkan sebelum anda meneruskan.
Keperluan projek ini adalah berikut-
- Ia akan masuk ke mod tidur dalam dengan menekan butang.
- Ia akan bangun dari mod tidur nyenyak dengan menekan butang lain.
- Untuk mengesan keadaan ESP32, LED akan berkelip dengan waktu menghidupkan 1000 milisaat. Semasa mod tidur, ia akan dimatikan.
Oleh itu, komponen tambahan diperlukan-
- LED - 1 pc
- Tombol tekan (Suis taktil) - 2 buah
- Perintang 4.7k - 2 keping
- Perintang 680R - 1 pc
- Papan roti
- Memasang wayar
- Penyesuai 5V atau unit bekalan kuasa
- Kabel USB mikro
- Arduino IDE dengan antara muka pengaturcaraan ESP32 dalam PC atau Laptop.
Diagram Litar Mod Tidur ESP32
Skema untuk meletakkan ESP32 untuk tidur di atas dengan butang push ditunjukkan di bawah.
Skematiknya cukup mudah. Ia mempunyai dua butang. Butang tidur akan meletakkan ESP32 dalam mod tidur dalam dan suis lain digunakan untuk menghidupkan ESP32 dari mod tidur. Kedua-dua butang disambungkan dalam PIN 16 dan PIN 33. Kedua-dua butang dikonfigurasikan sebagai rendah aktif ketika ditekan, oleh itu diberikan penambahan tambahan. Walau bagaimanapun, untuk mengesan sama ada ESP 32 berada dalam mod tidur atau mod keadaan kerja biasa, LED disambungkan ke IO Pin 4.
Gambaran Keseluruhan Kaedah Tidur di ESP32
Terdapat banyak mod daya yang berbeza untuk ESP32, iaitu mod aktif, mod tidur modem, mod tidur ringan, mod tidur dalam, dan mod hibernasi.
Semasa keadaan kerja biasa, ESP32 berjalan dalam mod aktif. Semasa mod aktif ESP32, CPU, perkakasan WiFi / BT, memori RTC, dan periferal RTC, pemproses bersama ULP, semuanya diaktifkan dan berfungsi bergantung pada beban kerja. Walau bagaimanapun, pada mod kuasa yang berbeza, satu atau lebih periferal dimatikan. Untuk memeriksa operasi mod kuasa yang berbeza, ikuti jadual di bawah-
Perkakasan |
Mod Aktif |
Mod tidur modem |
Mod Tidur Ringan |
Mod tidur nyenyak |
Hibernasi |
CPU |
HIDUP |
HIDUP |
Jeda |
MATI |
MATI |
WiFi / BT |
HIDUP |
MATI |
MATI |
MATI |
MATI |
Persisian RTC dan RTC |
HIDUP |
HIDUP |
HIDUP |
HIDUP |
MATI |
Pemproses ULP-Co |
HIDUP |
HIDUP |
HIDUP |
HIDUP / MATI |
MATI |
Seperti yang dapat kita lihat dalam jadual di atas bahawa dalam mod tidur dalam ESP32 yang sering disebut sebagai pola pemantauan sensor ULP - CPU, WiFi / BT, memori RTC dan periferal, semua prosesor ULP dimatikan. Hanya memori RTC dan periferal RTC yang dihidupkan.
Semasa keadaan bangun, ESP32 perlu diberitahu oleh sumber bangun yang akan membangunkan ESP32 dari mod tidur nyenyak. Namun, kerana periferal RTC dihidupkan, ESP32 dapat bangun melalui GPIO yang diaktifkan RTC. Terdapat pilihan lain juga. Ia boleh bangun melalui pin gangguan bangun dari luar atau menggunakan pemasa untuk membangunkan ESP32. Dalam projek ini, kami menggunakan bangun tidur ext0 pada pin 33.
Pengaturcaraan ESP32 untuk Mod Tidur Dalam
Program lengkap boleh didapati di bahagian bawah halaman ini. Ia ditulis untuk Arduino IDE dan dengan itu dapat disesuaikan dengan mudah dengan keperluan anda. Penjelasan kodnya adalah seperti berikut.
Pada awal kod, // Buat pemboleh ubah PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // tentukan Pin Led uint8_t led_pin = GPIO_NUM_4; // tentukan pin bangun uint8_t bangunUp_pin = GPIO_NUM_33;
Tiga baris di atas menentukan pin bangun, pin LED, dan pin mod tidur.
batal persediaan () { // masukkan kod persediaan anda di sini, untuk dijalankan sekali: // tetapkan port bersiri pada 115200 Serial.begin (115200); kelewatan (1000); // tetapkan pin pushButton sebagai input dengan PullUp pinMode dalaman (pushBtn.pin, INPUT_PULLUP); // tetapkan pengendali Interrupt dengan pin pushButton dalam Falling mode attachInterrupt (pushBtn.pin, isr_handle, FALLING); // tetapkan pin Led sebagai ouput pinMode (led_pin, OUTPUT); // buat tugas yang akan dijalankan dalam fungsi blinkLed (), dengan keutamaan 1 dan dilaksanakan pada inti 0 xTaskCreate ( blinkLed, / * Fungsi tugas. * / "blinkLed", / * nama tugas. * / 1024 * 2, / * Tumpukan ukuran tugas * / NULL, / * parameter tugas * / 5, / * keutamaan tugas * / & taskBlinkled); / * Pemegang tugas untuk mengawasi tugas yang dibuat * / kelewatan (500); // Konfigurasikan Pin 33 sebagai sumber bangun ext0 dengan tahap logik yang RENDAH esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
Di atas, gangguan diatur ke mod jatuh oleh coretan kod
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Oleh itu, setiap kali suis ditekan, tahap logik akan berubah dari logik 1 (3.3V) menjadi logik 0 (0V). Voltan pin butang akan jatuh dan ESP32 akan mengenal pasti bahawa suis ditekan. Terdapat juga tugas yang dibuat untuk mengedipkan LED.
xTaskCreate ( fungsi blinkLed, / *. * / "blinkLed", / * nama tugas. * / 1024 * 2, / * Ukuran tumpukan tugas * / NULL, / * parameter tugas * / 5, / * keutamaan tugas * / & taskBlinkled); / * Pemegang tugas untuk mengawasi tugas yang dibuat * / kelewatan (500);
Pin 33 juga dikonfigurasi menggunakan coretan kod di bawah sebagai sumber bangun luar yang dikenal pasti sebagai ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) bangunUp_pin, 0);
Seterusnya, dalam gelung sementara-
gelung void () { // letakkan kod utama anda di sini, untuk dijalankan berulang kali: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Ditekan \ n", pushBtn.pin); Serial.printf ("Tangguhkan Tugas 'blinkLed' \ n"); // Suspend the blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, RENDAH); Serial.printf ("Akan tidur….. \ n", pushBtn.pin); pushBtn.pressed = salah; // Pergi tidur sekarang esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); beralih (wakeupReason) { kes ESP_SLEEP_WAKEUP_EXT0: Serial.println ("menggunakan ext0 isyarat luaran untuk WakeUp From sleep"); rehat; kes ESP_SLEEP_WAKEUP_EXT1: Serial.println ("menggunakan ext1 isyarat luaran untuk WakeUp From sleep"); rehat; kes ESP_SLEEP_WAKEUP_TIMER: Serial.println ("menggunakan isyarat Pemasa untuk WakeUp Dari tidur"); rehat; kes ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("menggunakan isyarat TouchPad untuk WakeUp From sleep"); rehat; kes ESP_SLEEP_WAKEUP_ULP: Serial.println ("menggunakan isyarat ULP untuk WakeUp From sleep"); rehat; lalai: rehat; Serial.printf ("Sambung semula Tugas 'blinkLed' \ n"); // mulakan semula BlinkLed Task vTaskResume (taskBlinkled); } }
Gelung sementara sentiasa memeriksa sama ada butang tidur ditekan atau tidak. Sekiranya butang ditekan, ia akan menghentikan atau menangguhkan tugas berkelip LED dan menjalankan fungsi permulaan tidur nyenyak-
esp_deep_sleep_start ();
Dalam keadaan ini, jika butang gangguan luaran ext0 ditekan, ia akan segera bangun dari mod tidur dalam, dan menyambung semula tugas berkedip yang dipimpin.
Terakhir, fungsi kedipan LED dapat dilihat pada coretan di bawah, ia akan berkelip LED 1000 ms saat.
void blinkLed (void * param) { sementara (1) { static uint32_t pin_val = 0; // togol nilai pin pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Cukup togel LED setiap 1000ms atau 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Menguji ESP32 dalam Mod Tidur Dalam
Litar ini dibina di papan roti dan multimeter edisi Metravi XB digunakan untuk mengukur arus. Arus yang dilukis oleh litar dalam mod aktif hampir 58 mA tetapi dalam mod tidur dalam, arus hampir 4.10 mA. Gambar di bawah menunjukkan penggunaan semasa mod aktif ESP32 -
Dalam mod tidur nyenyak, penggunaan semasa dicatatkan turun ke sekitar 3.95mA, gambar di bawah menunjukkan Penggunaan Mod Tidur Sedang ESP32-
Walau bagaimanapun, dalam mod tidur nyenyak, penggunaan semasa ESP32 hampir 150 uA. Tetapi penggunaan semasa yang direkodkan untuk papan Devkit ESP32 ini hampir 4.10 mA. Ini disebabkan oleh CP2102 dan Linear Regulator. Kedua-duanya dihubungkan ke talian kuasa 5V. Terdapat juga LED kuasa yang disambungkan dalam talian kuasa yang menggunakan hampir 2mA arus.
Oleh itu, dapat diketahui dengan mudah bahawa ESP32 menggunakan jumlah tenaga yang sangat rendah dalam keadaan mod tidur nyenyak yang sangat berguna untuk operasi berkuasa bateri. Untuk maklumat lebih lanjut mengenai cara kerjanya, lihat video yang dipautkan di bawah. Sekiranya anda mempunyai sebarang pertanyaan, tinggalkan di bahagian komen di bawah atau gunakan Forum kami untuk soalan teknikal yang lain.