Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Pengingat Ulang Tahun yang Berlangsung selama 50 Tahun

Komponen dan persediaan

Arduino Nano R3
Klon Cina dari Nano atau Mini dengan ATmega168P-AU
× 1
Intersil ISL1208 RTC
× 1
Sel Koin Renata CR2450N
× 1
CP2102 USB ke Modul Serial
× 1
Programmer USBasp
× 1
Kristal 32,768 KHz
× 1
Saklar SPST
× 1
LED SMD
× 1
Hapus Kubah LED
× 1
4" x 4" Kotak Sakelar
Atau Anda dapat mencetak enklosur secara 3D.
× 1
Perfboard
× 1
Konektor Berg (M dan F)
× 1
Resistor 4.75k ohm
× 3
Resistor 10k ohm
× 2

Alat dan mesin yang diperlukan

Dremel
Besi solder (generik)

Aplikasi dan layanan online

ProgISP
Untuk memprogram sekring dan lampu kilat.
Arduino IDE

Tentang proyek ini

Ya, Anda membaca judul dengan benar. Pernahkah Anda lupa hari ulang tahun Anda, bahwa Anda membutuhkan orang lain untuk mengingatkan Anda tentang hal itu? Atau bagaimana jika Anda dapat memberikan hadiah kepada seseorang yang Anda cintai, perangkat yang akan mengucapkan selamat ulang tahun kepada mereka 50 kali ? Saya tidak bercanda, Alarm Ulang Tahun bertenaga Arduino yang sederhana ini yang berjalan pada satu sel koin CR2450 dapat mengucapkan selamat ulang tahun kepada orang yang Anda cintai (atau diri Anda sendiri) selama 50 tahun, sebelum baterainya habis.

Saya pikir ini adalah pertama kalinya seseorang membuat alarm ulang tahun seperti ini, karena saya mencoba mencari proyek serupa tetapi tidak menemukan apa pun. 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- sel

Saya membangun ini sebagai bagian dari Tantangan Sel Koin Hackaday. Hal alarm ulang tahun ini muncul begitu saja di benak saya dan saya mulai meneliti berapa lama kita dapat menjalankan sesuatu di sel koin. Saya belum pernah menggunakan mode tidur mikrokontroler apa pun sebelumnya. Jadi saya harus mempelajari segala sesuatu tentang membuat MCU berjalan pada arus yang sangat rendah dan menghemat setiap energi dari sel. Itu benar-benar sebuah tantangan! Saya menggunakan ATmega168P sebagai mikrokontroler (sebenarnya saya memodifikasi Arduino Nano yang memiliki ATmega168P dengan menghapus semua komponen yang tidak diinginkan seperti regulator tegangan, jembatan USB dll) dan menggunakan Arduino IDE untuk mengembangkan firmware.

Waktu dan tanggal ulang tahun dapat diprogram melalui monitor serial melalui USB. Setelah waktu dan alarm diatur, MCU beralih ke mode tidur. Ketika waktu RTC saat ini sesuai dengan ulang tahun Anda setiap tahun, LED akan berkedip selama satu menit dan akan mencetak pesan selamat ulang tahun ke monitor serial. Konsumsi rata-rata saat ini adalah sekitar 1,2 uAh (termasuk self-discharge) yang memungkinkan untuk menjalankannya selama lebih dari 50 tahun pada sel koin Lithium CR2450 (540mAh).

Fitur

  • Sekitar 1,22 uAh konsumsi rata-rata saat ini termasuk sel self-discharge (608 nA tanpa mempertimbangkan self-discharge, yang diukur dengan ammeter, pada sel CR2450N)
  • Waktu pengoperasian sebenarnya pada berbagai jenis sel koin Lithium adalah :>29 tahun pada CR2023 (225 mAh), >50 tahun pada CR2450N (540 mAh), dan >64 tahun pada CR2477N (950 mAh). [waktu pengoperasian sebenarnya bergantung pada kesehatan fisik dan kimia baterai selama periode tersebut]
  • Ulang tahun dapat diatur dan diperbarui melalui perangkat lunak monitor serial apa pun melalui USB dengan perintah sederhana.
  • Tombol pengaturan waktu khusus memungkinkan untuk menyetel, melihat, dan memperbarui waktu kapan pun Anda mau.
  • Pengaturan waktu perangkat lunak berarti, dapat disetel cukup akurat dengan aplikasi yang berjalan di komputer (perangkat lunak penyetelan waktu/sinkronisasi berdasarkan Pemrosesan sedang dikembangkan)
  • Sumber terbuka - semua file desain dan kode perangkat lunak tersedia untuk diunduh dengan dokumentasi mendetail dan gambar beresolusi tinggi.

