- Persyaratan
- ESP32 Diagram Sirkuit Mode Tidur
- Gambaran Umum Mode Tidur di ESP32
- Pemrograman ESP32 untuk Mode Tidur Pulas
- Menguji ESP32 dalam Mode Tidur Pulas
ESP32 adalah salah satu modul mikrokontroler berbasis Wi-Fi paling populer dan merupakan pilihan populer di banyak Aplikasi IoT Portabel. Ini adalah pengontrol yang kuat yang mendukung Pemrograman Inti Ganda dan juga memiliki dukungan Bluetooth Low Energy (BLE) built-in sehingga menjadi pilihan yang baik untuk aplikasi portabel seperti di perangkat iBeacon, Pelacak GPS, dll. Namun, dalam aplikasi bertenaga baterai seperti ini, perhatian utama adalah cadangan baterai. Cadangan baterai ini dapat ditingkatkan dengan kontrol yang lebih cerdas atas unit mikrokontroler seperti seseorang dapat memprogram ESP32 dalam mode tidur selama kondisi ideal untuk meningkatkan cadangan baterai perangkat.
Dalam proyek ini, kami akan memeriksa konsumsi saat ini dari unit mikrokontroler ESP32 berkemampuan Wi-Fi dan Bluetooth yang sangat populer dalam mode kerja normal dan mode tidur nyenyak. Juga, kami akan menguji perbedaannya dan memeriksa cara menempatkan ESP32 dalam mode tidur nyenyak. Anda juga dapat melihat artikel tentang cara meminimalkan konsumsi daya di mikrokontroler untuk tip lain yang dapat digunakan untuk membuat desain Anda jauh lebih hemat daya. Selanjutnya, jika Anda tertarik dengan mode tidur mikrokontroler lain, Anda dapat melihat mode Tidur Arduino dan mode Tidur NodeMCU ESP8266 juga.
Persyaratan
Untuk melakukan ini, kami akan menggunakan Devkit V4.0 berbasis ESP32 dari Espressif yang memiliki jembatan USB ke UART serta pinout ESP32 lainnya untuk kemudahan koneksi. Pemrograman akan dilakukan dengan Arduino IDE. Jika Anda benar-benar baru, maka untuk Memulai ESP32 menggunakan Arduino, baca artikel yang ditautkan sebelum Anda melanjutkan.
Persyaratan proyek ini adalah sebagai berikut-
- Ini akan masuk ke mode tidur nyenyak dengan menekan sebuah tombol.
- Ini akan bangun dari mode tidur nyenyak dengan menekan tombol lain.
- Untuk mendeteksi status ESP32, LED akan berkedip dengan waktu nyala 1000 milidetik. Selama mode tidur, itu akan dimatikan.
Oleh karena itu, diperlukan komponen tambahan-
- LED - 1 buah
- Tombol tekan (Sakelar taktil) - 2 buah
- Resistor 4,7k - 2 pcs
- Resistor 680R - 1 pc
- Papan tempat memotong roti
- Hubungkan kabel
- Adaptor 5V atau unit catu daya
- Kabel mikro-USB
- Arduino IDE dengan antarmuka pemrograman ESP32 di PC atau Laptop.
ESP32 Diagram Sirkuit Mode Tidur
Skema untuk mengaktifkan ESP32 dengan menekan tombol ditampilkan di bawah ini.
Skema ini cukup sederhana. Ini memiliki dua tombol. Tombol tidur akan membuat ESP32 dalam mode tidur nyenyak dan sakelar lain digunakan untuk membangunkan ESP32 dari mode tidur. Kedua tombol terhubung dalam PIN 16 dan PIN 33. Kedua tombol dikonfigurasi sebagai aktif rendah saat ditekan, oleh karena itu tarik tambahan diberikan. Namun, untuk mendeteksi apakah ESP 32 dalam mode sleep atau mode kondisi kerja normal, LED dihubungkan ke IO Pin 4.
Gambaran Umum Mode Tidur di ESP32
Ada banyak mode daya yang berbeda untuk ESP32, yaitu mode aktif, mode tidur modem, mode tidur ringan, mode tidur lelap, dan mode hibernasi.
Selama kondisi kerja normal, ESP32 berjalan pada mode aktif. Selama mode aktif ESP32, CPU, perangkat keras WiFi / BT, memori RTC, dan periferal RTC, prosesor bersama ULP, semuanya diaktifkan dan bekerja tergantung pada beban kerja. Namun, pada mode daya yang berbeda, satu atau lebih periferal dimatikan. Untuk memeriksa operasi mode daya yang berbeda, ikuti tabel di bawah ini-
Perangkat keras |
Mode Aktif |
Modem-mode tidur |
Mode Tidur Ringan |
Mode Tidur Nyenyak |
Hibernasi |
CPU |
DI |
DI |
BERHENTI SEBENTAR |
MATI |
MATI |
WiFi / BT |
DI |
MATI |
MATI |
MATI |
MATI |
Periferal RTC dan RTC |
DI |
DI |
DI |
DI |
MATI |
Prosesor ULP-Co |
DI |
DI |
DI |
AKTIF / NONAKTIF |
MATI |
Seperti yang dapat kita lihat pada tabel di atas bahwa dalam mode tidur nyenyak 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 diaktifkan.
Selama situasi bangun, ESP32 perlu diberi tahu oleh sumber bangun yang akan membangunkan ESP32 dari mode tidur nyenyak. Namun, karena periferal RTC dihidupkan, ESP32 dapat dibangunkan melalui GPIO berkemampuan RTC. Ada pilihan lain juga. Ini dapat dibangunkan melalui pin interupsi bangun eksternal atau menggunakan timer untuk membangunkan ESP32. Dalam proyek ini, kami menggunakan ext0 wakeup pada pin 33.
Pemrograman ESP32 untuk Mode Tidur Pulas
Program lengkapnya dapat ditemukan di bagian bawah halaman ini. Ini ditulis untuk Arduino IDE dan karenanya dapat dengan mudah disesuaikan dengan kebutuhan Anda. Penjelasan kode tersebut adalah sebagai berikut.
Di awal kode, // Buat variabel PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // tentukan Pin Led uint8_t led_pin = GPIO_NUM_4; // tentukan pin bangun uint8_t wakeUp_pin = GPIO_NUM_33;
Tiga baris di atas menentukan pin pengaktifan, pin LED, dan pin mode tidur.
void setup () { // letakkan kode setup Anda di sini, untuk dijalankan sekali: // setel port serial di 115200 Serial.begin (115200); penundaan (1000); // setel pin pushButton sebagai masukan dengan pinMode PullUp internal (pushBtn.pin, INPUT_PULLUP); // setel Interrupt handler dengan pin pushButton dalam mode Falling attachInterrupt (pushBtn.pin, isr_handle, FALLING); // setel pin Led sebagai ouput pinMode (led_pin, OUTPUT); // buat tugas yang akan dijalankan dalam fungsi blinkLed (), dengan prioritas 1 dan dijalankan pada inti 0 xTaskCreate ( blinkLed, / * Fungsi tugas. * / "blinkLed", / * nama tugas. * / 1024 * 2, / * Ukuran tumpukan tugas * / NULL, / * parameter tugas * / 5, / * prioritas tugas * / & taskBlinkled); / * Pegangan tugas untuk melacak tugas yang dibuat * / penundaan (500); // Konfigurasikan Pin 33 sebagai sumber bangun ext0 dengan tingkat logika LOW esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
Di atas, interupsi diatur ke mode jatuh oleh cuplikan kode
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Oleh karena itu, setiap kali sakelar ditekan, level logika akan berubah dari logika 1 (3,3V) menjadi logika 0 (0V). Tegangan pin tombol akan turun dan ESP32 akan mengidentifikasi bahwa sakelar ditekan. Ada juga tugas yang dibuat untuk mengedipkan LED.
xTaskCreate ( blinkLed, / * Fungsi tugas . * / "blinkLed", / * nama tugas. * / 1024 * 2, / * Ukuran tumpukan tugas * / NULL, / * parameter tugas * / 5, / * prioritas tugas * / & taskBlinkled); / * Pegangan tugas untuk melacak tugas yang dibuat * / penundaan (500);
Pin 33 juga dikonfigurasi menggunakan potongan kode di bawah ini sebagai sumber bangun eksternal yang diidentifikasi sebagai ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Selanjutnya, di while loop-
void loop () { // letakkan kode utama Anda di sini, untuk menjalankan berulang kali: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Tangguhkan Tugas 'blinkLed' \ n"); // Tangguhkan vTaskSuspend Tugas blinkLed (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Pergi tidur….. \ n", pushBtn.pin); pushBtn.pressed = salah; // Tidurlah sekarang 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 ("menggunakan sinyal eksternal ext0 untuk WakeUp From sleep"); istirahat; case ESP_SLEEP_WAKEUP_EXT1: Serial.println ("menggunakan sinyal eksternal ext1 untuk Bangun Dari tidur"); istirahat; case ESP_SLEEP_WAKEUP_TIMER: Serial.println ("menggunakan sinyal Timer untuk Bangun Dari tidur"); istirahat; case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("menggunakan sinyal TouchPad untuk Bangun Dari tidur"); istirahat; case ESP_SLEEP_WAKEUP_ULP: Serial.println ("menggunakan sinyal ULP untuk WakeUp From sleep"); istirahat; default: istirahat; Serial.printf ("Lanjutkan Tugas 'blinkLed' \ n"); // restart vTaskResume Tugas blinkLed (taskBlinkled); } }
Loop sementara terus memeriksa apakah tombol tidur ditekan atau tidak. Jika tombol ditekan, itu akan menghentikan atau menangguhkan tugas kedip LED dan menjalankan fungsi esp dalam tidur mulai-
esp_deep_sleep_start ();
Dalam situasi ini, jika tombol interupsi eksternal ext0 ditekan, ia akan segera bangun dari mode tidur nyenyak, dan melanjutkan tugas kedip yang dipimpin.
Terakhir, fungsi kedip LED bisa dilihat pada cuplikan di bawah ini, ini akan mengedipkan LED 1000 ms detik.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // ubah nilai pin pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Cukup alihkan LED setiap 1000ms atau 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Menguji ESP32 dalam Mode Tidur Pulas
Sirkuit ini dibuat di papan tempat memotong roti dan multimeter edisi Metravi XB digunakan untuk mengukur arus. Arus yang ditarik oleh rangkaian dalam mode aktif hampir 58 mA tetapi dalam mode tidur nyenyak, arusnya hampir 4,10 mA. Gambar di bawah ini menunjukkan konsumsi mode aktif ESP32 saat ini -
Dalam mode tidur lelap, konsumsi saat ini direkam turun menjadi sekitar 3,95mA, gambar di bawah ini menunjukkan Konsumsi Arus Mode Tidur Pulas ESP32-
Namun, dalam mode tidur nyenyak, konsumsi ESP32 saat ini hampir 150 uA. Tetapi konsumsi arus yang tercatat untuk papan Devkit ESP32 ini hampir 4,10 mA. Ini karena CP2102 dan Regulator Linear. Keduanya terhubung ke saluran listrik 5V. Ada juga LED daya yang tersambung ke saluran listrik yang mengonsumsi arus hampir 2mA.
Oleh karena itu, dapat dengan mudah diidentifikasi bahwa ESP32 mengkonsumsi jumlah energi yang sangat rendah dalam kondisi mode tidur nyenyak yang sangat berguna untuk pengoperasian bertenaga baterai. Untuk informasi lebih lanjut tentang cara kerjanya, lihat video yang ditautkan di bawah ini. Jika Anda memiliki pertanyaan, tinggalkan di bagian komentar di bawah atau gunakan Forum kami untuk pertanyaan teknis lainnya.