DS3231 – koneksi jam waktu nyata. Jam pada mikrokontroler DS3231 dan AVR, pin SDA dan SCL pada papan Arduino yang berbeda

31.01.2023 Peramban

Chip DS3231 adalah jam real-time RTC presisi tinggi yang memiliki osilator kuarsa kompensasi suhu internal, sehingga penyimpangan waktu hanya ±2 menit per tahun. Selain itu, fungsi alarm diterapkan, dan ada juga keluaran interupsi. Jam dapat dibeli sebagai modul Arduino siap pakai dengan elemen pengikat dan tempat baterai.

Saya memesan modul di sini. Diagramnya ditunjukkan pada gambar di bawah ini:


Sirkuit mikro menggunakan yang banyak digunakan. Mendukung kecepatan data standar (100 kHz) dan tinggi (400 kHz). Alamat sirkuit mikro (7 bit) pada bus I2C adalah 1101000. Selain itu, modul ini memiliki memori I2C (24C32), tidak ditampilkan dalam diagram.

Mode Daya

Tegangan suplai rangkaian mikro dapat berkisar antara 2.3...5.5V, terdapat dua saluran listrik, untuk sumber luar (saluran Vcc), dan juga untuk baterai (Vbat). Tegangan sumber eksternal dipantau secara konstan, dan ketika turun di bawah ambang batas Vpf=2.5V, tegangan tersebut beralih ke saluran baterai. Tabel berikut menunjukkan kondisi peralihan antar saluran listrik:

Akurasi jam tangan dijaga dengan memantau suhu sekitar. Sirkuit mikro memulai prosedur internal untuk menyesuaikan frekuensi generator jam, jumlah penyesuaian ditentukan menggunakan grafik khusus frekuensi versus suhu. Prosedur dimulai setelah listrik dialirkan dan kemudian dijalankan setiap 64 detik.

Untuk menghemat daya, ketika baterai terhubung (tegangan diterapkan ke saluran Vbat), generator jam tidak akan hidup sampai tegangan pada saluran Vcc melebihi nilai ambang batas Vpf, atau alamat sirkuit mikro yang benar ditransmisikan melalui antarmuka I2C. Waktu pengaktifan generator jam kurang dari satu detik. Sekitar 2 detik setelah daya dialirkan (Vcc), atau alamat diterima melalui antarmuka I2C, prosedur koreksi frekuensi dimulai. Setelah generator jam dimulai, generator jam akan terus beroperasi selama Vcc atau Vbat ada. Saat dihidupkan untuk pertama kalinya, register tanggal dan waktu direset dan memiliki nilai berikut: 01/01/00 – 01 – 00/00/00 (hari/bulan/tahun/ – hari dalam seminggu – jam/menit /detik).

Konsumsi arus saat ditenagai oleh baterai 3,63V adalah 3 µA, tanpa adanya transmisi data melalui antarmuka I2C. Konsumsi arus maksimum dapat mencapai 300 µA bila menggunakan catu daya eksternal 5.5V dan kecepatan transfer data I2C yang tinggi.

Fungsi reset eksternal

Jalur RST dapat digunakan untuk reset eksternal dan juga memiliki fungsi alarm tegangan rendah. Garis ditarik tinggi melalui resistor internal; tidak diperlukan pull-up eksternal. Untuk menggunakan fungsi reset eksternal, sebuah tombol dapat dihubungkan antara saluran RST dan kabel biasa, sirkuit mikro memiliki perlindungan pantulan kontak. Fungsi alarm diaktifkan ketika tegangan suplai Vcc turun di bawah nilai ambang batas Vpf, sedangkan saluran RST diatur ke level logika rendah.

Deskripsi register DS3231

Tabel di bawah ini menunjukkan daftar register jam waktu nyata:

AlamatD7D6D5D4D3D2D1D0FungsiBatasan
0x000 10 detikDetikDetik00-59
0x010 10 menitmenitmenit00-59
0x020 12/24 pagi/sore10 jamJamJam tangan1-12 + pagi/malam atau 00-23
10 jam
0x030 0 0 0 0 HariHari di minggu ini1-7
0x040 0 tanggal 10Nomortanggal01-31
0x05Abad0 0 10 bulanBulanBulan/abad01-12 + Abad
0x0610 tahunTahunBertahun-tahun00-99
0x07A1M110 detikDetikDetik, alarm pertama00-59
0x08A1M210 menitmenitMenit, alarm pertama00-59
0x09A1M312/24 pagi/sore10 jamJamJam, alarm pertama1-12 + pagi/malam atau 00-23
10 jam
0x0AA1M4DY/DTtanggal 10HariHari dalam seminggu, alarm pertama1-7
NomorTanggal, alarm pertama01-31
0x0BA2M210 menitmenitMenit, alarm ke-200-59
0x0CA2M312/24 pagi/sore10 jamJamJam, alarm ke-21-12 + pagi/malam atau 00-23
10 jam
0x0DA2M4DY/DTtanggal 10HariHari dalam seminggu, alarm ke-21-7
NomorTanggal, alarm ke-201-31
0x0EEOSCBBSQWKONVRS2RS1INTCNA2IEA1IEDaftar pengaturan (Kontrol)
0x0FOSF.0 0 0 EN32kHzBSYA2FA1FDaftar Status
0x10TANDADATADATADATADATADATADATADATADaftar Offset Penuaan
0x11TANDADATADATADATADATADATADATADATADaftar suhu, byte tinggi
0x12DATADATA0 0 0 0 0 0 Daftar suhu, byte rendah

Informasi waktu disimpan dalam format desimal biner, yaitu setiap digit angka desimal (dari 0 hingga 9) direpresentasikan sebagai kelompok 4 bit. Dalam kasus satu byte, nibble rendah menghitung satu, nibble tinggi menghitung puluhan, dll. Waktu dihitung dalam register dengan alamat 0x00-0x06; untuk menghitung jam, Anda dapat memilih mode 12 atau 24 jam. Mengatur bit ke-6 dari register jam (alamat 0x02) mengatur mode 12 jam, di mana bit ke-5 menunjukkan waktu, nilai 1 berarti sore (PM), nilai 0 berarti sore (AM). Nilai nol dari bit ke-6 sesuai dengan mode 24 jam, di sini bit ke-5 terlibat dalam penghitungan jam (nilai 20-23).

Register hari dalam seminggu bertambah pada tengah malam, menghitung dari 1 hingga 7, register bulan (alamat 0x05) berisi bit Abad (bit ke-7), yang beralih ketika register penghitungan tahun (alamat 0x06) meluap, dari 99 ke 00 .