Sekarang saya akan memandu Anda melalui petunjuk tentang cara membuat ini dan menunjukkan kepada Anda uji konsumsi aktual saat ini.

Langkah 1:Memodifikasi Arduino Nano

Untuk proyek ini, Anda dapat menggunakan mikrokontroler kosong atau menggunakan Arduino Nano atau Mini papan. Yang diperlukan hanyalah kita harus menjalankannya dengan osilator internal (1MHz) dan pada rentang operasi penuh 1,8 - 5V. CR2450 atau sel Lithium sejenis memiliki tegangan nominal 3V, sehingga kita dapat menjalankan MCU tanpa menggunakan pengatur tegangan. Klon Cina atau Nano dan Mini sangat murah sehingga Anda dapat membelinya dengan harga chip! Saya menggunakan klon Nano yang memiliki CH340G sebagai jembatan USB ke serial. Di bawah ini adalah yang saya gunakan.

Saya memiliki versi ATmega168 dan 328. Saya membeli versi 168 secara tidak sengaja beberapa tahun yang lalu (sekarang saya menemukan kegunaannya). Di papan khusus ini Anda harus menghapus,

  • IC USB to Serial bridge yang di sini adalah CH340G.
  • Dioda Shchottky yang terhubung ke USB 5V.
  • Dua resistor 1K terhubung ke pin TX dan RX dari CH340G.
  • LED RX, TX dan PWR (SMD)
  • Pengatur tegangan 5V AMS1117.

Saya menggunakan LED pada pin 13 untuk debugging dan sebagai flasher utama, jadi saya tidak menghapusnya. Kapasitor tidak perlu dilepas karena akan membantu meredam kebisingan. Setelah regulator dilepas, Anda perlu memendekkan bantalan regulator tegangan seperti yang ditunjukkan pada gambar. Ini karena perutean yang digunakan dalam desain PCB. Jangan lepaskan osilator kristal dari MCU karena kita akan membutuhkannya untuk mengubah bit sekering. MCU akan memiliki default Arduino boot-loader dan pengaturan sekering yang membuatnya berjalan pada kristal 16MHz eksternal. Jika kita melepas kristal sebelum menyetel sekering untuk menggunakan OSC internal, kita tidak dapat memprogram chip dengan programmer ISP. Di bawah ini adalah versi modifikasi dari Arduino Nano.

Langkah 2:Mengubah Bit Fuse ATmega168P

Biasanya, chip pada papan Arduino akan datang dengan bootloader Arduino dan bit sekering. Kita perlu mengubah ini untuk menjalankan MCU pada mode daya yang lebih rendah. Untuk mencapai hal ini kita perlu,

  • Buat MCU berjalan pada 1MHz. Kita dapat mengaktifkan osilator internal dan juga bit "bagi dengan 8" untuk menghasilkan jam 1MHz dari 8MHz. Lebih sedikit kecepatan clock, lebih sedikit konsumsi daya. Kami tidak akan menghitung angka apa pun di sini, jadi 1MHz sudah lebih dari cukup.
  • Nonaktifkan modul deteksi brown-out (BOD).
  • Nonaktifkan semua modul internal seperti ADC, Timer, dll. Kami akan melakukannya dalam perangkat lunak.
  • Nonaktifkan watchdog timer (WDT).
  • Jadikan semua pin IO menjadi input dan LOW kecuali pin 13, 2 dan 3.

Di atas adalah pengaturan sekering 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 ekstra ini. Jadi pastikan Anda mendapatkan versi P. Sekarang Anda mungkin bertanya-tanya mengapa saya menggunakan 168 bukannya 328. Itu karena ketika saya menguji rangkaian, 328 tampaknya mengkonsumsi sekitar 30uA untuk kode yang sama dan pengaturan yang saya gunakan untuk 168 yang hanya mengkonsumsi sekitar 2uA. Saya tidak tahu mengapa ini. Seperti yang saya katakan sebelumnya, ini adalah pertama kalinya saya bermain-main dengan mode hemat daya seperti tidur nyenyak. Jadi saya mungkin kehilangan sesuatu. Jika Anda tahu sesuatu tentang itu, beri tahu saya di komentar.

