Isi kandungan:

Menggunakan Modul Jam Real-time DS1307 dan DS3231 Dengan Arduino: 3 Langkah
Menggunakan Modul Jam Real-time DS1307 dan DS3231 Dengan Arduino: 3 Langkah

Video: Menggunakan Modul Jam Real-time DS1307 dan DS3231 Dengan Arduino: 3 Langkah

Video: Menggunakan Modul Jam Real-time DS1307 dan DS3231 Dengan Arduino: 3 Langkah
Video: BELAJAR 22 PEMROGRAMAN ARDUINO - RTC (Real Time Clock) 2024, November
Anonim
Menggunakan Modul Jam Masa Nyata DS1307 dan DS3231 Bersama Arduino
Menggunakan Modul Jam Masa Nyata DS1307 dan DS3231 Bersama Arduino
Menggunakan Modul Jam Masa Nyata DS1307 dan DS3231 Bersama Arduino
Menggunakan Modul Jam Masa Nyata DS1307 dan DS3231 Bersama Arduino

Kami terus mendapat permintaan tentang cara menggunakan modul jam masa nyata DS1307 dan DS3231 dengan Arduino dari pelbagai sumber - jadi ini adalah yang pertama dari tutorial dua bahagian mengenai cara menggunakannya. Untuk tutorial Arduino ini, kami mempunyai dua modul jam masa nyata untuk digunakan, satu berdasarkan Maxim DS1307 (modul persegi) dan DS3231 (modul segi empat tepat).

Terdapat dua perbezaan utama antara IC pada modul jam masa nyata, iaitu ketepatan penyimpanan masa. DS1307 yang digunakan dalam modul pertama berfungsi dengan baik, namun suhu luaran dapat mempengaruhi frekuensi litar pengayun yang menggerakkan kaunter dalaman DS1307.

Ini mungkin terdengar seperti masalah, namun biasanya akan mengakibatkan jam dimatikan sekitar lima atau lebih minit setiap bulan. DS3231 jauh lebih tepat, kerana ia mempunyai pengayun dalaman yang tidak dipengaruhi oleh faktor luaran - dan dengan demikian tepat hingga beberapa minit setiap tahun. Sekiranya anda mempunyai modul DS1307- jangan merasa tidak enak, ini masih merupakan papan nilai yang hebat dan akan memberi perkhidmatan yang baik kepada anda. Dengan kedua-dua modul, bateri sandaran diperlukan.

Adalah idea yang baik untuk membeli bateri CR2032 baru dan memasangkannya ke modul. Seiring dengan melacak waktu dan tarikh, modul ini juga memiliki EEPROM kecil, fungsi penggera (hanya DS3231) dan kemampuan untuk menghasilkan gelombang persegi dari berbagai frekuensi - yang semuanya akan menjadi subjek tutorial kedua.

Langkah 1: Menyambungkan Modul Anda ke Arduino

Kedua-dua modul menggunakan bas I2C, yang menjadikan sambungannya sangat mudah.

Mula-mula anda perlu mengenal pasti pin mana di papan Arduino atau yang sesuai digunakan untuk bas I2C - ini akan dikenali sebagai SDA (atau data) dan SCL (atau jam). Pada Arduino Uno atau papan serasi, pin ini adalah A4 dan A5 untuk data dan jam; Pada Arduino Mega pin adalah D20 dan D21 untuk data dan jam; Dan jika anda menggunakan serasi Pro Mini, pin adalah A4 dan A5 untuk data dan jam, yang selari dengan pin utama.

Modul DS1307

Sekiranya anda mempunyai modul DS1307, anda perlu memasangkan wayar ke papan, atau menyolder pada beberapa pin header sebaris supaya anda dapat menggunakan wayar jumper. Kemudian sambungkan pin SCL dan SDA ke Arduino anda, dan pin Vcc ke pin 5V dan GND ke GND.

Modul DS3231

Menyambungkan modul ini mudah kerana pin header dipasang di papan di kilang. Anda hanya boleh menjalankan kabel jumper dari SCL dan SDA ke Arduino dan sekali lagi dari pin Vcc dan GND modul ke 5V atau 3.3. V dan GND papan anda. Walau bagaimanapun, ini diduplikasi di sisi lain untuk menyolder wayar anda sendiri. Kedua-dua modul ini mempunyai perintang pull-up yang diperlukan, jadi anda tidak perlu menambahkannya sendiri. Seperti semua peranti yang disambungkan ke bas I2C, cubalah dan pastikan panjang kabel SDA dan SCL minimum.

Langkah 2: Membaca dan Menulis Masa Dari Modul RTC Anda