Chip DS3231 mengimplementasikan dua jam alarm, jam alarm pertama dikonfigurasi menggunakan register dengan alamat 0x07-0x0A, jam alarm ke-2 dikonfigurasi menggunakan register 0x0B-0x0D. Bit A1Mx dan A2Mx dapat digunakan untuk mengkonfigurasi berbagai mode untuk alarm; pengaturan bit mengecualikan register yang sesuai dari operasi perbandingan. Tabel di bawah menunjukkan kombinasi bit untuk mode alarm yang berbeda:

Kombinasi bit yang tidak ditentukan dalam tabel menyebabkan fungsi alarm salah. Jika bit DY/DT dihapus, maka kecocokan tanggal (hari dalam sebulan) dimonitor untuk jam alarm; ketika bit DY/DT disetel, kecocokan hari dalam seminggu diperiksa.

Sebagian besar fungsi dikonfigurasikan dalam register Kontrol. Bit EOSC mengontrol permulaan generator jam, menyetel ulang bit akan memulai generator jam. Menyetel bit akan menghentikan generator, hanya untuk mode baterai (Vbat). Ketika diberi daya dari sumber eksternal (Vcc), osilator selalu berjalan terlepas dari status bit EOSC. Saat diaktifkan, nilai bit default adalah 0.

Mengatur bit BBSQW memungkinkan output INT/SQW (pin ke-3) beroperasi dalam mode daya baterai, tanpa adanya daya eksternal. Ketika bit diatur ke nol, keluaran INT/SQW masuk ke keadaan 3 (dinonaktifkan) jika tegangan sumber eksternal Vcc turun di bawah nilai ambang batas Vpf. Setelah daya diterapkan, nilai bit default adalah 0.

Bit CONV bertanggung jawab untuk pengukuran suhu paksa; pengaturan bit memulai proses konversi, di mana frekuensi generator jam juga disesuaikan; hasil pengukuran terletak di register dengan alamat 0x11, 0x12. Memulai hanya mungkin jika konversi sebelumnya telah selesai; sebelum memulai, Anda perlu memeriksa tanda sibuk BSY. Konversi suhu paksa tidak mempengaruhi siklus penyesuaian frekuensi internal 64 detik. Menyetel bit CONV tidak mempengaruhi flag BSY selama 2 ms. Bit CONV dan BSY dihapus secara otomatis setelah konversi selesai.

Bit RS2, RS1 mengatur frekuensi pulsa persegi panjang (gelombang persegi) pada output INT/SQW. Secara default, saat diaktifkan, bit disetel ke 1. Tabel di bawah menunjukkan kemungkinan kombinasi bit:

Bit INTCN mengontrol keluaran INT/SQW. Jika bit direset, pulsa persegi panjang (gelombang persegi) muncul pada output, yang frekuensinya diatur oleh bit RS2, RS1. Ketika bit INTCN disetel, outputnya digunakan untuk menghasilkan interupsi alarm. Secara default, nilai bitnya adalah 1. Tipe outputnya adalah INT/SQW - open drain, oleh karena itu perlu ditarik melalui resistor ke level logika tinggi, level aktifnya rendah.

Mengatur bit A1IE, A2IE mengaktifkan interupsi masing-masing pada sinyal alarm ke-1 dan ke-2. Reset bit, nonaktifkan interupsi. Nilai defaultnya adalah 0.

Register Status berisi tanda peristiwa dan mengontrol output 32 kHz. Flag OSF mencerminkan keadaan generator jam, nilai 1 berarti generator jam dihentikan, peristiwa ini dapat terjadi dalam kasus berikut:

  • Untuk pertama kalinya setelah listrik diterapkan
  • Baterai atau voltase eksternaltage tidak cukup untuk mengoperasikan generator jam
  • Generator dimatikan dengan mengatur bit EOSC dalam mode baterai
  • Faktor eksternal yang mempengaruhi osilator kristal (kebisingan, kebocoran, dll.)

Setelah disetel, nilai bit tidak berubah; bit harus direset secara manual.

Pengaturan bit EN32kHz memungkinkan pembangkitan pulsa persegi panjang (gelombang persegi) pada output 32kHz (pin pertama), frekuensi pulsa tetap dan sama dengan 32,768 kHz. Menyetel ulang bit akan menonaktifkan fungsi ini dan memindahkan keluaran ke kondisi ke-3 (impedansi masukan tinggi). Secara default, nilai bitnya adalah 1; setelah daya diterapkan, pulsa muncul di output. Tipe outputnya adalah open drain 32kHz, sehingga memerlukan pull-up ke level logika tinggi.

Bendera sibuk BSY diatur selama proses konversi suhu dan penyesuaian jam. Bendera disetel ulang ketika konversi selesai.

Bendera jam alarm A1F, A2F diatur ketika nilai register penghitung waktu dan register jam alarm cocok. Jika alarm menyela A1IE, A2IE diaktifkan, dan output interupsi ditetapkan (bit INTCN diatur), maka sinyal interupsi muncul pada output INT/SQW (transisi dari level logika tinggi ke rendah). Bendera harus direset secara manual dengan menulis nilai 0.

Register Aging Offset dirancang untuk mengatur frekuensi generator jam. Nilai register ditambahkan ke frekuensi osilator selama prosedur penyesuaian internal, jika perubahan suhu terdeteksi, dan juga ketika konversi suhu dipicu oleh bit CONV. Nilai offset ditandatangani, yaitu nilai positif (1-127) mengurangi frekuensi, nilai negatif (128-255) meningkatkannya. Untuk offset yang sama, perubahan frekuensi akan berbeda tergantung suhu. Pada +25°C, perubahan frekuensi akan menjadi 0,1 ppm/LSB.

Nilai suhu saat ini disimpan dalam register dengan alamat 0x11 dan 0x12, masing-masing byte tinggi dan rendah, nilai suhu dalam register diperbarui secara berkala. Perataan kiri diatur, resolusinya adalah 10 bit atau 0,25°C/LSB, yaitu byte tinggi berisi bagian bilangan bulat suhu, dan bit ke-6, ke-7 dalam register rendah membentuk bagian pecahan. Pada byte tinggi, bit ke-7 menunjukkan tanda suhu, misalnya nilai 00011011 01 melambangkan suhu +27.25 °C, nilai 11111110 10 melambangkan suhu -2.5 °C.

Saat membaca register waktu, disarankan untuk menggunakan buffer tambahan, yaitu membaca beberapa register sekaligus, dan tidak secara terpisah, karena antara operasi pembacaan individual, register waktu dapat mengubah nilainya. Aturan ini juga disarankan untuk diikuti saat menulis data baru ke register akun. Menulis nilai baru ke register detik akan menjeda jam selama 1 detik, register yang tersisa harus ditulis ulang selama waktu ini.

Menghubungkan DS3231 ke mikrokontroler