Untuk mengubah bit sekering, kita membutuhkan 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 ATEga168P-AU yang saya gunakan adalah 1E940B . Ini mungkin berubah tergantung pada versi yang Anda miliki. Untuk mengubah bit sekering:

  • 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 mencari kabel.
  • Pilih model MCU dari daftar dan verifikasi tanda tangan dengan RD tombol.
  • Setel kotak centang dan bit sekering seperti yang ditunjukkan pada gambar di bawah ini dan gunakan tombol Otomatis atau tombol Tulis tombol pada jendela pengaturan sekering untuk memperbarui bit sekering.

Jika berhasil, pesan akan dicetak ke konsol. Mulai sekarang Anda memerlukan ISP untuk mem-flash MCU. Di bawah ini adalah USBasp yang saya gunakan.

Langkah 3:Kompilasi dan Upload

Sekarang kita telah mengubah bit sekering mikrokontroler kita, kita juga perlu memberi tahu perangkat lunak Arduino dan kompiler tentang perubahan yang kita buat sehingga kita dapat mengkompilasi kode dengan benar di dalam Arduino IDE. Cara kami melakukannya adalah dengan menambahkan definisi papan khusus di "boards.txt" file yang berada di direktori instalasi Arduino yang biasanya di /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 kami menemukan file boards.txt, Anda perlu menambahkan definisi khusus dari Arduino Pro Mini baru papan. Sekitar baris 655 akan menjadi awal dari definisi papan Pro Mini yang ada. Akan ada banyak versi papan. Jadi kita perlu menambahkan varian baru. Tambahkan definisi berikut ke dalamnya dan simpan.

## Arduino Pro atau Pro Mini (3.3V, 1 MHz) dengan 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.build.mcu=atmega168.build. .menu.cpu.1MHzatmega168.build.f_cpu=1000000L  

Dan ini screenshotnya.

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 screenshot di bawah ini.

Sekarang kami siap untuk mengkompilasi kode Arduino untuk papan baru kami. Karena kami tidak menggunakan Arduino bootloader (BL) , kita perlu membuat file hex dari program dan menggunakan USBasp dan ProgISP untuk mem-flash mikrokontroler. Kita dapat melakukannya menggunakan "Ekspor biner yang dikompilasi" opsi dari menu Sketsa IDE atau tekan Ctrl + Alt + S . Saat kami melakukannya, dua file hex (format intel) akan dibuat di direktori yang sama dengan tempat sketsa kita berada. Satu file hex dengan BL, dan yang lainnya tanpa BL.

Setelah kita memiliki file hex, di ProgISP pilih Load Flash opsi untuk memuat file hex yang ingin kita flash MCU dengan lalu tekan Otomatis tombol. Jika pengunggahan berhasil, itu akan dicetak ke konsol ProgISP.

Langkah 4:Intersil ISL1208 I2C RTC

Intersil ISL1208 adalah chip RTC berdaya rendah dengan antarmuka I2C. Ini menggunakan kristal 32,768 KHz eksternal untuk melacak waktu. Memiliki register alarm bulan-tanggal-jam-menit-detik. Ini hanya mengkonsumsi sekitar 400 nA pada operasi VBAT dan maksimum 1,2 uA pada VDD. Tegangan operasi dari 1.8V ke 5.5V. Apa yang membuat ini kandidat yang baik adalah konsumsi daya dan fitur alarm tanggal bulan. RTC normal seperti DS1307 tidak memiliki pengaturan bulan dalam register alarm yang tanpanya kami tidak dapat membuat alarm ulang tahun setiap tahun. Ini memiliki pin keluaran interupsi yang akan menghasilkan 250 mS sinyal RENDAH aktif ketika waktu saat ini cocok dengan tanggal dan waktu alarm. Kami akan menggunakan ini untuk membangunkan MCU dari mode tidur yang akan saya jelaskan lebih lanjut di bawah.

Fitur ISL1208

  • Jam/Kalender Waktu Nyata
  • -Melacak Waktu dalam Jam, Menit, dan Detik
  • - Hari dalam Minggu, Hari, Bulan, dan Tahun
  • 15 Output Frekuensi yang Dapat Dipilih
  • Alarm Tunggal
  • - Dapat Disetel ke Detik, Menit, Jam, Hari dalam Seminggu, Hari, atau Bulan
  • - Peristiwa Tunggal atau Mode Interupsi Pulsa
  • Pencadangan Otomatis ke Baterai atau Kapasitor Super
  • Deteksi Kegagalan Daya
  • Kompensasi Osilator On-Chip
  • 2 Byte SRAM Pengguna yang Didukung Baterai
  • Antarmuka I2C
  • - Kecepatan Transfer Data 400kHz
  • Arus Pasokan Baterai 400nA
  • Pin Out yang sama dengan Perangkat ST M41Txx dan Maxim DS13xx

Karena saya memiliki versi SMD dari ISL1208, saya harus membuat papan breakout agar dapat dicolokkan ke papan utama saya. Di bawah ini adalah apa yang saya buat.

Langkah 5:Sel Koin CR2450N

Spesifikasi

  • Sistem Kimia - Li / MnO2 (Menurut IEC 60086)
  • Tegangan Nominal - 3 V
  • Kapasitas Terukur - 540 mAh
  • Arus Debit Standar - 0,8 mA
  • Maks. Lanjutan Arus Debit - 3,0 mA
  • Berat Rata-rata - 5,9 g
  • Suhu Pengoperasian* - -40 - +85 °C
  • Pelepasan Diri pada 23°C - <1% / tahun
  • Masa simpan - hingga 10 tahun

Langkah 6:Skema

Gunakan skema di atas untuk menyolder modul pada perfboard. Kedua resistor 4,7K adalah I2C pull-up . Nilainya dapat berkisar dari 3,3K hingga di atas 5,6K. R2 dan R3 adalah pull-up untuk pin interupsi. Arduino Nano memiliki dua pin interupsi perangkat keras - pin digital 3 dan 2. Pin digital 2 akan digunakan untuk alarm bangun interupsi dari RTC dan pin digital 3 akan digunakan untuk membangunkan MCU saat Anda perlu mengatur waktu. Di bawah ini adalah CP2102 Modul USB-to-Serial yang saya gunakan.

Modul USB-to-Serial akan digunakan untuk berkomunikasi melalui monitor serial. Pin RX dan TX dari CP2102 masing-masing terhubung ke pin RX dan TX dari Nano. Perhatikan bahwa Anda tidak boleh menghubungkan +5V dari USB ke tegangan VCC utama.

Langkah 7:Bagaimana Cara Kerjanya?

Cara kerja perangkat ini sebenarnya cukup sederhana. Mari kita lihat bagaimana algoritma utama bekerja,

  • Setel waktu saat ini di RTC melalui monitor serial.
  • Setel waktu dan tanggal alarm di RTC.
  • MCU beralih ke mode tidur setelah menyetel waktu dan alarm dengan menonaktifkan periferal internal termasuk timer dan ADC.
  • Jika waktu saat ini cocok dengan tanggal dan waktu alarm (MM, DD, jj, mm, ss, p), RTC akan menghasilkan dan menginterupsi serta membangunkan MCU dari mode tidur.
  • Saat bangun, MCU akan mengaktifkan periferal internal yang diperlukan dan mencetak pesan selamat ulang tahun ke monitor serial. Itu juga berkedip LED di dalam kubah dalam pola tertentu.
  • Setelah mengucapkan selamat ulang tahun, MCU akan kembali ke mode tidur dan hanya akan bangun pada hari ulang tahun Anda tahun depan.
  • Tetapi Anda dapat melihat waktu dan memperbaruinya kapan pun diperlukan dengan memutar tombol pembaruan waktu AKTIF.

Saat dinyalakan untuk pertama kalinya, semua register RTC akan menjadi nol dan tidak bertambah sampai kita pertama kali menulis ke salah satu dari mereka. Untuk menyetel waktu di RTC,

  • Nyalakan sakelar pembaruan waktu (hubungkan pin digital 3 ke GND). Kami tidak dapat mengatur waktu tanpa menarik pin 3 LOW.
  • Pertama sambungkan perangkat ke komputer Anda dengan kabel USB. Port COM akan dibuat di PC Anda untuk berkomunikasi.
  • Temukan port COM perangkat dari pengelola perangkat.
  • Buka perangkat lunak monitor serial atau monitor serial Arduino dengan port COM perangkat.

MCU akan mencetak pesan di bawah ini ke monitor serial.

Serial Dibuat.Siap untuk memperbarui waktu. 
  • Mengirim "t" perintah akan mencetak waktu saat ini, "a" akan mencetak tanggal dan waktu alarm, dan "c" akan membatalkan operasi pengaturan waktu dan menempatkan MCU ke mode tidur setelah 6 detik.
  • Anda perlu mengirimkan waktu saat ini dalam format yang ditunjukkan di bawah ini,
TYYMMDDhhmmssp# 