Sebaik sahaja anda memasang modul RTC anda. masukkan dan muat naik lakaran berikut. Walaupun nota dan fungsi dalam lakaran hanya merujuk kepada DS3231, kodnya juga berfungsi dengan DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Tukarkan nombor perpuluhan normal kepada perduaan byte berkod binari decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); } // Tukar perpuluhan berkod binari ke nombor perpuluhan normal bait bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16)); } batal persediaan () {Wire.begin (); Serial.begin (9600); // tetapkan waktu awal di sini: // DS3231 saat, minit, jam, hari, tarikh, bulan, tahun // setDS3231time (30, 42, 21, 4, 26, 11, 14); } batal setDS3231time (bait kedua, minit bait, jam bait, bait hariOfWeek, bait hariOfMonth, bulan bait, tahun bait) {// menetapkan data masa dan tarikh ke DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // tetapkan input seterusnya untuk memulakan pada detik mendaftar Wire.write (decToBcd (kedua)); // tetapkan detik Wire.write (decToBcd (minit)); // tetapkan minit Wire.write (decToBcd (jam)); // tetapkan jam Wire.write (decToBcd (dayOfWeek)); // tetapkan hari dalam seminggu (1 = Ahad, 7 = Sabtu) Wire.write (decToBcd (dayOfMonth)); // tetapkan tarikh (1 hingga 31) Wire.write (decToBcd (bulan)); // tetapkan bulan Wire.write (decToBcd (tahun)); // set tahun (0 hingga 99) Wire.endTransmission (); } batal bacaDS3231time (bait * kedua, bait * minit, bait * jam, bait * hariOfWeek, bait * hariOfMonth, bait * bulan, bait * tahun) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // tetapkan penunjuk daftar DS3231 ke 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // minta tujuh bait data dari DS3231 bermula dari daftar 00h * saat = bcdToDec (Wire.read () & 0x7f); * minit = bcdToDec (Wire.read ()); * jam = bcdToDec (Wire.read () & 0x3f); * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * bulan = bcdToDec (Wire.read ()); * tahun = bcdToDec (Wire.read ()); } batal displayTime () {bait kedua, minit, jam, dayOfWeek, dayOfMonth, bulan, tahun; // dapatkan semula data dari DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // hantar ke monitor bersiri Serial.print (jam, DEC); // ubah pemboleh ubah bait menjadi nombor perpuluhan apabila dipaparkan Serial.print (":"); jika (minit <10) {Serial.print ("0"); } Cetakan bersiri (minit, DEC); Serial.print (":"); jika (kedua <10) {Serial.print ("0"); } Serial.print (kedua, DEC); Cetakan bersiri (""); Serial.print (dayOfMonth, DEC); Cetakan bersiri ("/"); Serial.print (bulan, DEC); Cetakan bersiri ("/"); Serial.print (tahun, DEC); Serial.print ("Hari dalam seminggu:"); beralih (dayOfWeek) {kes 1: Serial.println ("Ahad"); rehat; kes 2: Serial.println ("Isnin"); rehat; kes 3: Serial.println ("Selasa"); rehat; kes 4: Serial.println ("Rabu"); rehat; kes 5: Serial.println ("Khamis"); rehat; kes 6: Serial.println ("Jumaat"); rehat; kes 7: Serial.println ("Sabtu"); rehat; }} gelung kosong () {displayTime (); // paparkan data jam masa nyata pada Serial Monitor, kelewatan (1000); // setiap saat }

Mungkin ada banyak kod, namun ia terbahagi kepada bahagian yang dapat dikendalikan.

Yang pertama merangkumi perpustakaan Wire, yang digunakan untuk komunikasi bas I2C, diikuti dengan menentukan alamat bus untuk RTC sebagai 0x68. Ini diikuti oleh dua fungsi yang menukar nombor perpuluhan menjadi BCD (perpuluhan berkod binari) dan sebaliknya. Ini diperlukan kerana IC RTC berfungsi dalam BCD bukan perpuluhan.

Fungsi setDS3231time () digunakan untuk mengatur jam. Menggunakannya sangat mudah, masukkan nilai dari tahun ke kedua, dan RTC akan bermula dari masa itu. Contohnya jika anda ingin menetapkan tarikh dan masa berikut - Rabu 26 November 2014 dan 9:42 malam dan 30 saat - anda akan menggunakan:

setDS3231time (30, 42, 21, 4, 26, 11, 14);

Langkah 3:

Perhatikan bahawa waktu ditetapkan menggunakan waktu 24 jam, dan paramter keempat adalah "hari dalam seminggu". Ini jatuh antara 1 dan 7 iaitu setiap hari Ahad hingga Sabtu. Parameter ini adalah nilai bait jika anda memasukkan pemboleh ubah anda sendiri.

Sebaik sahaja anda menjalankan fungsi tersebut, sebaiknya awalkan dengan // dan muat naik kod anda sekali lagi, jadi ia tidak akan menetapkan semula masa setelah kuasa dilancarkan atau tetapkan semula mikrokontroler. Membaca masa membentuk RTC anda Sama mudahnya, sebenarnya prosesnya dapat diikuti dengan rapi di dalam fungsi displayTime (). Anda perlu menentukan tujuh pemboleh ubah bait untuk menyimpan data dari RTC, dan ini kemudian dimasukkan ke dalam fungsi readDS3231time (). Contohnya jika pemboleh ubah anda adalah:

bait kedua, minit, jam, dayOfWeek, dayOfMonth, bulan, tahun;

… anda akan menyegarkannya dengan data semasa dari RTC dengan menggunakan:

bacaDS3232time (& kedua, & minit, & jam, & dayOfWeek, & dayOfMonth, & bulan, & tahun);

Kemudian anda boleh menggunakan pemboleh ubah yang anda anggap sesuai, dari mengirim waktu dan tarikh ke monitor bersiri seperti contoh lakaran - untuk menukar data menjadi bentuk yang sesuai untuk semua jenis peranti output.

Hanya untuk memeriksa semuanya berfungsi, masukkan waktu dan tarikh yang sesuai ke dalam lakaran demonstrasi, muat naik, komen fungsi setDS3231time () dan muat naik sekali lagi. Kemudian buka monitor bersiri, dan anda harus dibekalkan dengan paparan berjalan dari waktu dan tarikh semasa.

Dari sudut ini, anda kini mempunyai alat perisian untuk menetapkan data dan mengambilnya dari modul jam masa nyata anda, dan kami harap anda mempunyai pemahaman tentang cara menggunakan modul yang murah ini.

Anda boleh mengetahui lebih lanjut mengenai IC jam masa nyata tertentu dari laman web pengeluar - DS1307 dan DS3231.

Catatan ini disampaikan kepada anda oleh pmdway.com - semuanya untuk pembuat dan peminat elektronik, dengan penghantaran percuma ke seluruh dunia.

Disyorkan: