Konsumsi daya adalah masalah kritis untuk perangkat yang terus berjalan dalam waktu lama tanpa dimatikan. Jadi untuk mengatasi masalah ini hampir setiap pengontrol dilengkapi dengan mode tidur, yang membantu pengembang merancang gadget elektronik untuk konsumsi daya yang optimal. Mode tidur menempatkan perangkat dalam mode hemat daya dengan mematikan modul yang tidak digunakan.
Sebelumnya kami telah menjelaskan mode Deep-sleep di ESP8266 untuk Penghematan Daya. Hari ini kita akan belajar tentang Mode Tidur Arduino dan mendemonstrasikan konsumsi daya dengan menggunakan Ammeter. Mode Tidur Arduino juga disebut mode Hemat Daya Arduino atau Mode Siaga Arduino.
Mode Tidur Arduino
Mode Tidur memungkinkan pengguna untuk menghentikan atau mematikan modul yang tidak digunakan di Mikrokontroler yang secara signifikan mengurangi konsumsi daya. Arduino UNO, Arduino Nano dan Pro-mini hadir dengan ATmega328P dan memiliki Brown-out Detector (BOD) yang memonitor tegangan suplai pada saat mode tidur.
Ada enam mode tidur di ATmega328P:
Untuk masuk ke salah satu mode tidur, kita perlu mengaktifkan bit tidur dalam Register Kontrol Mode Tidur (SMCR.SE). Kemudian bit pilih sleep mode pilih sleep mode antara Idle, ADC noise reduction, Power-Down, Power-Save, Standby dan External Standby.
Interupsi Arduino internal atau eksternal atau Reset dapat membangunkan Arduino dari mode tidur.
Mode siaga
Untuk memasuki mode tidur Idle, tulis bit SM dari pengontrol '000'. Mode ini menghentikan CPU tetapi memungkinkan SPI, antarmuka serial 2-kabel, USART, Watchdog, counter, pembanding analog untuk beroperasi. Modus siaga pada dasarnya menghentikan CLK CPU dan CLK FLASH. Arduino dapat dibangunkan kapan saja dengan menggunakan interupsi eksternal atau internal.
Kode Arduino untuk Mode Tidur Idle:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Ada perpustakaan untuk mengatur berbagai mode daya rendah di Arduino. Jadi pertama unduh dan instal pustaka dari tautan yang diberikan dan gunakan kode di atas untuk menempatkan Arduino dalam Mode Tidur Idle. Dengan menggunakan kode di atas, Arduino akan tidur selama delapan detik dan bangun secara otomatis. Seperti yang Anda lihat di kode bahwa mode idle mematikan semua timer, SPI, USART, dan TWI (antarmuka 2-kabel).
Mode Pengurangan Noise ADC
Untuk menggunakan mode tidur ini tulis bit SM ke '001'. Mode ini menghentikan CPU tetapi mengizinkan ADC, interupsi eksternal, USART, antarmuka serial 2-kabel, Watchdog, dan penghitung untuk beroperasi. Mode Pengurangan Noise ADC pada dasarnya menghentikan CLK CPU, CLK I / O dan CLK FLASH. Kita dapat membangunkan pengontrol dari mode Pengurangan Noise ADC dengan metode berikut:
- Reset Eksternal
- Pengaturan Ulang Sistem Pengawas
- Pengawas Interupsi
- Brown-out Reset
- Pertandingan alamat Antarmuka Serial 2 kabel
- Interupsi level eksternal pada INT
- Interupsi pergantian pin
- Timer / Penghitung interupsi
- SPM / EEPROM siap mengganggu
Mode Power-Down
Mode Power-Down menghentikan semua jam yang dihasilkan dan hanya memungkinkan pengoperasian modul asynchronous. Ini dapat diaktifkan dengan menulis bit SM ke '010'. Dalam mode ini, osilator eksternal MATI, tetapi antarmuka serial 2 kabel, pengawas, dan interupsi eksternal terus beroperasi. Ini dapat dinonaktifkan hanya dengan salah satu metode di bawah ini:
- Reset Eksternal
- Pengaturan Ulang Sistem Pengawas
- Pengawas Interupsi
- Brown-out Reset
- Pertandingan alamat Antarmuka Serial 2 kabel
- Interupsi level eksternal pada INT
- Interupsi pergantian pin
Kode Arduino untuk Mode Periodik Power-Down:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Kode tersebut digunakan untuk menghidupkan mode power-down. Dengan menggunakan kode di atas, Arduino akan tidur selama delapan detik dan bangun secara otomatis.
Kami juga dapat menggunakan mode power-down dengan interupsi, di mana Arduino akan tidur tetapi hanya bangun ketika interupsi eksternal atau internal disediakan.
Kode Arduino untuk Mode Interupsi Power-Down:
void loop () { // Izinkan pin pengaktifan memicu interupsi di posisi rendah. attachmentInterrupt (0, wakeUp, LOW); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Nonaktifkan interupsi pin eksternal pada pin pengaktifan. detachInterrupt (0); // Lakukan sesuatu di sini }
Mode Hemat Daya
Untuk masuk ke mode hemat daya kita perlu menulis pin SM ke '011'. Mode sleep ini mirip dengan mode power-down, hanya dengan satu pengecualian yaitu jika penghitung waktu / penghitung diaktifkan, ia akan tetap dalam status berjalan bahkan pada saat tidur. Perangkat dapat dibangunkan dengan menggunakan timer overflow.
Jika Anda tidak menggunakan waktu / penghitung, disarankan untuk menggunakan mode Power-down daripada mode hemat daya.
Modus siaga
Modus siaga identik dengan mode Power-Down, satu-satunya perbedaan di antara mereka adalah osilator eksternal tetap berjalan dalam mode ini. Untuk mengaktifkan mode ini tulis pin SM ke '110'.
Mode Siaga Diperpanjang
Mode ini mirip dengan mode hemat daya hanya dengan satu pengecualian bahwa osilator tetap berjalan. Perangkat akan masuk ke mode Extended Standby saat kita menulis pin SM ke '111'. Perangkat akan membutuhkan enam siklus jam untuk bangun dari mode siaga yang diperpanjang.
Di bawah ini adalah persyaratan untuk proyek ini, setelah menghubungkan rangkaian sesuai diagram rangkaian. Unggah kode mode tidur ke Arduino menggunakan Arduino IDE. Arduino akan masuk ke mode tidur idle. Kemudian periksa konsumsi arus ke ammeter USB. Selain itu, Anda juga dapat menggunakan pengukur penjepit untuk hal yang sama.
Komponen Diperlukan
- Arduino UNO
- DHT11 Sensor Suhu dan Kelembaban
- Ammeter USB
- Papan tempat memotong roti
- Menghubungkan Kabel
Untuk mempelajari lebih lanjut tentang menggunakan DHT11 dengan Arduino, ikuti tautannya. Di sini kami menggunakan USB Ammeter untuk mengukur tegangan yang dikonsumsi oleh Arduino dalam mode tidur.
Ammeter USB
Ammeter USB adalah perangkat plug and play yang digunakan untuk mengukur tegangan dan arus dari port USB apa pun. Dongle dicolokkan di antara catu daya USB (port USB komputer) dan perangkat USB (Arduino). Perangkat ini memiliki resistor 0.05ohm sejajar dengan pin daya yang digunakan untuk mengukur nilai arus yang ditarik. Perangkat ini hadir dengan empat layar tujuh segmen, yang langsung menampilkan nilai arus dan tegangan yang dikonsumsi oleh perangkat yang terpasang. Nilai-nilai ini membalik dalam interval setiap tiga detik.
Spesifikasi:
- Rentang tegangan operasi: 3.5V hingga 7V
- Peringkat maksimum saat ini: 3A
- Ukuran kompak, mudah dibawa
- Tidak ada pasokan eksternal yang dibutuhkan
Aplikasi:
- Menguji perangkat USB
- Memeriksa tingkat beban
- Debugging pengisi daya baterai
- Pabrik, produk elektronik dan penggunaan pribadi
Diagram Sirkuit
Dalam pengaturan di atas untuk mendemonstrasikan mode tidur Arduino Deep, Arduino dicolokkan ke amperemeter USB. Kemudian ammeter USB dicolokkan ke port USB laptop. Pin data dari sensor DHT11 dipasang pada pin D2 Arduino.
Penjelasan Kode
Kode lengkap untuk proyek dengan video diberikan di bagian akhir.
Kode dimulai dengan memasukkan pustaka untuk sensor DHT11 dan pustaka LowPower . Untuk mengunduh pustaka Daya Rendah, ikuti tautannya. Kemudian kami telah menentukan nomor pin Arduino tempat pin data DHT11 terhubung dan membuat objek DHT.
#include
Pada fungsi void setup , komunikasi serial sudah dimulai dengan menggunakan serial.begin (9600), disini 9600 adalah baud rate. Kami menggunakan LED bawaan Arduino sebagai indikator untuk mode tidur. Jadi, kami telah menetapkan pin sebagai output, dan tulis digital rendah.
void setup () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); }
Dalam fungsi void loop , kami membuat LED bawaan TINGGI dan membaca data suhu dan kelembaban dari sensor. Di sini, DHT.read11 (); perintah membaca data dari sensor. Setelah data dihitung, kita dapat memeriksa nilainya dengan menyimpannya ke dalam variabel apa pun. Di sini, kami telah mengambil dua variabel tipe float 't' dan 'h' . Karenanya, data suhu dan kelembaban dicetak secara berseri pada monitor serial.
void loop () { Serial.println ("Dapatkan Data Dari DHT11"); penundaan (1000); digitalWrite (LED_BUILTIN, HIGH); int readData = DHT.read11 (dataPin); // DHT11 float t = DHT.temperature; float h = DHT. kelembaban; Serial.print ("Suhu ="); Cetak serial (t); Serial.print ("C -"); Serial.print ("Kelembaban ="); Cetak serial (h); Serial.println ("%"); penundaan (2000);
Sebelum mengaktifkan mode tidur kami mencetak "Arduino: - Saya akan tidur siang" dan membuat LED Rendah bawaan. Setelah itu mode sleep Arduino diaktifkan dengan menggunakan perintah yang disebutkan di bawah ini pada kode.
Kode di bawah ini memungkinkan mode sleep periodik idle dari Arduino dan memberikan tidur delapan detik. Ini mengubah antarmuka ADC, Timer, SPI, USART, 2-kabel menjadi kondisi OFF.
Kemudian secara otomatis membangunkan Arduino dari tidur setelah 8 detik dan mencetak “Arduino: - Hey I just Woke up”.
Serial.println ("Arduino: - Saya akan tidur siang"); penundaan (1000); digitalWrite (LED_BUILTIN, LOW); LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF); Serial.println ("Arduino: - Hei, Aku Baru Bangun"); Serial.println (""); penundaan (2000); }
Jadi dengan menggunakan kode ini, Arduino hanya akan bangun selama 24 detik dalam satu menit dan akan tetap dalam mode tidur selama 36 detik, yang secara signifikan mengurangi daya yang dikonsumsi oleh stasiun cuaca Arduino.
Oleh karena itu, jika kita menggunakan Arduino dengan mode tidur, kita kira-kira dapat menggandakan runtime perangkat.