Dimana:

  • B =menunjukkan informasi waktu
  • YY =digit paling signifikan dalam satu tahun (mis. 18 untuk 2018, rentang dari 00 hingga 99)
  • MM =bulan (mis. 01 untuk Januari, rentangnya adalah 01 hingga 12)
  • DD =tanggal (mis. 24, rentangnya adalah 01 hingga 31)
  • hh =jam (mis. 06, rentangnya adalah 01 hingga 12 untuk format 12 jam)
  • mm =menit (mis. 55, rentangnya adalah 00 hingga 59)
  • ss =detik (mis. 30, rentangnya 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 mengirimkan:

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, MCU akan mencetak waktu yang diterima ke konsol sebagai:

Pembaruan waktu diterima =T1801050835120Tanggal dan Waktu adalah 08:35:12, 5-1-18 

Jika string waktu yang Anda masukkan tidak valid, pesan di bawah ini akan dicetak:

Input waktu tidak valid - ,  

Setelah Anda berhasil mengatur waktu, RTC akan melacaknya selama ada daya yang tersedia untuk itu. Anda dapat memverifikasi waktu yang baru saja disetel dengan mengirimkan "t" memerintah. Pengaturan alarm mirip dengan ini kecuali format datanya berbeda. Untuk menyetel alarm, Anda harus mengirimkannya 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 dengan string alarm karena jelas kami tidak membutuhkannya. Misalnya untuk mengatur ulang tahun saya "08:00:00, 28-08" saya harus mengirim:

A08240800000# 

Anda dapat memeriksa waktu alarm kapan saja dengan perintah "a" . Setelah waktu dan tanggal alarm diatur, saatnya untuk membuat MCU dalam mode tidur. Jadi perangkat akan mencetak pesan berikut:

Semuanya sudah siap. Harap nonaktifkan pin yang disetel waktu sekarang. 

Sekarang Anda perlu mematikan sakelar pengaturan waktu yaitu, tarik pin digital 3 TINGGI (pull-up 10K akan melakukannya). Sistem tidak akan tidur sampai Anda melakukan ini. Saat sakelar pengaturan waktu OFF, perangkat akan masuk ke mode tidur dalam 6 detik dan mencetak pesan di bawah ini sebelumnya.

Bagus! Tidur dalam 6 detik.. 

Jadi begitulah cara Anda mengatur waktu dan alarm. Sekarang kapan pun Anda perlu memeriksa waktu atau memperbaruinya, Anda dapat menyalakan sakelar pengaturan timer dan sistem akan bangun, membuat komunikasi serial dan meminta Anda untuk mengirim waktu. Ini akan mencetak pesan berikut saat bangun tidur,

Serial Didirikan.Waktu pembaruan bangun.Waktu siap memperbarui. 

Jika Anda hanya memeriksa apakah waktunya sudah tepat dan tidak ingin mengubah apa pun, kirim "c" perintah untuk membatalkan operasi dan mengembalikan sistem ke mode tidur. Anda juga perlu menonaktifkan sakelar pengaturan waktu pada saat 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 membangunkan sistem. Saat bangun tidur, perangkat akan mengetahui bahwa ini adalah hari ulang tahun Anda dan akan melakukan komunikasi serial (hanya jika Anda memiliki USB yang terhubung) dan mencetak pesan berikut,

Tada! Ini hari ulang tahunmu! Selamat Hari Raya  :) Sampai jumpa di hari ulang tahunmu berikutnya! TC. Sampai jumpa! Tidur dalam 6 detik.. 

Dan itu juga akan mem-flash LED yang terhubung ke pin digital 13. Berikut adalah screenshot dari monitor serial Arduino saat saya menguji sistem.

Jadi begitulah cara Anda mengoperasikan perangkat ini. Untuk memahami ini di tingkat kode, baca bagian selanjutnya.

Langkah 8:Kode

Proyek ini sepenuhnya open source dan oleh karena itu saya telah menerbitkan kode sumber untuk firmware di GitHub saya di https://github.com/vishnumaiea/Birthday-Alarm/ di bawah Lisensi MIT. Anda bebas untuk mengadaptasi, memodifikasi, dan mendistribusikan ulang tanpa batasan apa pun. Jika Anda akan menambahkan tautan balik ke proyek ini dari proyek Anda yang dimodifikasi, itu akan dihargai. Saya telah mengomentari kode secara menyeluruh dan membuatnya lurus ke depan sedapat mungkin.

Kami memiliki total 13 fungsi/prosedur dalam kode. Mereka adalah:

1. batalkan pengaturan() 

Ini adalah fungsi pengaturan Arduino yang akan menginisialisasi semuanya dan mengatur register konfigurasi RTC ISl1208.

2. void loop() 

Fungsi loop utama.

3. batalkan sleepNow() 

Fungsi ini mengakhiri semua komunikasi, menonaktifkan periferal internal MCU, menyambungkan interupsi ke pin digital 3 dan 2, dan menempatkan sistem ke mode tidur nyenyak. Pada interupsi apa pun, eksekusi program berlanjut dari baris setelah sleep_mode() . Perhatikan bahwa sebelum eksekusi program normal ini dilanjutkan, MCU akan menyelesaikan rutinitas layanan interupsi yang terkait dengan pin interupsi yaitu alarmInterrupt() dan timeUpdateInterrupt()

4. batalkan alarmInterrupt() 

ISR yang terkait dengan INT0 interupsi pada pin digital 2.

5. void timeUpdateInterrupt() 

ISR yang terkait dengan INT1 interupsi pada pin digital 3.

6. void fetchTime() 

fetchTime() membaca register waktu RTC dan akan mencetak waktu saat ini ke konsol.

7. batalkan blinkLED() 

Mengedipkan LED dengan jelas.

8. bool buildSerial() 

Membangun komunikasi serial dengan bantuan modul USB-to-Serial.

9. bool endSerial() 

Mengakhiri komunikasi serial.

10. byte bcdToDec(byte) 

Menerima BCD (Digit Kode Biner) nilai dan terjemahkan ke dalam nilai desimal yang sesuai. Kami membutuhkan ini karena register RTC hanya menyimpan dan menerima nilai BCD. Jadi kita perlu mengonversi ke dan dari BCD sesekali.

11. byte deciToBcd(byte) 

Menerima nilai desimal dan menerjemahkannya ke dalam nilai BCD yang sesuai.

12. batalkan printTime() 

Membaca register waktu RTC dan mencetak waktu saat ini ke konsol ketika "t" perintah diterima.

13. batalkan printAlarmTime() 

Membaca register alarm RTC dan mencetak waktu dan tanggal alarm ke konsol saat "a" perintah diterima.

Langkah 9:Menguji

Ini akan menjadi bagian paling menarik dari proyek ini di mana Anda akan tahu bagaimana saya akhirnya membuat perangkat yang berjalan selama 50 tahun di sel koin! Saya pertama kali membuat prototipe seluruh sirkuit pada papan tempat memotong roti dan menyelesaikan desainnya. Saya menggunakan baterai Li-Ion (3.6V) untuk tujuan pengujian untuk menghemat sel koin baru saya. Saya menggunakan Fluke 87 True RMS multimeter untuk pengukuran arus. Ini memiliki 0,1 uA presisi untuk rentang mikro ampere.

Mari kita lihat bagaimana kita dapat menempatkan Atmega168P ke mode deep sleep dan mengurangi konsumsi saat ini secara drastis.

noInterrupts(); //nonaktifkan sementara interupsi set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Pilih mode tidur pilihan kami:sleep_enable(); // Atur bit aktifkan tidur (SE):ADCSRA =0; //nonaktifkan ADC power_all_disable(); //menonaktifkan semua modul digitalWrite(LED_PIN, LOW); //matikan LED untuk menunjukkan interupsi tidur(); //aktifkan kembali interupsi sleep_mode(); //goes to sleep  

As I've said before, this is the first time I used sleep modes in a microcontroller (MCU) because I've never needed it before. Most of the information related to AVR sleep modes was found from this forum thread and the AVR library documentation.

ATmega168P has five sleep modes.

  • SLEEP_MODE_IDLE – least power savings
  • SLEEP_MODE_ADC
  • SLEEP_MODE_PWR_SAVE
  • SLEEP_MODE_STANDBY
  • SLEEP_MODE_PWR_DOWN – most power savings

More info on the sleep modes can be found here and in this video. We're using the SLEEP_MODE_PWR_DOWN mode as you can see there. At this mode, the current consumption at 3.6V is only around 0.2 uA See the below graph from the ATmega168PA datasheet that shows the relation between active current vs supply voltage and power down current vs supply voltage.

Here's the actual reading of the current consumed by sleeping ATmega168P @1MHz.

The value hops between 0.1 uA and 0.2 uA due to the lack of precision. But such a precise measurement isn't necessary but would've been interesting to see.

The power consumption of ISL1208 RTC at max is 1.2 uA . So if we add this with the power down mode current consumption of the MCU we get 1.2 + 0.2 =1.4 uA . My meter measured between 1.4 uA and 1.6 uA which justifies the calculations. The variations is only due to the lack of precision and our approximation or rounding of numbers.