Saya menghubungkan jam ke mikrokontroler PIC16F628A dan menggunakan . Diagram koneksi ditunjukkan di bawah ini:


Setelah daya dialirkan, tanda hubung (– – – – – –) ditampilkan pada indikator, kemudian jam diinisialisasi, nilai waktu muncul pada indikator dengan penundaan 1 detik, yang diperlukan untuk menghidupkan generator jam. Indikator menampilkan jam, menit dan detik, dipisahkan dengan titik desimal, dan format waktu adalah 24 jam. Dengan menggunakan tombol “Indikasi” SB1, Anda dapat mengubah format tampilan, dimana indikator akan menampilkan suhu, serta nilai jam dan menit, dipisahkan dengan titik desimal, yang berkedip dengan frekuensi 2 Hz. Suhu ditampilkan tanpa bagian pecahan; program hanya membaca byte tinggi penyimpanan suhu di alamat 0x11.

Nilai waktu dibaca dari jam melalui interupsi pada jalur SQW/INT, yang dikendalikan oleh sinyal alarm pertama; selama inisialisasi jam, jam alarm diatur ke sinyal setiap detik. LED HL1 berfungsi sebagai indikator dan berkedip pada sinyal interupsi setiap detik. LED HL2 menyala jika terjadi kesalahan pengiriman data melalui antarmuka I2C.

Selain itu, saya menambahkan ke program kemampuan untuk mengatur jam menggunakan tombol "Pengaturan" SB2, "Instalasi" SB3. Mode pengaturan dimasukkan dengan menekan tombol SB2; indikator menampilkan 00 jam dan garis putus-putus sebagai pengganti menit dan detik (00 – – – –). Dengan menggunakan tombol SB3, Anda mengatur nilai jam (bertambah setiap kali ditekan), lalu menekan tombol SB2 akan mengalihkan pengeditan menit; alih-alih tanda hubung, 00 menit akan ditampilkan. Tombol SB3 juga menetapkan nilai yang diperlukan dan seterusnya. Setelah mengedit detik dan menekan tombol SB2, waktu dalam jam ditulis ulang, dan waktu yang diperbarui ditampilkan pada indikator.

Sebagian kode program diberikan di bawah ini (versi lengkap dapat diunduh di akhir artikel):

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; #termasuk LIST p=16F628A __CONFIG H"3F10" ;tingkat kesalahan konfigurasi mikrokontroler -302 ;tidak menampilkan pesan dengan kesalahan 302 dalam daftar Sec equ 0020h ;register akun tambahan Sec1 equ 0021h ; Detik2 sama dengan 0022h ; scetbit equ 0024h;register tambahan untuk menghitung jumlah bit perem equ 0025h;register tambahan untuk penerimaan/transmisi byte melalui spi, i2c temp equ 0026h;register suhu perem_1 equ 0027h;register tambahan untuk konverter biner-desimal. hasilnya sama dengan 0028h; register bantu konverter biner-desimal dat_ind equ 0029h ;daftar data untuk transmisi melalui protokol spi adr_ind equ 002Ah ;daftar alamat untuk transmisi melalui protokol spi second equ 002Bh ;daftar penyimpanan detik untuk mengatur waktu minut equ 002Ch ;daftar penyimpanan menit untuk mengatur waktu jam equ 002Dh ; register penyimpanan jam untuk pengaturan waktu adr_i2c equ 002Eh ;register subrutin transfer data antarmuka i2c tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;register bendera #DEFINE int PORTB,0 ;interrupt line INT/SQW DS3231 #DEFINE sda PORTB ,1 ;jalur SDA untuk sambungan DS3231 #DEFINE scl PORTB,2 ;Jalur SCL untuk sambungan DS3231 #DEFINE sda_io TRISB,1 ;arah jalur SDA #DEFINE scl_io TRISB,2 ;arah jalur SCL #DEFINE datai PORTB,5 ;jalur input data driver MAX7219 #DEFINE cs PORTB ,6 ;jalur pemilihan driver MAX7219 #DEFINE clk PORTB,7 ;jalur jam driver MAX7219 #DEFINE led PORTB,4 ;LED kesalahan i2c #DEFINE led_sec PORTB,3 ;indikator progres jam LED 1Hz #DEFINE regim PORTA,2 ;Tombol indikasi - mengubah mode tampilan #DEFINE nast PORTA,3 ;Tombol pengaturan - memasuki mode pengaturan waktu #DEFINE ust PORTA,4 ;Tombol pengaturan - mengatur nilai jam;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;mulai eksekusi program dari alamat 0000h goto Mulai ;pergi ke label Mulai ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Program utama Mulai movlw b"00000000" ;mengatur nilai kait keluaran port A movwf PORTA ; movlw b"01000000" ;atur nilai kait keluaran port B movwf PORTB ; movlw b"00000111" ;matikan pembanding movwf CMCON ; bsf STATUS,RP0 ;pilih bank pertama movlw b"00000111" ;atur jalur input/output port B movwf TRISB ;RB0-RB2 - untuk input, sisanya untuk output movlw b"11111111" ;atur input/ jalur keluaran port A movwf TRISA ;semua jalur untuk masukan bcf STATUS,RP0 ;pilih bank 0 bendera clrf ;setel ulang bendera register panggil init_lcd ;panggil subrutin inisialisasi driver (MAX7219) panggil viv_not ;simbol tanda hubung keluaran " ------ " ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; motion ; movlw b"10000000" ;data untuk register detik alarm pertama movwf INDF ; termasuk FSR,F ; movlw b"10000000" ;data untuk register menit alarm pertama movwf INDF ; termasuk FSR,F ; movlw b"10000000" ;data untuk register jam pada jam alarm pertama movwf INDF ; termasuk FSR,F ; movlw b"10000000" ;data untuk register tanggal/hari dalam seminggu alarm pertama movwf INDF ; bergerak. 4 ;mentransfer 4 byte melalui i2c movwf tmp_i2c ; movlw 0x07 ;mengatur alamat register detik jam alarm pertama movwf adr_i2c ; panggil write_i2c ;memanggil subrutin penulisan melalui antarmuka i2c memanggil err_prov ;memeriksa kesalahan tulis/baca I2C movlw .1 ;mentransfer byte pertama melalui i2c movwf tmp_i2c ; movlw 0x0E ;mengatur alamat register Kontrol movwf adr_i2c ; movlw data_i2c ;mengatur register transmisi/penerimaan pertama melalui i2c movwf FSR ; movlw b"00000101" ;mulai generator jam, larang pengoperasian pin INT/SQW untuk movwf INDF ;mode daya baterai, frekuensi pulsa pada keluaran INT/SQW adalah 1Hz, ;output INT/SQW digunakan untuk menghasilkan alarm interupsi jam, ;aktifkan interupsi jam alarm panggilan alarm pertama write_i2c ;memanggil subrutin perekaman melalui panggilan antarmuka i2c err_prov ;memeriksa kesalahan tulis/baca I2C met_2 movlw .1 ;mentransfer byte pertama melalui i2c movwf tmp_i2c ; movlw 0x0F ;mengatur alamat register Status movwf adr_i2c ; movlw data_i2c ;mengatur register transmisi/penerimaan pertama melalui i2c movwf FSR ; movlw b"00000000" ;setel ulang bit OSF, larang pembuatan pulsa pada output EN32kHz, movwf INDF ;setel ulang tanda interupsi alarm A2F, panggilan A1F write_i2c ;panggil subrutin perekaman melalui antarmuka i2c, panggil err_prov ;periksa penulisan I2C /baca kesalahan met_1 btfsc int ;polling baris interupsi alarm goto met_3; bsf led_sec ;nyalakan LED indikator kemajuan jam goto met_4 ; met_3 bcf led_sec ;mematikan indikator kemajuan jam LED btfsc nast ;melakukan polling tombol pengaturan jam goto met_5 ; panggil nast_time ;panggil subrutin untuk mengatur waktu goto met_2 ; met_5 btfsc regim ;jajak pendapat tombol mode indikasi goto met_1 ; met_6 panggilan jeda_knp ; rezim btfss; pergi bertemu_6 ; btfss flag,2 ;ubah nilai flag mode indikasi goto met_7 ; bendera bcf,2 ;setel ulang bendera indikasi, mode tampilan jam goto met_1 ; met_7 bsf flag,2 ;mengatur bendera indikasi, suhu dan mode tampilan jam goto met_1 ; met_4 movlw .1 ;mentransmisikan byte pertama melalui i2c movwf tmp_i2c ; movlw 0x11 ;mengatur alamat register suhu tinggi movwf adr_i2c ; panggil read_i2c ;memanggil subrutin pembacaan melalui panggilan I2C err_prov ;memeriksa kesalahan tulis/baca I2C movf INDF,W ;menyalin nilai suhu ke dalam register temp movwf temp rd_time movlw .3 ;mentransfer 3 byte melalui i2c movwf tmp_i2c ; movlw 0x00 ;mengatur alamat register detik movwf adr_i2c ; panggil read_i2c ;memanggil subrutin pembacaan melalui panggilan I2C err_prov ;memeriksa kesalahan tulis/baca I2C bendera btfsc,2 ;jajak pendapat bendera mode indikasi goto met_8 ; panggil vivod ;memanggil subrutin untuk menampilkan nilai jam pada tampilan digital goto met_2 ; met_8 panggil vivod_temp ;memanggil subrutin untuk menampilkan suhu dan jam pada tampilan digital goto met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

#termasuk

CONFIG H"3F10" ;Konfigurasi mikrokontroler

errorlevel -302 ;jangan tampilkan pesan kesalahan 302 dalam daftar

Sec equ 0020h ;register akun tambahan

Detik1 sama dengan 0021h ;

Detik2 sama dengan 0022h ;

scetbit equ 0024h ;menghitung jumlah bit register tambahan

perem equ 0025h; register penerimaan/transmisi byte tambahan melalui spi, i2c

temp equ 0026h ;register suhu

perem_1 equ 0027h ;Daftar bantu BCD

hasilnya sama dengan 0028h; register bantu konverter biner-desimal

dat_ind equ 0029h ;daftar data untuk transmisi melalui protokol spi

adr_ind equ 002Ah ;daftar alamat untuk transmisi melalui protokol spi

detik sama dengan 002Bh; register penyimpanan detik untuk mengatur waktu

minut equ 002Ch ;daftar penyimpanan menit untuk mengatur waktu

hour equ 002Dh ;daftar penyimpanan jam untuk mengatur waktu

adr_i2c equ 002Eh ;register subrutin transfer data antarmuka i2c

tmp_i2c sama dengan 002Fh

slave_adr sama dengan 0030h

data_i2c sama dengan 0031h

bendera sama dengan 007Fh ;daftar bendera

#DEFINE int PORTB,0 ;interupsi jalur INT/SQW DS3231

#DEFINE sda PORTB,1 ;Jalur SDA untuk menghubungkan DS3231

#DEFINE scl PORTB,2 ;SCL line untuk menghubungkan DS3231

#DEFINE datai PORTB,5 ;jalur input data driver MAX7219

#DEFINE cs PORTB,6 ;jalur pemilihan driver MAX7219

#DEFINE clk PORTB,7 ;garis jam driver MAX7219

#DEFINE led PORTB,4 ;LED kesalahan i2c

#DEFINE led_sec PORTB,3 ;Indikator kemajuan jam LED 1Hz

#DEFINE regim PORTA,2 ;Tombol indikasi - mengubah mode tampilan

#DEFINE nast PORTA,3 ;Tombol pengaturan - memasuki mode pengaturan waktu

#DEFINE ust PORTA,4 ;Tombol setel - atur nilai jam

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

org 0000h ;mulai eksekusi program dari alamat 0000h

goto Mulai; buka label Mulai

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Program utama

Mulai movlw b"00000000" ;atur nilai kait keluaran port A

movlw b"01000000" ;atur nilai kait keluaran port B

movlw b"00000111" ;matikan pembanding

bsf STATUS,RP0 ;pilih bank pertama

movlw b"00000111" ;mengonfigurasi jalur input/output port B

movwf TRISB ;RB0-RB2 - ke input, sisanya ke output

movlw b"11111111" ;menyiapkan jalur input/output port A

movwf TRISA ;semua baris untuk dimasukkan

bcf STATUS,RP0 ;pilih bank 0

bendera clrf ;setel ulang daftar bendera

panggil init_lcd ;panggil rutinitas inisialisasi driver (MAX7219)

panggil viv_not ;simbol tanda hubung keluaran " ------ " ke indikator

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

movlw b"11010000";alamat perangkat (DS3231)

;Tulis 4 byte ke register penerimaan/pengiriman melalui i2c

movlw data_i2c ;mengatur register penerimaan/pengiriman pertama melalui i2c

movlw b"10000000" ;data untuk register detik alarm pertama

movlw b"10000000" ;data untuk register menit alarm pertama

movlw b"10000000" ;data untuk register jam alarm pertama

movlw b"10000000" ;data untuk tanggal/hari minggu register alarm pertama

movlw .4 ;transfer 4 byte melalui i2c

movlw 0x07 ;mengatur alamat register detik jam alarm pertama

