Penggunaan tenaga adalah masalah kritikal bagi peranti yang berjalan secara berterusan untuk jangka masa yang lama tanpa dimatikan. Oleh itu, untuk mengatasi masalah ini hampir setiap alat kawalan dilengkapi dengan mod tidur, yang membantu pembangun merancang alat elektronik untuk penggunaan tenaga yang optimum. Mod tidur meletakkan peranti dalam mod penjimatan kuasa dengan mematikan modul yang tidak digunakan.
Sebelumnya kami telah menerangkan mod tidur dalam pada ESP8266 untuk Penjimatan Kuasa. Hari ini kita akan belajar mengenai Arduino Sleep Modes dan menunjukkan penggunaan kuasa dengan menggunakan Ammeter. Mod Tidur Arduino juga disebut sebagai mod Hemat Kuasa Arduino atau Mod Siaga Arduino.
Mod Tidur Arduino
Mod Tidur membolehkan pengguna menghentikan atau mematikan modul yang tidak digunakan dalam Mikrokontroler yang mengurangkan penggunaan kuasa dengan ketara. Arduino UNO, Arduino Nano dan Pro-mini dilengkapi dengan ATmega328P dan ia mempunyai Pengesan Brown-out (BOD) yang memantau voltan bekalan pada waktu mod tidur.
Terdapat enam mod tidur di ATmega328P:
Untuk memasuki mod tidur apa pun, kita perlu mengaktifkan sleep bit di Sleep Mode Control Register (SMCR.SE). Kemudian mod tidur pilih bit pilih mod tidur antara Idle, pengurangan bunyi ADC, Power-Down, Power-Save, Standby dan External Standby.
Arduino dalaman atau luaran mengganggu atau Reset dapat menghidupkan Arduino dari mod tidur.
Mod Menganggur
Untuk memasuki mod tidur Idle, tulis bit SM pengawal '000'. Mod ini menghentikan CPU tetapi membenarkan SPI, antara muka bersiri 2 wayar, USART, Watchdog, counter, analog analog untuk beroperasi. Mod idle pada dasarnya menghentikan CLK CPU dan CLK FLASH. Arduino dapat dihidupkan setiap saat dengan menggunakan gangguan luaran atau dalaman.
Kod Arduino untuk Mod Tidur Tidak Aktif:
LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
Terdapat perpustakaan untuk menetapkan pelbagai mod kuasa rendah di arduino. Oleh itu, muat turun dan pasang perpustakaan terlebih dahulu dari pautan yang diberikan dan gunakan kod di atas untuk meletakkan Arduino dalam Idle Sleep Mode. Dengan menggunakan kod di atas, Arduino akan tidur selama lapan saat dan bangun secara automatik. Seperti yang anda lihat dalam kod bahawa mod tidak aktif mematikan semua pemasa, SPI, USART, dan TWI (antara muka 2 wayar).
Mod Pengurangan Bunyi ADC
Untuk menggunakan mod tidur ini tuliskan bit SM ke '001'. Mod menghentikan CPU tetapi membenarkan ADC, gangguan luaran, USART, antara muka bersiri 2-wayar, Watchdog, dan kaunter beroperasi. Mod Pengurangan Kebisingan ADC pada dasarnya menghentikan CLK CPU, CLK I / O dan CLK FLASH. Kita boleh menghidupkan pengawal dari mod Pengurangan Kebisingan ADC dengan kaedah berikut:
- Tetapkan Semula Luaran
- Tetapkan Semula Sistem Pengawas
- Mengganggu Pengawas
- Reset Brown-out
- Padanan alamat antara muka bersiri 2 wayar
- Tahap luaran terganggu di INT
- Perubahan pin mengganggu
- Pemasa / Kaunter mengganggu
- SPM / EEPROM sedia mencelah
Mod Turunkan Daya
Mod Power-Down menghentikan semua jam yang dihasilkan dan hanya membenarkan pengoperasian modul tak segerak. Ia boleh diaktifkan dengan menulis bit SM ke '010'. Dalam mod ini, pengayun luaran mati, tetapi antara muka bersiri 2 wayar, pengawas dan gangguan luaran terus beroperasi. Ia boleh dilumpuhkan hanya dengan salah satu kaedah di bawah:
- Tetapkan Semula Luaran
- Tetapkan Semula Sistem Pengawas
- Mengganggu Pengawas
- Reset Brown-out
- Padanan alamat antara muka bersiri 2 wayar
- Tahap luaran terganggu di INT
- Perubahan pin mengganggu
Kod Arduino untuk Mod Berkala Power-Down:
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
Kod tersebut digunakan untuk menghidupkan mod pemadaman. Dengan menggunakan kod di atas, Arduino akan tidur selama lapan saat dan bangun secara automatik.
Kita juga dapat menggunakan mod mati-mati dengan gangguan, di mana Arduino akan tidur tetapi hanya bangun apabila gangguan luaran atau dalaman disediakan.
Kod Arduino untuk Mod Gangguan Power-Down:
gelung kosong () { // Benarkan pin bangun untuk mencetuskan gangguan pada tahap rendah. attachInterrupt (0, bangunUp, RENDAH); LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Lumpuhkan gangguan pin luaran pada pin bangun. detachInterrupt (0); // Lakukan sesuatu di sini }
Mod Jimat Kuasa
Untuk memasuki mod penjimatan kuasa, kita perlu menulis pin SM ke '011'. Mod tidur ini serupa dengan mod mati-mati, hanya dengan satu pengecualian iaitu jika pemasa / penghitung diaktifkan, ia akan tetap dalam keadaan berjalan walaupun pada waktu tidur. Peranti dapat diaktifkan dengan menggunakan limpahan pemasa.
Sekiranya anda tidak menggunakan waktu / penghitung, disarankan untuk menggunakan mod Power-down dan bukannya mode hemat kuasa.
Mod bersedia
Mod siap sedia sama dengan mod Power-Down, satu-satunya perbezaan di antara mereka adalah pengayun luaran yang terus berjalan dalam mod ini. Untuk mengaktifkan mod ini, tulis pin SM ke '110'.
Mod Sedia Dipanjangkan
Mod ini serupa dengan mod hemat kuasa hanya dengan satu pengecualian bahawa pengayun terus berjalan. Peranti akan memasuki mod Sambungan Diperpanjang ketika kita menulis pin SM ke '111'. Peranti akan mengambil masa enam pusingan jam untuk bangun dari mod tunggu sedia.
Berikut adalah syarat untuk projek ini, setelah menyambungkan litar mengikut rajah litar. Muat naik kod mod tidur ke dalam Arduino menggunakan Arduino IDE. Arduino akan memasuki mod tidur yang tidak aktif. Kemudian periksa penggunaan semasa ke dalam ammeter USB. Jika tidak, anda juga boleh menggunakan alat pengapit yang sama.
Komponen Diperlukan
- Arduino UNO
- Sensor Suhu dan Kelembapan DHT11
- Ammeter USB
- Papan roti
- Wayar Penyambung
Untuk mengetahui lebih lanjut mengenai penggunaan DHT11 dengan Arduino, ikuti pautan. Di sini kita menggunakan Ammeter USB untuk mengukur voltan yang digunakan oleh Arduino dalam mod tidur.
Ammeter USB
Ammeter USB adalah peranti plug and play yang digunakan untuk mengukur voltan dan arus dari mana-mana port USB. Dongle terpasang di antara bekalan kuasa USB (port USB komputer) dan peranti USB (Arduino). Peranti ini mempunyai perintang 0.05ohm sejajar dengan pin kuasa di mana ia mengukur nilai arus yang ditarik. Peranti ini dilengkapi dengan empat paparan tujuh segmen, yang dengan serta-merta menampilkan nilai arus dan voltan yang digunakan oleh peranti terpasang. Nilai-nilai ini berubah dalam selang setiap tiga saat.
Spesifikasi:
- Julat voltan operasi: 3.5V hingga 7V
- Peringkat semasa maksimum: 3A
- Saiz padat, senang dibawa
- Tidak perlu bekalan luaran
Permohonan:
- Menguji peranti USB
- Memeriksa tahap beban
- Menyahdayakan pengecas bateri
- Kilang, produk elektronik dan penggunaan peribadi
Rajah Litar
Dalam persediaan di atas untuk menunjukkan mod tidur dalam Arduino, Arduino dipasang ke pemancar USB. Kemudian ammeter USB dipasang ke port USB komputer riba. Pin data sensor DHT11 dilekatkan pada pin D2 Arduino.
Penjelasan Kod
Kod lengkap untuk projek dengan video diberikan pada akhir.
Kod bermula dengan memasukkan perpustakaan untuk sensor DHT11 dan perpustakaan LowPower . Untuk memuat turun perpustakaan Daya Rendah ikuti pautan. Kemudian kami telah menentukan nombor pin Arduino yang mana pin data DHT11 disambungkan dan membuat objek DHT.
#sertakan
Dalam fungsi setup void , kami telah memulai komunikasi bersiri dengan menggunakan serial.begin (9600), di sini 9600 adalah baud rate. Kami menggunakan LED bawaan Arduino sebagai petunjuk untuk mod tidur. Oleh itu, kami telah menetapkan pin sebagai output, dan penulisan digital rendah.
persediaan tidak sah () { Serial.begin (9600); pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, RENDAH); }
Dalam fungsi gelung void , kami membuat LED TINGGI terpasang dan membaca data suhu dan kelembapan dari sensor. Di sini, DHT.read11 (); arahan membaca data dari sensor. Setelah data dikira, kita dapat memeriksa nilainya dengan menyimpannya ke dalam pemboleh ubah apa pun. Di sini, kami telah mengambil dua pemboleh ubah jenis apungan 't' dan 'h' . Oleh itu, data suhu dan kelembapan dicetak secara bersiri pada monitor bersiri.
gelung void () { Serial.println ("Dapatkan Data Dari DHT11"); kelewatan (1000); digitalWrite (LED_BUILTIN, TINGGI); int readData = DHT.read11 (dataPin); // DHT11 float t = Suhu DHT; apungan h = kelembapan DHT; Serial.print ("Suhu ="); Cetakan bersiri (t); Serial.print ("C -"); Serial.print ("Kelembapan ="); Cetakan bersiri (h); Serial.println ("%"); kelewatan (2000);
Sebelum mengaktifkan mod tidur, kami mencetak "Arduino: - Saya akan tidur siang" dan membuat LED Rendah. Selepas itu mod tidur Arduino diaktifkan dengan menggunakan perintah yang disebutkan di bawah dalam kod.
Kod di bawah ini membolehkan mod tidur berkala Arduino yang tidak aktif dan tidur selama lapan saat. Ia menjadikan antara muka ADC, Timer, SPI, USART, 2-wire menjadi keadaan OFF.
Kemudian secara automatik bangun Arduino dari tidur setelah 8 saat dan mencetak "Arduino: - Hei saya baru bangun".
Serial.println ("Arduino: - Saya akan tidur siang"); kelewatan (1000); digitalWrite (LED_BUILTIN, RENDAH); LowPower.idle (SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF); Serial.println ("Arduino: - Hai saya baru bangun"); Serial.println (""); kelewatan (2000); }
Oleh itu, dengan menggunakan kod ini Arduino hanya akan bangun selama 24 saat dalam satu minit dan akan tetap dalam mod tidur selama 36 saat yang lain, yang secara signifikan mengurangkan daya yang digunakan oleh stesen cuaca Arduino.
Oleh itu, jika kita menggunakan Arduino dengan mod tidur, kita dapat menggandakan masa berjalan peranti.