Here's an unlisted video from my YouTube channel where I show the testing.

Now let's do the simple math to find how long we can the system on a coin cell. The CR2450N from Reneta has a nominal capacity of 540mAh . I have two red SMD LEDs on the system which consume about 6 mA (even with two LEDs) with when turned ON. So that's the peak current consumption of the device at worst. How long these LEDs light up can be summarized as,

1. As long as the time setting switch is activated while you're setting the time (but you don't have to do this every year)

2. The 6 second delay before sleep.

3. LED flashes on your birthday and stay ON for about 19 seconds.

Let's not be accurate here but just make an approximation. Let's assume the time setting requires 2 minutes (LEDs will be ON for 2 mins) and and additional 1 minute ON time for other things including the birthday flashing. So it's total 3 minutes or 180 seconds for which the system consumes 3 mA current. Let's take the sleep or idle current as 1.6 uA , though it's lower actually. There's 31557600 seconds in a year of 365.25 days. If LEDs stay ON for 180 seconds in a year and OFF for (31557600 - 180) seconds, then the average current consumption will be,

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 

If the average current consumption is 1.634 uAh, then the 540 mAh cell can run the device for:

Time Span (approx) =(540 x 10^-3) / (1.634 x 10^-6) =330477.3562 hours =13769.88 days =37.699 years 

Note than this approximation is do not consider self-discharge of the battery. It'll be taken into account later. You can also use the ElectroDroid app to calculate battery life. Here's a screenshot of the calculations we just did.

BUT WAIT...

Can we reduce the current consumption further ? YES WE CAN! I made further optimizations to my design to limit the average current consumption to 0.6 uA , yes I did that. Not let's see what optimizations I did,

1. To remove the extra red SMD LED to reduce the current when the system is active/running. Before it was 6 mA at max with two LEDs. So with one LED, it'll be reduced to half, ie 3 mA.