Fitur khas:

  • Akurasi ±2 ppm pada rentang suhu 0°C hingga +40°C
  • Akurasi ±3,5 ppm pada rentang suhu -40°C hingga +85°C
  • Masukan untuk menghubungkan sumber daya otonom untuk memastikan pengoperasian yang berkelanjutan
  • Kisaran suhu pengoperasian komersial: dari 0°C hingga +70°C industri: -40°C hingga +85°C
  • Konsumsi rendah
  • Jam real time menghitung detik, menit, jam, hari dalam seminggu, hari dalam bulan, bulan dan tahun dengan koreksi tahun kabisat hingga 2100
  • Dua alarm harian
  • Output gelombang persegi dengan frekuensi yang dapat diprogram
  • Antarmuka cepat (400 kHz) I 2 C
  • daya 3.3V
  • Sensor suhu digital dengan akurasi pengukuran ±3°C
  • Register berisi data tentang penyesuaian yang diperlukan
  • input/output pengaturan ulang nonRST

Aplikasi:

  • Server
  • Meteran listrik elektronik
  • Peralatan telematika
  • sistem GPS

Diagram koneksi khas untuk DS3231:

Gambaran umum:

DS3231 adalah jam waktu nyata (RTC) presisi tinggi dengan antarmuka I 2 C bawaan, osilator kristal kompensasi suhu (TCXO) dan resonator kuarsa. Perangkat ini memiliki input untuk menghubungkan sumber daya otonom cadangan, yang memungkinkan ketepatan waktu dan pengukuran suhu bahkan ketika tegangan suplai utama dimatikan. Resonator kuarsa internal meningkatkan masa pakai perangkat dan mengurangi jumlah elemen eksternal yang diperlukan. DS3231 tersedia dalam versi suhu komersial dan industri dan dikemas dalam paket SO 16 pin 300 mil.

RTC menyediakan penghitungan detik, menit, jam, hari dalam seminggu, hari dalam bulan dan tahun. Tanggal akhir bulan ditentukan secara otomatis dengan memperhitungkan tahun kabisat. Jam waktu nyata beroperasi dalam format 24 atau 12 jam dengan indikasi paruh hari saat ini (AM/PM). Perangkat ini memiliki dua alarm harian dan keluaran gelombang persegi dengan frekuensi yang dapat diprogram. Pertukaran data dengan perangkat dilakukan melalui antarmuka bawaan yang kompatibel dengan serial I 2 C.

". Mari berkenalan dengan modul jam real-time DS3231. Artikel ini berisi instruksi video, daftar program, tujuan dan metode menghubungkan modul dari keluarga DS ke Arduino.

Modul Jam Waktu Nyata DS3231

Apa itu Modul Jam Waktu Nyata DS3231?

Modul jam waktu nyata- ini adalah sirkuit elektronik yang dirancang untuk merekam data kronometrik (waktu saat ini, tanggal, hari dalam seminggu, dll.), dan merupakan sistem yang terdiri dari sumber daya otonom dan alat perekam.

modul DS3231 Ini pada dasarnya adalah jam tangan biasa. Papan Arduino sudah memiliki sensor waktu bawaan Milis, namun, ini hanya berfungsi jika daya dialirkan ke papan. Jika Anda mematikan lalu menghidupkan Arduino, waktu Millis akan direset ke nol. Dan DS3231 memiliki baterai terpasang, yang, bahkan ketika papan Arduino dilepas, terus “memberi daya” pada modul, memungkinkannya mengukur waktu.

Modul ini dapat digunakan sebagai jam atau jam alarm berbasis papan Arduino. Atau sebagai peringatan untuk berbagai sistem, misalnya di Rumah Pintar.

Spesifikasi DS3231:

  • modul menghitung jam, menit, detik, tanggal, bulan, tahun (tahun kabisat diperhitungkan sampai tahun 2100);
  • Untuk terhubung ke berbagai perangkat, jam terhubung melalui antarmuka I2C.

32K— Output dirancang untuk memasok daya eksternal >12V.

S.Q.W.— Output sinyal Gelombang Persegi yang dapat diprogram.

SCL– Melalui pin ini, data dipertukarkan dengan jam melalui antarmuka I2C.

SDA– Data dari jam tangan dikirimkan melalui pin ini.

VCC– Catu daya untuk jam waktu nyata, diperlukan 5 volt. Jika tidak ada tegangan yang disuplai ke pin ini, jam tangan akan masuk ke mode tidur.

GND- Bumi.

Diagram koneksi untuk jam real-time DS3231 dan program sederhana

Pin SDA dan SCL pada papan Arduino yang berbeda:

SDA SCL
UNO A4 A5
Mini A4 A5
nano A4 A5
Mega2560 20 21
Leonardo 2 3

Mari kita sambungkan modul jam real-time ke Arduino UNO. SDA - pin A4, SCL - pin A5.

Program berikut ini cocok agar model dapat berfungsi (Anda cukup menyalin program ke Arduino IDE):

#termasuk

batalkan pengaturan() (
penundaan(300);
Serial.mulai(9600);
waktu.mulai();
}
lingkaran kosong()



}
}

Dalam sketsa ini, waktu hanya menghitung mundur.

Pertama-tama, di sktech, sambungkan perpustakaan iarduino_RTC.h.

Di sana, tunjukkan nama persis modul Anda agar dapat berfungsi dengan benar.

Hasilnya, kami mendapatkan output waktu dari modul DS3231 ke monitor port. Jam, menit, detik ditampilkan.

Pada sketsa selanjutnya kita akan menambahkan fungsi Atur waktu, yang memungkinkan Anda mengatur waktu hitung mundur awal.

#termasuk
waktu iarduino_RTC(RTC_DS3231);
batalkan pengaturan() (
penundaan(300);
Serial.mulai(9600);
waktu.mulai();
waktu.settime(0,0,18,24,04,17,1); // 0 detik, 0 menit, 18 jam, 24 April 2017, Senin
}
lingkaran kosong()
if(millis()%1000==0)( // jika 1 detik telah berlalu
Serial.println(time.gettime("dm-Y, H:i:s, D")); // waktu tampilan
penundaan(1); // jeda selama 1 ms agar tidak menampilkan waktu beberapa kali dalam 1 ms
}
}

Pada contoh, waktu mulai dihitung dari 0 detik, 0 menit, pukul 18, 24 April 2017, Senin.

Postingan pelajaran:

  1. Pelajaran pertama: .
  2. Pelajaran kedua: .
  3. Pelajaran ketiga: .
  4. Pelajaran keempat: .
  5. Pelajaran kelima: .
  6. Pelajaran keenam: .
  7. Pelajaran ketujuh: .
  8. Pelajaran kedelapan: .
  9. Pelajaran kesembilan:

Hari ini kami akan melanjutkan pencarian chip jam waktu nyata (RTC) yang sempurna. Kami akan membuat jam tangan berdasarkan. Tampilan akan lebih nyaman untuk pengembangan - layar LCD, yang akan menampilkan semua informasi sekaligus kecuali pengaturan. Dalam bentuk ini, jam nyaman digunakan sebagai versi desktop.

Jadi, mari kita lihat chip DS3231 itu sendiri. DS3231 adalah jam real-time dengan pergerakan yang sangat presisi (produsen memilih kata tersebut) berkat resonator kuarsa internal dengan kompensasi suhu. Antarmuka transfer data adalah I 2 C. Sirkuit mikro ini juga memiliki input untuk tegangan baterai cadangan, ketika daya utama dimatikan, sirkuit mikro secara otomatis beralih ke pengoperasian dari baterai cadangan, keakuratan pengoperasian dari baterai cadangan tidak terpengaruh. Sangat menyenangkan bukan? DS3231 mendukung penghitungan detik, menit, jam, hari dalam sebulan (tanggal), hari dalam seminggu, bulan, dan tahun (termasuk tahun kabisat untuk bulan). Mendukung pekerjaan dalam format 12 dan 24 jam. Ada 2 jam alarm dengan kemampuan untuk mengkonfigurasinya dan memantau statusnya. Penyesuaian akurasi kompensasi suhu. Dan juga dua output - pada 32 kHz (outputnya 32,768 kHz) dan output yang dapat diprogram dari 1 Hz hingga 8,192 kHz. Ada juga pin reset - RST. Chip jam waktu nyata tersedia dalam paket SO-16. Kasingnya cukup besar, tetapi mengingat sudah ada kuarsa di dalamnya, dan juga kompensasi suhu, menurut saya semuanya baik-baik saja dengan dimensinya. DS3231 memiliki kembaran berupa DS3232, namun memiliki 2 kaki lebih banyak. Semua ini sangat mengingatkan pada produk NXP - chip jam PCA2129 dan PCF2129. Resonator kuarsa bawaan dengan kompensasi suhu serupa, keduanya merupakan kembaran yang sama hanya dengan jumlah n.c. pin dan fungsi serupa yang berhubungan dengan DS3231 selain ketepatan waktu.

RTC DS3231 tersedia untuk dijual dalam bentuk modul dengan kabel yang diperlukan, serta lengkap dengan chip EEPROM, yang seringkali tidak diperlukan, hanya menambah bobot:

Selain bagian-bagian yang diperlukan, pada papan modul juga terdapat LED yang fungsinya untuk menunjukkan sambungan listrik ke terminal. Mereka mungkin hanya mengirimkannya untuk kecantikan.

Yang penting untuk diketahui saat bekerja dengan chip jam waktu nyata adalah cara mengekstrak data darinya atau menulisnya di sana. Jam memiliki antarmuka I 2 C. Untuk menulis data (dan ini juga diperlukan untuk membaca data), Anda harus melewati kondisi awal (perintah ini dilakukan menggunakan perangkat keras atau perangkat lunak I 2 C untuk mikrokontroler), kemudian meneruskan alamat chip dengan catatan bit, kemudian meneruskan alamat register yang akan kita akses dan kemudian mentransfer satu byte data ke register ini, jika Anda kemudian mentransfer byte data lainnya, itu akan menjadi ditulis ke register berikutnya, dan seterusnya. Setelah selesai, Anda harus melewati kondisi berhenti. Representasi grafis di atas pada gambar:

Perekaman data diperlukan untuk pengaturan awal serta pengaturan waktu saat ini. Selanjutnya, kita perlu terus-menerus menerima data tentang waktu dan tanggal saat ini. Untuk melakukan ini, perlu membaca dari register yang menyimpan informasi ini. Membaca terdiri dari dua prosedur - mengatur penunjuk ke register yang diinginkan dan membacanya. Untuk menyetel penunjuk ke register yang diinginkan, Anda harus meneruskan kondisi awal, kemudian meneruskan alamat chip dengan bit tulis dan satu byte dengan alamat register. Berikutnya adalah kondisi berhenti dan kemudian kondisi mulai, atau hanya memulai kembali. Sekarang prosedur kedua adalah membaca langsung dari register. Awal ditransmisikan, maka Anda perlu mengirim alamat sirkuit mikro dengan bit baca dan kemudian membaca register dalam nomor yang diperlukan, dan setelah selesai, mengirimkan kondisi berhenti. Jika informasi dari register telah dibaca, penunjuk secara otomatis berpindah ke register berikutnya tanpa tindakan yang tidak perlu dari pihak mikrokontroler (master perangkat). Gambar tersebut mengilustrasikan semua hal di atas mengenai pembacaan register menggunakan antarmuka I 2 C:

Alamat chip:

  • untuk merekam - 0b11010000
  • untuk membaca - 0b11010001

Kode C akan terlihat seperti ini:

// berfungsi dengan jam =============== =============== ===== === ======== // menginisialisasi pengaturan awal void RTC_init(void)( i2c_start_cond(); // memulai i2c i2c_send_byte(RTC_adr_write); // mentransfer alamat perangkat, mode perekaman i2c_send_byte(0x0E); // mentransfer alamat memori i2c_send_byte(0b00100000); // memulai konversi suhu dan output pada 1 Hz i2c_send_byte(0b00001000); // mengaktifkan output 32 kHz i2c_stop_cond(); // hentikan i2c ) // dapatkan waktu dan tanggal void RTC_read_time(void)( i2c_start_cond() ; // mulai i2c i2c_send_byte(RTC_adr_write); // transfer alamat perangkat, mode tulis i2c_send_byte(0x00); // transfer alamat memori i2c_stop_cond(); // menghentikan i2c i2c_start_cond(); // memulai i2c i2c_send_byte(RTC_adr_read); // mentransmisikan alamat perangkat, mode membaca sec = bcd(i2c_get_byte(0)); // membaca detik, ACK min = bcd(i2c_get_byte (0)); // membaca menit, ACK jam = bcd(i2c_get_byte(0)); // membaca jam, ACK wday = bcd(i2c_get_byte(0)); // membaca hari dalam seminggu, hari ACK = bcd(i2c_get_byte(0)); // membaca nomornya, ACK bulan = bcd(i2c_get_byte(0)); // membaca bulan, tahun ACK = bcd(i2c_get_byte(1)); // membaca tahun, NACK i2c_stop_cond(); // hentikan i2c ) // atur waktu void RTC_write_time(unsigned char hour1, unsigned char min1, unsigned char sec1)( i2c_start_cond(); // mulai i2c i2c_send_byte(RTC_adr_write); // transfer alamat perangkat, mode perekaman i2c_send_byte( 0x00) ; // transfer alamat memori i2c_send_byte(bin(detik1)); // 0x00 detik (apakah sebaiknya juga menentukan detik?) i2c_send_byte(bin(min1)); // 0x01 menit i2c_send_byte(bin(hour1)) ; // 0x02 jam i2c_stop_cond(); // hentikan i2c ) // setel tanggal void RTC_write_date(unsigned char wday, unsigned char day, unsigned char bulan, unsigned char year)( i2c_start_cond(); // mulai i2c i2c_send_byte(RTC_adr_write ); // mentransfer alamat perangkat, mode perekaman i2c_send_byte(0x03); // mentransfer alamat memori i2c_send_byte(bin(wday)); // 0x03 hari dalam seminggu (Minggu - 1, Sen 2, Sel 3, Rabu 4, Kam 5, Jum 6, Sabtu 7 ) i2c_send_byte(bin(hari)); // 0x04 hari bulan i2c_send_byte(bin(bulan)); // 0x05 bulan i2c_send_byte(bin(tahun)); // 0x06 tahun i2c_stop_cond(); // hentikan i2c ) // baca suhu void RTC_read_temper(void)( i2c_start_cond(); // mulai i2c i2c_send_byte(RTC_adr_write); // transfer alamat perangkat, mode tulis i2c_send_byte(0x11); // transfer alamat memori i2c_stop_cond (); // menghentikan i2c i2c_start_cond(); // memulai i2c i2c_send_byte(RTC_adr_read); // mengirimkan alamat perangkat, mode baca t1 = i2c_get_byte(0); // membaca suhu MSB t2 = i2c_get_byte(1); // membaca Suhu LSB i2c_stop_cond(); // stop i2c t2=(t2/128); // bergeser sebanyak 6 - presisi 0,25 (2 bit) // bergeser sebanyak 7 - presisi 0,5 (1 bit) t2=t2*5; )

