Pengingat Ulang Tahun Berbasis Arduino: Solusi Tahan 50 Tahun
Komponen dan Perlengkapan
- Arduino Nano R3 – 1 unit
- Intersil ISL1208 RTC – 1 unit
- Baterai Koin Renata CR2450N – 1 unit
- Modul USB to Serial CP2102 – 1 unit
- Programmer USBasp – 1 unit
- Kristal 32.768 KHz – 1 unit
- Saklar SPST – 1 unit
- LED SMD – 1 unit
- Dome LED Jernih – 1 unit
- Kotak Saklar 4" x 4" – 1 unit
- Perfboard – 1 unit
- Konektor Berg (M dan F) – 1 unit
- Resistor 4.75k ohm – 3 unit
- Resistor 10k ohm – 2 unit
Alat dan Mesin yang Diperlukan
Aplikasi dan Layanan Online
Tentang Proyek Ini
Ya, Anda membaca judul dengan benar. Pernahkah Anda lupa ulang tahun Anda, sehingga Anda memerlukan orang lain untuk mengingatkan Anda tentang hal itu? Atau bagaimana jika Anda dapat memberikan hadiah kepada seseorang yang Anda cintai, sebuah perangkat yang akan mengucapkan selamat ulang tahun kepada mereka selama 50 kali? Saya tidak berbohong, Peringatan Ulang Tahun Berbasis Arduino sederhana ini yang berjalan pada satu baterai koin CR2450 dapat mengucapkan selamat ulang tahun kepada orang-orang yang Anda cintai (atau diri Anda sendiri) selama 50 tahun, sebelum baterai habis.
Saya pikir ini adalah pertama kalinya seseorang membuat alarm ulang tahun seperti ini, karena saya mencoba mencari proyek serupa tetapi tidak menemukan apa-apa. Proyek ini juga tersedia di situs web proyek pribadi saya di - https://www.vishnumaiea.in/projects/hardware/birthday-reminder-device-that-will-run-for-50-years-on-a-coin-cell
Saya membuat ini sebagai bagian dari Hackaday Coin Cell Challenge. Ide alarm ulang tahun ini muncul dalam pikiran saya dan saya mulai meneliti seberapa lama kita dapat menjalankan sesuatu pada baterai koin. Saya belum pernah menggunakan mode tidur dari mikrokontroler apa pun sebelumnya. Jadi saya harus mempelajari segala sesuatu tentang membuat mikrokontroler berjalan dengan arus sangat rendah dan menghemat setiap bit energi dari sel. Ini benar-benar tantangan! Saya menggunakan ATmega168P sebagai mikrokontroler (sebenarnya saya memodifikasi Arduino Nano yang memiliki ATmega168P dengan menghapus semua komponen yang tidak diperlukan seperti regulator tegangan, jembatan USB, dll.) dan menggunakan Arduino IDE untuk mengembangkan firmware.
Waktu dan tanggal ulang tahun dapat diprogram melalui serial monitor melalui USB. Setelah waktu dan alarm diatur, mikrokontroler masuk ke mode tidur. Ketika waktu RTC saat ini cocok dengan tanggal ulang tahun Anda setiap tahun, LED akan berkedip selama satu menit dan akan mencetak pesan selamat ulang tahun ke serial monitor. Rata-rata konsumsi arus sekitar 1.2 uAh (termasuk self-discharge) yang memungkinkan untuk berjalan lebih dari 50 tahun pada baterai koin Lithium CR2450 (540mAh).
Fitur
- Rata-rata konsumsi arus sekitar 1.22 uAh termasuk self-discharge sel (608 nA tanpa mempertimbangkan self-discharge, seperti diukur oleh ammeter, pada sel CR2450N)
- Waktu operasi aktual pada berbagai jenis baterai koin Lithium adalah: >29 tahun pada CR2023 (225 mAh), >50 tahun pada CR2450N (540 mAh), dan >64 tahun pada CR2477N (950 mAh). [waktu operasi aktual tergantung pada kesehatan fisik dan kimia baterai seiring waktu]
- Tanggal ulang tahun dapat diatur dan diperbarui melalui perangkat lunak serial monitor apa pun melalui USB dengan perintah sederhana.
- Saklar pengaturan waktu khusus memungkinkan untuk mengatur, melihat, dan memperbarui waktu kapan pun Anda inginkan.
- Pengaturan waktu melalui perangkat lunak berarti dapat diatur dengan cukup akurat dengan aplikasi yang berjalan pada komputer (perangkat lunak pengaturan/peng sinkronan waktu berdasarkan Pengolahan sedang dikembangkan)
- Open source - semua file desain dan kode perangkat lunak tersedia untuk diunduh dengan dokumentasi terperinci dan gambar resolusi tinggi.
Sekarang saya akan memandu Anda melalui petunjuk cara membuat ini dan menunjukkan uji konsumsi arus aktual.
Langkah 1: Memodifikasi Arduino Nano
Untuk proyek ini Anda dapat menggunakan mikrokontroler utuh atau menggunakan papan Arduino Nano atau Mini. Yang diperlukan adalah kita harus menjalankannya dengan osilator internal (1MHz) dan pada rentang operasi penuh 1,8 - 5V. Sel Lithium CR2450 atau sejenisnya memiliki tegangan nominal 3V, sehingga kita dapat menjalankan mikrokontroler tanpa menggunakan regulator tegangan. Klon Cina dari Nano dan Mini sangat murah sehingga Anda dapat membelinya dengan harga chip! Saya menggunakan klon Nano seperti itu yang memiliki CH340G sebagai jembatan USB ke serial. Berikut adalah yang saya gunakan.
Saya memiliki versi ATmega168 dan 328. Saya membeli versi 168 dengan salah beberapa tahun yang lalu (sekarang saya menemukan penggunaannya). Pada papan tertentu ini Anda perlu menghapus:
- IC jembatan USB ke Serial yang di sini adalah CH340G.
- Dioda Shchottky yang terhubung ke USB 5V.
- Dua resistor 1K yang terhubung ke pin TX dan RX CH340G.
- LED RX, TX, dan PWR (SMD)
- Regulator tegangan AMS1117 5V.
Saya menggunakan LED pada pin 13 untuk debugging dan sebagai pemalas utama, jadi saya tidak menghapusnya. Kapasitor tidak perlu dihapus karena akan membantu meredam kebisingan. Setelah regulator dihapus, Anda perlu menyambungkan selang regulator tegangan seperti yang ditunjukkan dalam gambar. Ini karena routing yang digunakan dalam desain PCB. Jangan menghapus osilator kristal mikrokontroler masih karena kita akan memerlukannya untuk mengubah bit fuse. Mikrokontroler akan memiliki pengaturan boot-loader dan fuse default Arduino yang membuatnya berjalan pada kristal eksternal 16MHz. Jika kita menghapus kristal sebelum mengatur fuse untuk menggunakan osilator internal, kita tidak akan dapat memprogram chip dengan programmer ISP. Berikut adalah versi yang dimodifikasi dari Arduino Nano.
Langkah 2: Mengubah Bit Fuse ATmega168P
Biasanya, chip pada papan Arduino akan datang dengan boot-loader dan bit fuse Arduino. Kita perlu mengubah ini untuk menjalankan mikrokontroler pada mode daya rendah. Untuk mencapai ini kita perlu:
- Buat mikrokontroler berjalan pada 1MHz. Kita dapat mengaktifkan osilator internal dan juga bit "divide by 8" untuk menghasilkan clock 1MHz dari 8MHz. Semakin rendah kecepatan clock, semakin rendah konsumsi daya. Kita tidak akan memproses angka di sini, jadi 1MHz sudah lebih dari cukup.
- Nonaktifkan modul deteksi brown-out (BOD).
- Nonaktifkan semua modul internal seperti ADC, Timer, dll. Kita akan melakukan ini melalui perangkat lunak.
- Nonaktifkan timer watchdog (WDT).
- Buat semua pin IO menjadi input dan LOW kecuali pin 13, 2, dan 3.
Di atas adalah pengaturan fuse untuk ATmega168P. Perhatikan bahwa Anda memerlukan versi "P" dari chip ATmega karena mereka memiliki fitur pico-power. Versi normal (non P) tidak mendukung mode hemat daya tambahan ini. Jadi pastikan Anda mendapatkan versi P. Anda mungkin sekarang bertanya-tanya mengapa saya menggunakan 168 alih-alih 328. Itu karena saat saya menguji rangkaian, 328 tampaknya mengonsumsi sekitar 30uA untuk kode dan pengaturan yang sama yang saya gunakan untuk 168 yang hanya mengonsumsi sekitar 2uA. Saya tidak tahu mengapa ini bisa terjadi. Seperti yang saya katakan sebelumnya, ini adalah pertama kalinya saya bermain-main dengan mode hemat daya seperti tidur dalam. Jadi saya mungkin melewatkan sesuatu. Jika Anda tahu sesuatu tentangnya, tolong beri tahu saya di komentar.
Untuk mengubah bit fuse, kita memerlukan programmer ISP. Ada banyak programmer ISP dan perangkat lunak yang kompatibel. Saya menggunakan USBasp sebagai programmer dan ProgISP sebagai perangkat lunak pemrograman. ID chip atau tanda tangan ATmega168P-AU yang saya gunakan adalah 1E940B. Ini mungkin bergantung pada versi yang Anda miliki. Untuk mengubah bit fuse:
- Hubungkan USBasp ke Nano. Biasanya, USBasp akan memiliki konektor 10-pin tetapi Nano memiliki header ISP 6-pin. Jadi saya membuat adaptor 10-pin ke 6-pin sederhana. Anda mungkin perlu membuat sesuatu yang serupa atau menemukan kabel.
- Pilih model mikrokontroler dari daftar dan verifikasi tanda tangan dengan tombol RD.
- Atur kotak centang dan bit fuse seperti yang ditunjukkan dalam gambar di bawah dan gunakan tombol Auto atau tombol Write pada jendela pengaturan fuse untuk memperbarui bit fuse.
Jika berhasil, pesan akan dicetak ke konsol. Dari sekarang Anda akan memerlukan ISP untuk memflash mikrokontroler. Berikut adalah USBasp yang saya gunakan.
Langkah 3: Kompilasi dan Unggahan
Sekarang setelah kita mengubah bit fuse mikrokontroler kita, kita juga perlu memberitahu perangkat lunak Arduino dan kompiler tentang perubahan yang kita buat sehingga kita dapat mengkompil kode dengan benar di dalam Arduino IDE. Cara kita melakukannya adalah dengan menambahkan definisi papan kustom dalam file "boards.txt" yang berada di direktori instalasi Arduino yang biasanya berada di <lokasi terinstal>/Arduino/hardware/arduino/avr/boards.txt" pada sistem Windows. Ini mungkin berbeda untuk Anda tergantung pada OS yang Anda miliki, atau versi IDE yang Anda miliki. Saya menggunakan versi IDE 1.8.5
Setelah kita menemukan file boards.txt, Anda perlu menambahkan definisi kustom dari papan Arduino Pro Mini baru. Di sekitar baris 655 akan dimulai definisi papan Pro Mini yang ada. Ada banyak versi papan. Jadi kita perlu menambahkan varian baru. Tambahkan definisi berikut dan simpan.
## Arduino Pro or Pro Mini (3.3V, 1 MHz) w/ ATmega168 ## -------------------------------------------------- pro.menu.cpu.1MHzatmega168=ATmega168 (3.3V, 1 MHz) pro.menu.cpu.1MHzatmega168.upload.maximum_size=14336 pro.menu.cpu.1MHzatmega168.upload.maximum_data_size=1024 pro.menu.cpu.1MHzatmega168.upload.speed=19200 pro.menu.cpu.1MHzatmega168.bootloader.low_fuses=0x62 pro.menu.cpu.1MHzatmega168.bootloader.high_fuses=0xDF pro.menu.cpu.1MHzatmega168.bootloader.extended_fuses=0xF9 pro.menu.cpu.1MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_pro_8MHz.hex pro.menu.cpu.1MHzatmega168.build.mcu=atmega168 pro.menu.cpu.1MHzatmega168.build.f_cpu=1000000L
Anda perlu mengedit boards.txt saat Arduino tidak berjalan. Setelah Anda menyimpan file boards.txt baru dan memulai ulang Arduino IDE Anda akan melihat papan baru yang baru saja kita tambahkan dalam daftar. Lihat tangkapan layar di bawah ini.
Sekarang kita siap untuk mengkompil kode Arduino untuk papan baru kita. Karena kita tidak menggunakan Arduino bootloader (BL), kita perlu membuat file hex dari program dan menggunakan USBasp dan ProgISP untuk memflash mikrokontroler. Kita dapat melakukan ini menggunakan opsi "Export compiled binary" dari menu Sketch IDE atau menekan Ctrl + Alt + S. Ketika kita melakukannya, dua file hex (format intel) akan dibuat di direktori yang sama tempat sketsa kita berada. Satu file hex adalah dengan BL, dan yang lain adalah tanpa BL.
Setelah kita memiliki file hex, di ProgISP pilih opsi Load Flash untuk memuat file hex yang ingin kita flash ke mikrokontroler lalu tekan tombol Auto. Jika pengunggahan berhasil, akan dicetak ke konsol ProgISP.
Langkah 4: Intersil ISL1208 I2C RTC
Intersil ISL1208 adalah chip RTC daya rendah dengan antarmuka I2C. Ini menggunakan kristal eksternal 32.768 KHz untuk mencatat waktu. Memiliki register alarm bulan-tanggal-jam-menit-detik. Ini hanya mengonsumsi sekitar 400 nA pada operasi VBAT dan maksimal 1.2 uA pada VDD. Tegangan operasi adalah dari 1.8V hingga 5.5V. Yang membuat ini menjadi calon yang baik adalah konsumsi daya dan fitur alarm bulan-tanggal. RTC normal seperti DS1307 tidak memiliki pengaturan bulan dalam register alarm tanpa yang kita tidak dapat menghasilkan alarm ulang tahun setiap tahun. Ini memiliki pin output interupsi yang akan menghasilkan sinyal 250 mS aktif LOW ketika waktu saat ini cocok dengan tanggal dan waktu alarm. Kita akan menggunakan ini untuk membangun mikrokontroler dari mode tidur yang akan saya jelaskan lebih lanjut di bawah ini.
Fitur ISL1208
- Real Time Clock/Calendar
- -Melacak Waktu dalam Jam, Menit, dan Detik
- - Hari dalam Minggu, Hari, Bulan, dan Tahun
- 15 Frekuensi Output yang Dapat Dipilih
- Satu Alarm
- - Dapat Diatur hingga Detik, Menit, Jam, Hari dalam Minggu, Hari, atau Bulan
- - Mode Interupsi Tunggal atau Pulsa
- Cadangan Otomatis ke Baterai atau Super Kapasitor
- Deteksi Kegagalan Daya
- Kompensasi Osilator On-Chip
- 2 Byte SRAM Pengguna yang Didukung Baterai
- Antarmuka I2C
- - Tingkat Transfer Data 400kHz
- Arus Pasokan Baterai 400nA
- Sama Pin Out dengan ST M41Txx dan Maxim DS13xx Devices
Karena saya memiliki versi SMD dari ISL1208 saya harus membuat papan breakout agar dapat dipasang pada papan utama saya. Berikut adalah yang saya buat.
Langkah 5: Baterai Koin CR2450N
Spesifikasi
Langkah 6: Skematik
Gunakan skematik di atas untuk memasang modul pada perfboard. Dua resistor 4.7K adalah I2C pull-ups. Nilai dapat bervariasi dari 3.3K ke atas 5.6K. R2 dan R3 adalah pull-ups untuk pin interupsi. Arduino Nano memiliki dua pin interupsi hardware - pin digital 3 dan 2. Pin digital 2 akan digunakan untuk interupsi bangun alarm dari RTC dan pin digital 3 akan digunakan untuk membangun mikrokontroler saat Anda perlu mengatur waktu. Berikut adalah modul CP2102 USB-to-Serial yang saya gunakan.
Modul USB-to-Serial akan digunakan untuk berkomunikasi melalui serial monitor. Pin RX dan TX CP2102 terhubung ke pin RX dan TX Nano masing-masing. Perhatikan bahwa Anda tidak boleh menghubungkan +5V dari USB ke VCC utama.
Langkah 7: Bagaimana Cara Kerjanya?
Kerja perangaknya sebenarnya sangat sederhana. Mari kita lihat bagaimana algoritma utama bekerja,
- Atur waktu saat ini pada RTC melalui serial monitor.
- Atur waktu dan tanggal alarm pada RTC.
- Mikrokontroler masuk ke mode tidur setelah mengatur waktu dan alarm dengan menonaktifkan periferal internal termasuk timer dan ADC.
- Ketika waktu saat ini cocok dengan tanggal dan waktu alarm (MM, DD, hh, mm, ss, p) RTC akan menghasilkan interupsi dan membangun mikrokontroler dari tidur.
- Saat terbangun, mikrokontroler akan mengaktifkan periferal internal yang diperlukan dan mencetak pesan selamat ulang tahun ke serial monitor. Ini juga memantulkan LED di dalam dome dalam pola tertentu.
- Setelah mengucapkan selamat ulang tahun, mikrokontroler akan kembali ke mode tidur dan hanya akan terbang pada ulang tahun Anda tahun depan.
- Namun Anda dapat melihat waktu dan memperbarui kapan pun diperlukan dengan menyala-kan saklar pembaruan waktu.
Saat menyala-kan untuk pertama kalinya, semua register RTC akan nol dan tidak bertambah sampai kita pertama kali menulis ke salah satunya. Untuk mengatur waktu pada RTC,
- Sala-kan saklar pembaruan waktu ON (hubungkan pin digital 3 ke GND). Kita tidak dapat mengatur waktu tanpa menarik pin 3 ke LOW.
- Pertama hubungkan perangkat ke komputer Anda dengan kabel USB. Port COM akan terbentuk di PC Anda untuk berkomunikasi.
- Temukan port COM perangkat dari manajer perangkat.
- Buka perangkat lunak serial monitor apa pun atau Arduino serial monitor dengan port COM perangkat.
Mikrokontroler akan mencetak pesan di bawah ini ke serial monitor.
Serial Established. Ready to update time.
- Mengirim perintah "t" akan mencetak waktu saat ini, "a" akan mencetak tanggal dan waktu alarm, dan "c" akan membatalkan operasi pengaturan waktu dan memasukkan mikrokontroler ke mode tidur setelah 6 detik.
- Anda perlu mengirim waktu saat ini dalam format yang ditunjukkan di bawah,
TYYMMDDhhmmssp#
Dimana:
- T = menunjukkan informasi waktu
- YY = digit yang tidak signifikan dari tahun (mis. 18 untuk 2018, rentang adalah dari 00 hingga 99)
- MM = bulan (mis. 01 untuk Januari, rentang adalah 01 hingga 12)
- DD = tanggal (mis. 24, rentang adalah 01 hingga 31)
- hh = jam (mis. 06, rentang adalah 01 hingga 12 untuk format 12 jam)
- mm = menit (mis. 55, rentang adalah 00 hingga 59)
- ss = detik (mis. 30, rentang adalah 00 hingga 59)
- p = periode hari untuk format 12 jam (0 = AM, 1 = PM)
- # = pembatas
Misalnya, untuk mengatur waktu dan tanggal "08:35:12 AM, 05-01-2018", kita harus mengirim:
T1801050835120#
Ke perangkat di mana:
- T = menunjukkan informasi waktu
- 18 = tahun 2018
- 01 = bulan Januari
- 05 = tanggal
- 08 = jam
- 35 = menit
- 12 = detik
- 0 = AM
- # = pembatas
Jika operasi berhasil mikrokontroler akan mencetak waktu yang diterima ke konsol sebagai:
Time update received = T1801050835120 Date and Time is 8:35:12 AM, 5-1-18
Jika string waktu yang Anda masukkan tidak valid, pesan di bawah ini akan dicetak:
Invalid time input - <original string>, <length of original string>
Setelah Anda berhasil mengatur waktu, RTC akan mencatatnya selama ada daya yang tersedia untuknya. Anda dapat memverifikasi waktu yang baru saja Anda atur dengan mengirim perintah "t". Pengaturan alarm mirip dengan ini kecuali format datanya berbeda. Untuk mengatur alarm Anda perlu mengirimnya sebagai:
AMMDDhhmmssp#
Dimana:
- A = menunjukkan informasi alarm
- MM = bulan
- DD = tanggal
- hh = jam
- mm = menit
- ss = detik
- p = periode waktu (0 = AM, 1 = PM)
- # = pembatas
Perhatikan bahwa tidak ada informasi tahun dalam string alarm karena jelas kita tidak memerlukannya. Misalnya untuk mengatur ulang tahun saya "08:00:00 AM, 28-08" saya perlu mengirim:
A08240800000#
Anda dapat memeriksa waktu alarm kapan pun dengan perintah "a". Setelah waktu dan tanggal alarm diatur saatnya untuk memasukkan mikrokontroler ke tidur. Jadi perangkat akan mencetak pesan berikut:
Everything's set. Please disable the time set pin now.
Sekarang Anda perlu menyala-kan saklar pengaturan waktu OFF yaitu menarik pin digital 3 HIGH (resistor pull-up 10K akan melakukan itu). Sistem tidak akan tidur sampai Anda melakukannya. Ketika saklar pengaturan waktu diubah OFF, perangkat akan masuk ke mode tidur dalam 6 detik dan mencetak pesan berikut sebelum itu.
Well done! Sleeping in 6 seconds..
Itulah cara Anda mengatur waktu dan alarm. Kapan pun Anda perlu memeriksa waktu atau memperbaruinya, Anda dapat menyala-kan saklar pengaturan waktu dan sistem akan terbangun, mendirikan komunikasi serial dan meminta Anda untuk mengirim waktu. Ini akan mencetak pesan berikut saat terbangun,
Serial Established. Time update wake up. Ready to update time.
Jika Anda hanya memeriksa apakah waktu benar dan tidak ingin mengubah apa-apa, kirim perintah "c" untuk membatalkan operasi dan memasukkan sistem ke tidur lagi. Anda juga perlu menyala-kan saklar pengaturan waktu pada titik ini.
Ketika waktu saat ini cocok dengan waktu alarm yaitu ulang tahun Anda, RTC akan menghasilkan sinyal interupsi 250mS ke pin digital 2 Nano. Sinyal ini akan membangun sistem. Saat terbangun, perangkat akan tahu bahwa ini ulang tahun Anda dan akan mendirikan komunikasi serial (hanya jika Anda memiliki USB yang terhubung) dan mencetak pesan berikut,
Tada! It's your birthday! Happy B'Day <your name> :) See you on your next birthday! TC. Bye! Sleeping in 6 seconds..
Dan ini juga akan memantulkan LED yang terhubung ke pin digital 13. Berikut adalah tangkapan layar Arduino serial monitor saat saya menguji sistem.
Itulah cara Anda mengoperasikan perangkat ini. Untuk memahami ini pada tingkat kode baca bagian selanjutnya.
Langkah 8: Kode
Proyek ini sepenuhnya open source dan oleh karena itu saya telah mempublikasikan kode sumber untuk firmware di GitHub saya di https://github.com/vishnumaiea/Birthday-Alarm/ di bawah Lisensi MIT. Anda bebas untuk menyesuaikan, memodifikasi, dan mendistribusikan ulang tanpa batasan. Jika Anda menambahkan backlink ke proyek ini dari yang dimodifikasi Anda, itu akan dihargai. Saya telah memberikan komentar yang menyeluruh pada kode dan membuatnya mudah dimengerti di mana mungkin.
Kita total 13 fungsi/prosedur dalam kode. Mereka adalah:
1. void setup()
Ini adalah fungsi setup Arduino yang akan menginisialisasi semuanya dan mengatur register konfigurasi ISl1208 RTC.
2. void loop()
Fungsi loop utama.
3. void sleepNow()
Fungsi ini mengakhiri semua komunikasi, menonaktifkan periferal internal mikrokontroler, menyambungkan interupsi ke pin digital 3 dan 2, dan memasukkan sistem ke mode tidur dalam. Saat ada interupsi apa pun, eksekusi program melanjutkan dari baris setelah sleep_mode(). Perhatikan bahwa sebelum eksekusi program normal dilanjutkan, mikrokontroler akan menyelesaikan rutinitas layanan interupsi yang terkait dengan pin interupsi yang merupakan alarmInterrupt() dan timeUpdateInterrupt()
4. void alarmInterrupt()
ISR yang terkait dengan interupsi INT0 pada pin digital 2.
5. void timeUpdateInterrupt()
ISR yang terkait dengan interupsi INT1 pada pin digital 3.
6. void fetchTime()
fetchTime() membaca register waktu RTC dan akan mencetak waktu saat ini ke konsol.
7. void blinkLED()
Memantulkan LED jelas.
8. bool establishSerial()
Mendirikan komunikasi serial dengan bantuan modul USB-to-Serial.
9. bool endSerial()
Mengakhiri komunikasi serial.
10. byte bcdToDec(byte)
Menerima nilai BCD (Binary Coded Digits) dan menterjemahkannya ke nilai desimal yang sesuai. Kita membutuhkan ini karena register RTC hanya menyimpan dan menerima nilai BCD. Jadi kita perlu mengonversi ke dan dari BCD sesekali.
11. byte decToBcd(byte)
Menerima nilai desimal dan menterjemahkannya ke nilai BCD yang sesuai.
12. void printTime()
Membaca register waktu RTC dan mencetak waktu saat ini ke konsol ketika perintah "t" diterima.
13. void printAlarmTime()
Membaca register alarm RTC dan mencetak waktu dan tanggal alarm ke konsol ketika perintah "a" diterima.
Langkah 9: Pengujian
Ini akan menjadi bagian paling menarik dari proyek ini tempat Anda akan tahu bagaimana saya akhirnya membuat perangkat yang berjalan selama 50 tahun pada baterai koin! Saya pertama kali membuat prototipe seluruh rangkaian pada papan roti dan menyelesaikan desain. Saya menggunakan baterai Li-Ion (3.6V) untuk tujuan pengujian sehingga menghemat baterai koin baru saya. Saya menggunakan multimeter Fluke 87 True RMS saya untuk pengukuran arus. Ini memiliki presisi 0.1 uA untuk rentang mikro ampere.
Mari kita lihat bagaimana kita dapat memasukkan Atmega168P ke dalam mode tidur dalam dan mengurangi konsumsi arus secara drastis.
noInterrupts (); //temporarily disable interrupts set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Choose our preferred sleep mode: sleep_enable(); // Set sleep enable (SE) bit: ADCSRA = 0; //disable ADC power_all_disable(); //disables all modules digitalWrite(LED_PIN, LOW); //turn LED off to indicate sleep interrupts(); //re-enable interrupts sleep_mode(); //goes to sleep
Seperti yang saya katakan sebelumnya, ini adalah pertama kalinya saya menggunakan mode tidur dalam mikrokontroler (MCU) karena saya belum pernah memerlukannya sebelumnya. Sebagian besar informasi terkait mode tidur AVR ditemukan dari thread forum ini dan dokumentasi library AVR.
ATmega168P memiliki lima mode tidur.
SLEEP_MODE_IDLE – hemat daya paling sedikitSLEEP_MODE_ADCSLEEP_MODE_PWR_SAVESLEEP_MODE_STANDBYSLEEP_MODE_PWR_DOWN – hemat daya paling banyak
Info lebih lanjut tentang mode tidur dapat ditemukan di sini dan dalam video ini. Kami menggunakan mode SLEEP_MODE_PWR_DOWN seperti yang Anda lihat di sana. Pada mode ini, konsumsi arus pada 3.6V hanya sekitar 0.2 uA Lihat grafik di bawah dari datasheet ATmega168PA yang menunjukkan hubungan antara active current vs supply voltage dan power down current vs supply voltage.
Berikut adalah pembacaan aktual dari arus yang dikonsumsi oleh ATmega168P yang tidur @1MHz.
Nilai lonjak antara 0.1 uA dan 0.2 uA karena kurangnya presisi. Namun pengukuran yang presisi seperti itu tidak diperlukan tetapi akan menarik untuk dilihat.
Konsumsi daya ISL1208 RTC maksimal adalah 1.2 uA. Jadi jika kita menambahkan ini dengan konsumsi arus mode tidur dalam mikrokontroler kita mendapatkan 1.2 + 0.2 = 1.4 uA. Meter saya mengukur antara 1.4 uA dan 1.6 uA yang mempertimbangkan perhitungan. Variasi hanya karena kurangnya presisi dan perkiraan atau pembulatan angka kami.
Berikut adalah video tidak terdaftar dari saluran YouTube saya tempat saya menunjukkan pengujian.
Sekarang mari kita lakukan matematika sederhana untuk menemukan seberapa lama kita dapat menjalankan sistem pada baterai koin. CR2450N dari Reneta memiliki kapasitas nominal 540mAh. Saya memiliki dua LED SMD merah pada sistem yang mengonsumsi sekitar 6 mA (bahkan dengan dua LED) saat menyala. Jadi itu adalah konsumsi arus puncak perangkat dalam kondisi terburuk. Berapa lama LED menyala dapat diringkas sebagai,
- Selama saklar pengaturan waktu diaktifkan saat Anda mengatur waktu (tapi Anda tidak perlu melakukan ini setiap tahun)
- Jeda 6 detik sebelum tidur.
- LED berkedip pada ulang tahun Anda dan menyala selama sekitar 19 detik.
Mari kita tidak akurat di sini tetapi hanya buat perkiraan. Misalkan pengaturan waktu memerlukan 2 menit (LED akan menyala selama 2 menit) dan tambahan 1 menit waktu menyala untuk hal lain termasuk berkedip ulang tahun. Jadi total 3 menit atau 180 detik yang sistem mengonsumsi arus 3 mA. Ambil arus tidur atau idle sebagai 1.6 uA, meskipun sebenarnya lebih rendah. Ada 31557600 detik dalam setahun 365,25 hari. Jika LED menyala selama 180 detik dalam setahun dan mati selama (31557600 - 180) detik, maka konsumsi arus rata-rata akan,
Average Current = [((6 x 10^-3) x 180) + ((1.6 x 10^-6) x 31557420))] / 31557600 = (1.08 + 50.491872) / 31557600 = 51.571872 / 31557600 = 1.634 x 10^-6 = 1.634 uAh
Jika konsumsi arus rata-rata adalah 1.634 uAh, maka sel 540 mAh dapat menjalankan perangkat untuk:
Time Span (approx) = (540 x 10^-3) / (1.634 x 10^-6) = 330477.3562 hours = 13769.88 days = 37.699 years
Perhatikan bahwa perkiraan ini tidak mempertimbangkan self-discharge baterai. Ini akan dipertimbangkan nanti. Anda juga dapat menggunakan aplikasi ElectroDroid untuk menghitung umur baterai. Berikut adalah tangkapan layar dari perhitungan yang baru saja kita lakukan.
TETAPI TUNGGU...
Dapatkah kita mengurangi konsumsi arus lebih jauh? YA KITA BISA! Saya membuat optimasi lebih lanjut pada desain saya untuk membatasi konsumsi arus rata-rata menjadi 0.6 uA, ya saya melakukannya. Nah mari kita lihat optimasi apa yang saya lakukan,
- Untuk menghapus LED SMD merah ekstra untuk mengurangi arus saat sistem aktif/berjalan. Sebelumnya itu adalah 6 mA maksimal dengan dua LED. Jadi dengan satu LED, itu akan berkurang menjadi setengah, yaitu 3 mA.
- Untuk mengurangi konsumsi arus RTC, kita perlu memutuskan pin VDD ISL1208 RTC dari pin VBAT. Sebelumnya pin VDD terhubung ke pin VBAT tempat saya menyediakan 3V dari sel (Anda dapat melihat ini dalam skematik). Dalam konfigurasi itu, saya juga memiliki bit mode daya rendah (LPMOD) dari RTC diatur ke 1 mengaktifkan mode daya rendah. Jadi sekarang Anda mungkin berpikir jika mode daya rendah diatur, maka chip mungkin mengonsumsi arus terendah. Namun itu bukan kasus saat kita memiliki VDD terikat pada VBAT. Karena bit mode daya rendah hanya berguna jika kita memiliki VDD > VBAT sepanjang waktu. Dalam situasi seperti itu, saklar daya internal RTC akan memilih VBAT sebagai sumber daya mengurangi arus lebih jauh sebesar 600 nA saat VDD >= VBAT (dari typ 1.2 uA yang telah saya sebutkan sebelumnya). Namun jika kita dapat menjalankan RTC hanya pada VBAT dengan VDD = 0, konsumsi arus dapat dikurangi ke minimum yaitu 400 nA sesuai datasheet. Jadi apa yang saya lakukan adalah, pertama saya menonaktifkan mode daya rendah dengan mengatur LPMOD ke 0. Lalu menambahkan jumper pada papan breakout RTC untuk memutuskan pin VDD dari VBAT saat saya tidak memerlukannya. Mengapa perlu jumper adalah karena pin VDD harus lebih besar dari atau sama dengan VBAT agar I2C dapat bekerja. Jadi saya dapat menyambungkan jumper saat saya membutuhkan I2C saat saya mengatur waktu, dan dapat memutuskannya setelahnya. Ini akan memungkinkan RTC untuk mengonsumsi arus target 400 nA. Tada! Kami berhasil!
Sekarang setelah kita mengurangi konsumsi arus RTC dari 1.2 uA menjadi 0.4 uA (400 nA), kita dapat melakukan perhitungan lagi!
System Active Current = 3 mAh maks
System Sleep Mode Current = 0.4 uA (RTC) + 0.2 uA (MCU) = 0.6 uAh
System ON time = 60 s (pengaturan waktu) + 19 s (berkedip ulang tahun) + 6 s (sebelum tidur) = 85 detik
System Sleeping Time = 31557600 s - 85 s = 31557515 detik
Total waktu dalam setahun = 31557600 detik
Kapasitas baterai = 540 mAh
Berikut adalah video uji konsumsi arus setelah optimasi dan modifikasi.
Jika kita memasukkan nilai-nilai baru ini ke dalam kalkulator umur baterai ElectroDroid, kita mendapatkan, 101 tahun dan 136 hari. Waktu operasi teoretis lebih dari satu abad! Konsumsi arus rata-rata sekarang hanya 608 nA. Berikut adalah tangkapan layarnya.
Okay, Apa waktu operasi aktual?
Baterai tidak sempurna, sama seperti apa pun yang kita rancang. Jadi mari kita juga pertimbangkan self-discharge 1% dari sel ini.
1% dari kapasitas awal 540 mAh CR2450N = 5.4 mAh
Arus self-discharge = 5.4 mA per tahun atau 616.4 nAh (5.4 mA / jam dalam setahun)
Menambahkan 616.4 nAh ini dengan 600 nAh arus tidur = 1.216 uAh
Waktu operasi yang diharapkan dengan arus rata-rata 1.224 uAh = 50 tahun, dan 131 hari.
Itulah waktu operasi aktual jika selnya masih baik
Berikut adalah tabel waktu operasi aktual dari berbagai jenis baterai koin dengan self-discharge 1% dari kapasitas awal setiap tahun.
Beberapa kekhawatiran praktis utama terkait dengan menjalankan perangkat untuk periode waktu yang panjang adalah,
- Apakah baterai akan mempertahankan muatan dan tegangan selama waktu itu?
- Efek variasi lingkungan pada rangkaian dan performa baterai.
- Dan Anda mengacaukan hal-hal! XD (jangan menjatuhkannya, menggigitnya, duduk di atasnya, menjalankan mobil Anda melaluinya atau meluncurkannya ke luar angkasa!)
Baterai koin biasanya dibuat untuk bertahan selama 10 tahun, yang merupakan usia simpan mereka, dan beberapa bahkan bertahan lebih lama dari itu. Namun itu tidak berarti mereka akan mulai hancur menjadi keadaan yang tidak berguna setelah itu. Jika sel masih dalam kondisi fisik yang baik, itu masih dapat menyediakan daya. Menurut datasheet Renata, tingkat self-discharge CR2450N kurang dari 1% dari kapasitas setiap tahun. Menurut datasheet ini dari Energizer, angka 1% ini adalah dari kapasitas segar. Berikut adalah grafik yang menunjukkan waktu penguras standar dalam tahun (ini tidak mempertimbangkan self-discharge atau pengecualian lainnya). Ini jelas menunjukkan bahwa waktu operasi yang diharapkan secara teoretis jauh lebih lama dari 10 tahun.
Self-discharging tidak hanya mengurangi kapasitas tetapi juga mengurangi tegangan. Keduanya ATmega168P dan ISL1208 dirancang untuk beroperasi dengan baik pada tegangan rendah hingga 1.8V. Jadi pengurangan tegangan mungkin tidak menjadi masalah. Anda dapat mempelajari lebih lanjut tentang menjalankan sistem dengan baterai koin di sini.
Untuk memastikan umur operasi yang panjang, kita harus memastikan perangkat dilindungi dengan baik terhadap banyak perubahan lingkungan seperti suhu, kelembaban, korosi, dll. Ini adalah beberapa hal yang dapat Anda lakukan untuk melindungi rangkaian Anda,
- Lapisi PCB dengan lapisan konformal yang tahan lama.
- Tempatkan paket silica gel di dalam enclosure.
- Segel enclosure dengan bahan yang kurang menghantarkan suhu dan buatnya kedap udara.
- Tempatkan di tempat yang aman dari tangan nakal!
Langkah 10: Pembangunan
Saya menggunakan perfboard untuk mencabut semuanya sesuai skematik. Saya menggunakan konektor berg untuk baterai, saklar, dan LED sehingga akan mudah untuk mencabutnya jika diperlukan. Berikut adalah beberapa gambar PCB.
Untuk membangun enclosure saya menggunakan kotak saklar 4" x 4" yang saya beli di toko listrik. Saya membuat dua lubang persegi panjang untuk saklar dan USB. Anda dapat mencetak 3D enclosure jika Anda ingin; sayangnya saya tidak punya satu. Dome diambil dari lampu LED murah dan saya menggunakan lem super untuk memasangnya pada kotak. Saya melukisnya dengan cat spray perak.
Gunakan keahlian Anda untuk membangunnya.
Apa yang hilang adalah beberapa hiasan. Saya tidak mahir dalam menghias benda-benda. Jika Anda akan memberinya sebagai hadiah kepada seseorang, Anda tahu apa yang harus dilakukan.
Hasil akhir memuaskan sejauh kerja keras saya. Saya mungkin akan mencari orang lain untuk menghiasnya.
Langkah 11: Perbaikan
Selalu ada ruang untuk perbaikan. Beberapa saran saya adalah,
- Menggunakan LCD Nokia 5110 dengan atau alih-alih lampu LED. Pengontrol LCD hanya mengonsumsi beberapa ratus uA pada mode operasi normal tanpa pencahayaan LED tentunya. LCD monokrom hanya mengonsumsi arus yang sangat rendah. Jadi menggunakannya akan lebih baik daripada LED berkedip, tempat Anda sebenarnya dapat mencetak pesan selamat ulang tahun pada layar itu sendiri. Saya mungkin akan melakukan ini di masa depan karena saya punya beberapa di sini.
- Sebuah perangkat lunak yang berjalan pada komputer yang akan mengatur/sinkronkan waktu dengan akurat dan otomatis. Saya memikirkan untuk mengembangkan yang sederhana menggunakan Processing.
- Memantulkan LED untuk menunjukkan usia saat ini - misalnya jika ini ulang tahun ke-5 Anda (OMG apakah Anda membaca ini?!), itu akan memantulkan urutan selama 5 kali. Saat ini Anda tidak dapat mengatur usia saat ini dalam sistem. Anda dapat menambahkan ini.
- Merancang PCB khusus di eagle (direncanakan).
- Jika memantulkan LED bukan hal Anda, Anda sebenarnya dapat membuat ini lebih menarik dengan misalnya menggunakan opto-kopling Anda dapat menyala-kan alarm AC, pemutar musik, lampu atau apa pun yang Anda inginkan untuk berkedip, bergerak dan berteriak pada ulang tahun orang yang Anda inginkan. Anda bahkan dapat mengecualikan mikrokontroler dan hanya menggunakan interupsi dari RTC. Semua mungkin!
Jadi apa yang Anda tunggu? Buat satu, hias dengan stiker, kertas warna, gliter atau apa pun dan berikan kepada orang-orang yang Anda cintai atau bahkan diri Anda sendiri! Dan katakan pada mereka untuk menunggu perangkat ajaib ini untuk mengucapkan selamat ulang tahun kepada mereka.
Apa yang Anda lihat di sini sebenarnya adalah prototipe dari perangkat yang akan disempurnakan dan dirilis di masa depan. Jadi tetaplah mengikuti. Silakan berbagi jika Anda menemukan kesalahan apa pun dalam dokumentasi ini atau memiliki saran perbaikan. Selamat membuat :)
Kode
Birthday Alarm
https://github.com/vishnumaiea/Birthday-Alarm
Skematik
Skematik klon Arduino.