2. To reduce the current consumption of RTC, we need to disconnect the VDD pin of the ISL1208 RTC from the VBAT pin. Previously the VDD pin was connected to the VBAT pin where I supplied the 3V from the cell (you can see this in the schematic). In that configuration, I also had the LOW_POWER mode bit (LPMOD ) of the RTC set to 1 activating the low power mode. So now you might think if the low power mode is set, then the chip might be consuming the lowest current. But that's not the case when we have the VDD tied to VBAT. Because low power mode bit is only useful if we have VDD> VBAT all the time. At such situation, the RTC's internal power switch will select VBAT as power source reducing the current further by 600 nA when VDD>=VBAT (from typical 1.2 uA which I've mentioned before). But if we can run the RTC in VBAT only with VDD =0, the current consumption can be reduced to the minimum ie, 400 nA as per the datasheet. So what I did is, first I disabled the low power mode by setting LPMOD to 0. Then added a jumper to the RTC breakout board to disconnect the VDD pin from VBAT when I don't need it. Why need the jumper is because, the VDD pin must be greater than or equal to VBAT in order for the I2C to work. So I can connect the jumpers when I need I2C while I'm setting the time, and can disconnect it after. This will let the RTC to consume the targeted 400 nA current. Tada! We did it!

Now that we have reduced the current consumption of the RTC from 1.2 uA to 0.4 uA (400 nA), we can do the math again!

System Active Current =3 mAh max

System Sleep Mode Current =0.4 uA (RTC) + 0.2 uA (MCU) =0.6 uAh

System ON time =60 s (time setting) + 19 s (birthday flashing) + 6 s (before sleep) =85 seconds

System Sleeping Time =31557600 s - 85 s =31557515 seconds

Total time in a year =31557600 seconds

Battery capacity =540 mAh

Here's the current consumption test video after the optimizations and mods.

If we put those new values to the ElectroDroid's battery life calculator, we get, 101 years and 136 days. A theoretical operating time of more than a century! The average current consumption is now only 608 nA . Here's the screenshot.

Okay, What's the actual operating time ?

Batteries aren't perfect, nor anything we design. So let's also consider the 1% self discharge of the cell into account.

1% of initial capacity of 540 mAh CR2450N =5.4 mAh

Self-discharge current =5.4 mA per year or 616.4 nAh (5.4 mA / hours in a year)

Adding this 616.4 nAh with the 600 nAh sleep current =1.216 uAh

Expected operating time with average current of 1.224 uAh =50 years, and 131 days.

That's the actual operating time if the cell will be fine

Here's a table of actual operating times of different types of coin cells with the 1% self-discharge of initial capacity every year.

The main practical concerns associated with running the device for such long periods are,

1. Will the battery retain the charge and voltage for that long ?

2. The effects of environmental variations on the circuit and battery performance.

3. And you screwing up things! XD (don't drop it, chew it, sit on it, run your car through it or launch it into space!)

Coin cells are usually made to last for 10 years, which is their shelf life , and some even last longer than that. But that doesn't mean they'll start to disintegrate to an useless state after that. If the cell is physically fine, it can still power things. As per Renata datasheet, the self-discharge rate of CR2450N is less than 1% of the capacity every year. As per this datasheet from Energizer, that 1% figure is of the fresh capacity. Below is a chart that shows the standard discharge time in years (this doesn't consider the self-discharge or other exceptions). It clearly shows the theoretical expected operating time is way too longer than 10 years.

Self-discharging not only reduces the capacity but also reduces the voltage. Both ATmega168P and ISL1208 are designed to be operated fine at voltages as low as 1.8V. So the reduction in voltage might not be a problem. You can learn more about running systems with coin cells here.

To ensure long operating span, we must make sure the device is properly concealed against much of the environmental changes such as temperature, humidity, corrosion etc. These are some things you can do to protect your circuits,

1. Coat the PCB with long lasting conformal coating.

2. Place a pack of silica gel inside the enclosure.

3. Seal the enclosure with less temperature conductive materials and make it air tight.

4. Place it somewhere safe from naughty hands!

Step 10:Building

I used a perfboard to solder everything as per the schematic. I used berg connectors for the battery, switch and LED so that it'll be easy to remove them if needed. Below are the some images of the PCB.

To build the enclosure I used a 4" x 4" switch box which I bought from an electrical shop. I made two rectangular holes for the switch and USB. You can 3D print an enclosure if you want; sadly I don't have one. The dome was snatched from a cheap LED light and used super glue to fix it on the box. I painted it with silver spray paint.

Use your ingenuity to build it.

What missing is some decorations . I'm not good at decorating things. If you are going to gift this to someone, you know what to do.

The final output is satisfying to the extend of my hardwork. I might find someone else to decorate it.

Step 11 :Improvements

There's always room for improvement. Some of my suggestions are,

1. Using a Nokia 5110 LCD with or instead of the LED bulb. The LCD controller only consumes a couple of 100 uA at normal operating modes without the LED backlighting of course. Monochrome LCDs only consume extremely low currents. So using it would be better than a flashing LED, where you can actually print the happy birthday message on the screen itself. I might do this in future because I have couple of them lying around here.

2. A software that runs on the computer that'll set/sync the time accurately and automatically. I'm thinking of developing a simple one using Processing.

3. Flashing the LEDs to indicate the current age - for example if it's your 5th birthday (OMG are you're reading this ?!), it'll flash a sequence for 5 times. Currently you can not set the current age in the system. You may add this.

4. Designing a dedicated PCB in eagle (planned).

5. If blinking LED isn't your thing you can actually make this more exciting with for example using an opto-coupler you can turn on an AC alarm, music player, lights or anything you want to blink, move and scream on the birthday of the one you wish. You can even exclude the microcontroller and only use the interrupt from the RTC. Everything's possible!

So what are you waiting for ? Make one, decorate it with stickers, color papers, glitter or anything and gift to your loved ones or even yourself! And tell them to wait for this magical device to wish them happy birthday.

What you see here is actually a prototype of a device that'll refine and release in future. So stay tuned. Please feel free to share if you have found any errors with this documentation or have any improvement suggestions. Happy making :)

Kode

Birthday Alarm
https://github.com/vishnumaiea/Birthday-Alarm

Skema

Schematic of Arduino clone.

Proses manufaktur

  1. Industri 4.0 dan IoT:Tren pasar untuk tahun-tahun mendatang
  2. 10 faktor untuk menemukan pengalih yang sempurna untuk aplikasi Anda
  3. NVIDIA:Komputer AI CUDA-X yang menjalankan semua model AI
  4. Kontron:40 Gigabit Ethernet switch untuk digunakan di lingkungan yang keras
  5. Jangan pukul bantalan itu! Instruksi yang tepat untuk pemasangan dingin
  6. Bagi Penjahat Cyber, COVID Adalah Hadiah Yang Terus Memberi
  7. 7 Tanda Yang Menunjukkan Saatnya Upgrade Generator
  8. 3 Tanda Yang Menunjukkan Sudah Saatnya Menggulung Motor
  9. Praktik yang Memperhitungkan Perakitan PCB Sempurna
  10. Ada Robot untuk Itu!