Ini semua kode sumber yang digunakan untuk bekerja dengan sirkuit mikro; penyesuaian kecepatan jam tidak terpengaruh, karena jam tidak kehilangan satu detik pun dalam beberapa hari.

Ya - fitur yang hebat DS3231 adalah bahwa chip yang sama menjalankan fungsi termometer (jika tidak, bagaimana lagi melakukan kompensasi suhu) dan kemampuan untuk membaca suhu saat ini. Resolusi suhu maksimum adalah 0,25 derajat Celcius. Selain itu, periode pembaruan suhunya cukup lama - sekitar 1 menit. Ya, kami tidak perlu memperbaruinya dengan cepat.

Diagram seluruh struktur jam terlihat seperti ini:

Mikrokontroler dipilih oleh Atmega8 karena ketersediaannya yang luas dan harganya yang murah. Mikrokontroler ini dapat digunakan baik dalam paket DIP-28 maupun dalam versi SMD dalam paket TQFP-32. Resistor R3 diperlukan untuk mencegah restart spontan mikrokontroler jika terjadi gangguan acak pada pin PC6. Resistor R3 menarik daya plus ke pin ini, menciptakan potensi yang andal di dalamnya. Layar kristal cair (LCD) digunakan untuk tampilan. Saya menggunakan tampilan 2004A - 4 baris 20 karakter lebih untuk kecantikan, jadi Anda bisa menggunakan tampilan yang lebih familiar - 2 baris 16 karakter. Layar LCD dihubungkan ke mikrokontroler menggunakan sistem empat bit. Resistor variabel R2 diperlukan untuk mengatur kontras karakter pada tampilan. Dengan memutar penggeser resistor ini, kami mendapatkan pembacaan paling jelas di layar untuk kami. Lampu latar layar LCD diatur melalui pin “A” dan “K” pada papan display. Lampu latar dinyalakan melalui resistor pembatas arus - R1. Semakin tinggi nilainya, semakin redup tampilannya. Namun resistor ini tidak boleh diabaikan untuk menghindari kerusakan pada lampu latar. Tombol S1 - S4 mengontrol pengaturan jam. LED menunjukkan bahwa alarm telah berbunyi. LED dapat diganti dengan semacam rangkaian suara. Resistor R5 - R8 bersifat pull-up dan diperlukan untuk pembentukan pulsa persegi panjang di terminal chip jam. Ini juga diperlukan agar protokol I2C berfungsi dengan benar. Untuk memberi daya pada rangkaian, digunakan chip penstabil linier L7805, dapat diganti dengan analog domestik dari penstabil linier lima volt KR142EN5A, atau Anda dapat menggunakan chip penstabil tegangan lain sesuai dengan koneksinya di sirkuit (misalnya, LM317 atau switching stabilizer LM2576, LM2596, MC34063, dan seterusnya). Selanjutnya, 5 volt distabilkan oleh sirkuit mikro lain - AMS1117 dalam versi yang memberikan output 3,3 volt. Chip jam tersebut, menurut datasheet, ditenagai oleh tegangan 3,3 volt. Namun tegangan maksimumnya adalah 5,5 volt. Oleh karena itu, stabilizer ini dapat digunakan atau tidak, sesuai kebijaksanaan Anda. Penstabil tegangan AMS1117 juga dapat diganti dengan versi ADJ (AMS1117ADJ) - yaitu, versi yang dapat disesuaikan, Anda perlu mengatur tegangan yang diperlukan dengan pilihan inimenggunakan dua buah resistor yang dihubungkan pada rangkaian mikro sesuai dengan datasheetnya.

Sirkuit dirakit dan di-debug menggunakan papan pengembangan untuk mikrokontroler ATmega8:

Tujuan dari tombol:

  • S1 - mematikan sinyal alarm, atau keluar ke menu utama dari menu pengaturan apa pun
  • S2- reset mikrokontroler
  • S3 - mengubah waktu atau tanggal di menu pengaturan
  • S4 - masuk ke menu pengaturan dan gulir menu

Pin 32 kHz dapat digunakan untuk mengontrol frekuensi kristal. Kami menghubungkan pengukur frekuensi atau osiloskop ke pin ini dan mengontrol frekuensi:

Seperti yang dapat dilihat dari tangkapan layar osilogram, frekuensinya kira-kira sama dengan 32,768 kHz (kira-kira karena keterbatasan resolusi pengukuran frekuensi, dan sulit untuk menentukan secara akurat “dengan mata”).

Hasilnya adalah jam tangan dengan ciri-ciri sebagai berikut:

  • indikasi waktu
  • tampilan tanggal
  • indikasi hari dalam seminggu
  • indikasi aktivitas jam alarm
  • 1 jam alarm dengan keluaran sinyal dari mikrokontroler
  • indikasi suhu sekitar (hanya suhu positif yang diterapkan dalam perangkat lunak; suhu negatif, menurut saya, tidak ada gunanya bagi kami)
  • pengaturan alarm
  • pengaturan waktu
  • pengaturan tanggal
  • Layar LCD dengan lampu latar
  • menyimpan pengaturan dan melanjutkan jam saat daya utama dimatikan

Mari kita rangkum. Chip jam waktu nyata DS3231 adalah solusi terbaik. Akurasinya sebanding dengan beberapa DS1307 atau lebih tinggi, namun PCA/PCF2129 masih dapat bersaing dengannya. Di antara chip jam real-time yang telah saya ulas, instance ini saat ini menempati peringkat pertama dalam hal fungsionalitas dan akurasi.

Untuk memprogram mikrokontroler Atmega8, Anda perlu mengetahui konfigurasi bit sekering (tangkapan layar diambil dalam program):

Artikel ini disertai dengan firmware untuk mikrokontroler Atmega8, desain sirkuit dalam program, serta video jam kerja (di awal alarm akan berbunyi - LED akan menyala).

Daftar elemen radio

Penamaan Jenis Denominasi Kuantitas CatatanTokoBuku catatan saya
IC1 MK AVR 8-bit

ATmega8

1 Ke buku catatan
IC2 Jam Waktu Nyata (RTC)

DS3231

1 Ke buku catatan
VR1 Pengatur linier

L7805AB

1 Ke buku catatan
VR2 Pengatur linier

AMS1117-3.3

1 Ke buku catatan
VD1 Dioda penyearah

1N4148

1 Ke buku catatan
C1 470 mikrofarad1 Ke buku catatan
C2, C3, C5, C7 Kapasitor100 nF4 Ke buku catatan
C4 Kapasitor elektrolitik220 uF1 Ke buku catatan
C6, C8 Kapasitor elektrolitik10 mikrofarad2 Ke buku catatan
R1 Penghambat

22 ohm

1 Ke buku catatan
R2 Resistor pemangkas10 kOhm1 3296W-1-103LF

Banyak perangkat memerlukan pencatatan data kronometrik (tanggal, waktu) secara konstan; fungsi ini dilakukan oleh sirkuit elektronik khusus yang disebut jam waktu nyata. Saat ini, jam waktu nyata diimplementasikan dalam bentuk sirkuit mikro terpisah, yang mana Anda perlu menambahkan resonator kuarsa dan catu daya otonom. Di beberapa sirkuit mikro, resonator kuarsa terpasang di dalamnya. Salah satu jam ini pada sebuah chip DS3231SN Saya membelinya untuk milik saya proyek . Dalam contoh saya akan menghubungkan jam real-time ke analog Cina Arduino UNO.

Merupakan modul ZS-042 lengkap yang dapat dihubungkan ke berbagai perangkat, tidak hanya ke platform Arduino saja.


Modul ini dibangun di atas sirkuit mikro DS3231SN yang pada dasarnya adalah jam waktu nyata. Berbeda dengan jam tangan model lama, misalnya pada chip DS1307, jam tangan ini dilengkapi resonator kuarsa internal, sehingga jam tangan memiliki waktu yang akurat.

Anda dapat mengimplementasikan jam di Arduino tanpa DS3231SN, tetapi jika daya terputus, nilai pengatur waktu akan diatur ulang.Jam yang sama ini memiliki daya cadangan, jadi jika listrik padam, jam tersebut terus bekerja.

Jam tangan dapat menghitung jam, menit, detik, tanggal, bulan, tahun (tahun kabisat diperhitungkan sampai tahun 2100). Mereka beroperasi dalam mode 12 atau 24 jam, berisi dua jam alarm, dan juga memiliki termometer internal dengan kisaran -40 ° C hingga + 85 ° C. Untuk terhubung ke berbagai perangkat, jam dihubungkan melalui Antarmuka I2C.


Lokasi dan tujuan pin pada modul ZS-042:

S.Q.W.- Output sinyal Gelombang Persegi yang dapat diprogram.

SCLMelalui pin ini, data dipertukarkan dengan jam melalui antarmuka I2C.

SDAData dari jam tangan dikirimkan melalui pin ini.

VCCCatu daya untuk jam waktu nyata, diperlukan 5 volt. Jika tidak ada tegangan yang disuplai ke pin ini, jam tangan akan masuk ke mode tidur.

GND- Bumi.

Untuk terhubung ke Arduino UNO, Kami menghubungkan pin SDA jam ke pin A4, dan pin SCL ke A5. Pin GND(-) dan VCC(+5v) digunakan untuk catu daya.

Pin SDA dan SCL pada papan Arduino yang berbeda:

SDA SCL
UNO A4 A5
Mini A4 A5
nano A4 A5
Mega2560 20 21
Leonardo 2 3

Mari kita pasang baterai CR2032 di jam tangan; elemen seperti itu digunakan untuk memberi daya pada BIOS di komputer.

Saat Anda menghubungkan kabel USB ke Arduino, LED pada jam akan menyala KEKUATAN"(LED merah).

Untuk memprogram jam melalui Arduino IDE, Anda perlu menginstal perpustakaan.

Unduh perpustakaan Waktu dan DS1307RTC.

Pustaka terakhir ditulis untuk sebuah jam pada chip DS1307, tetapi protokol interaksinya kompatibel dengan DS3231, sehingga pustaka tersebut akan sesuai dengan jam kita.

Perpustakaan perlu diunduh, dibongkar, dan ditempatkan di folder "perpustakaan" Saat memulai Arduino IDE, mereka dengan contoh akan muncul di " Sampel».

Atur Tanggal dan Waktu.

Untuk melakukan ini, salin kode ini ke Arduino IDE.

Untuk pengaturan yang benar, Anda perlu mengubah data di baris

setTime(13,35,0,22,12,2016);



Dalam tanda kurung, dipisahkan dengan koma, masukkan yang benar: jam, menit, detik, hari, bulan, tahun. Dalam contoh saya, disetel ke 13 jam 35 menit 0 detik, 22 Desember 2016. Unggah sketsa ke Arduino.

Sekarang, untuk membaca pembacaan dari jam, Anda dapat menggunakan contoh: “ Mengajukan» - « Sampel» - « DS1307RTC» - « Tes Baca" Dan di belakang unggah ke Arduino.

Jendela yang terbuka akan menampilkan tanggal dan waktu saat ini. Jika Anda mematikan daya ke modul jam dari Arduino, Arduino tidak akan dapat melacak nilainya dan setelah beberapa waktu muncul pesan " ...kesalahan membaca!"(disorot dengan warna merah). Setelah listrik pulih, tanggal dan waktu akan terus menghitung mundur. Tanggal dan waktu tidak disetel ulang karena jam tangan ditenagai oleh baterai CR2032.