Mündəricat:

Arduino ilə DS1307 və DS3231 Real Zamanlı Saat Modullarından istifadə: 3 addım
Arduino ilə DS1307 və DS3231 Real Zamanlı Saat Modullarından istifadə: 3 addım

Video: Arduino ilə DS1307 və DS3231 Real Zamanlı Saat Modullarından istifadə: 3 addım

Video: Arduino ilə DS1307 və DS3231 Real Zamanlı Saat Modullarından istifadə: 3 addım
Video: 7 проектов. Сборка светодиодного ЖК-будильника с использованием DS1307 и Arduino | Урок 105 2024, Noyabr
Anonim
Arduino ilə DS1307 və DS3231 Real-time Saat Modullarından istifadə
Arduino ilə DS1307 və DS3231 Real-time Saat Modullarından istifadə
Arduino ilə DS1307 və DS3231 Real-time Saat Modullarından istifadə
Arduino ilə DS1307 və DS3231 Real-time Saat Modullarından istifadə

Fərqli mənbələrdən Arduino ilə DS1307 və DS3231 real vaxt saat modullarının necə istifadə ediləcəyi ilə bağlı sorğular almağa davam edirik-bu da onlardan istifadə ilə bağlı iki hissədən ibarət olan bir dərsdən birincisidir. Bu Arduino dərsliyi üçün Maxim DS1307 (kvadrat modul) və DS3231 (düzbucaqlı modul) əsasında işləyən iki real vaxt modulu var.

Həqiqi vaxt modullarında IC-lər arasında iki əsas fərq var ki, bu da vaxt saxlamanın dəqiqliyidir. Birinci modulda istifadə olunan DS1307 çox yaxşı işləyir, lakin xarici temperatur DS1307 -nin daxili sayğacını idarə edən osilator dövrəsinin tezliyinə təsir göstərə bilər.

Bu bir problem kimi səslənə bilər, ancaq ümumiyyətlə ayın təxminən beş və ya daha çox saatla bağlanması ilə nəticələnəcək. DS3231, xarici amillərdən təsirlənməyən daxili bir osilatörə sahib olduğu üçün daha dəqiqdir və beləliklə ildə ən çox bir neçə dəqiqəyə qədər dəqiqdir. Bir DS1307 modulunuz varsa- özünüzü pis hiss etməyin, hələ də böyük bir dəyər lövhəsidir və sizə yaxşı xidmət edəcək. Hər iki modulda ehtiyat batareya tələb olunur.

Yeni bir CR2032 batareyası almaq və modula uyğunlaşdırmaq yaxşı bir fikirdir. Vaxt və tarixi izləməklə yanaşı, bu modullarda kiçik bir EEPROM, siqnalizasiya funksiyası (yalnız DS3231) və müxtəlif tezliklərin kvadrat dalğası yaratmaq qabiliyyəti də var-bunların hamısı ikinci bir dərslik mövzusu olacaq.

Addım 1: Modulunuzu Arduinoya bağlayın

Hər iki modulda I2C avtobusu istifadə olunur, bu da əlaqəni çox asanlaşdırır.

Əvvəlcə I2C avtobusu üçün Arduino və ya uyğun lövhələrinizdə hansı pinlərin istifadə edildiyini təyin etməlisiniz - bunlar SDA (və ya məlumat) və SCL (və ya saat) kimi tanınacaq. Arduino Uno və ya uyğun lövhələrdə bu pinlər məlumat və saat üçün A4 və A5-dir; Arduino Mega-da pinlər məlumat və saat üçün D20 və D21-dir; Və Pro Mini ilə uyğunsanız pinlər A4 və A5-dir. əsas pinlərə paralel olan məlumat və saat üçün.

DS1307 modulu

DS1307 modulunuz varsa, telləri lövhəyə lehimləməlisiniz və ya keçid tellərindən istifadə etmək üçün bəzi başlıq pinlərində lehimləməlisiniz. Sonra SCL və SDA sancaqlarını Arduino -ya, Vcc pinini 5V pininə və GND -ni GND -ə bağlayın.

DS3231 modulu

Bu modulu bağlamaq asandır, çünki başlıq pinləri fabrikdə lövhəyə quraşdırılmışdır. Yenidən SCL və SDA -dan Arduino -ya və yenidən modulun Vcc və GND pinlərindən 5V və ya 3.3. V və GND -ə qədər keçid telləri çəkə bilərsiniz. Bununla birlikdə, öz tellərinizi lehimləmək üçün digər tərəfdən təkrarlanır. Bu modulların hər ikisində lazım olan çəkmə rezistorları var, buna görə özünüzü əlavə etməyinizə ehtiyac yoxdur. I2C avtobusuna qoşulan bütün cihazlar kimi, SDA və SCL tellərinin uzunluğunu minimuma endirməyə çalışın.

Addım 2: RTC Modulunuzdan Zamanı Oxuyun və Yazın

RTC modulunuzu bağladıqdan sonra. aşağıdakı eskizi daxil edin və yükləyin. Eskizdəki qeydlər və funksiyalar yalnız DS3231 -ə aid olsa da, kod DS1307 ilə də işləyir.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Normal onlu ədədləri ikili kodlu ondalık bayt decToBcd (byte val) {return ((val/10*16) + (val%10)) çevirin; } // İkili kodlu onluğu normal onluq ədədlərə çevir byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Serial.begin (9600); // burada ilkin vaxtı təyin edin: // DS3231 saniyə, dəqiqə, saat, gün, tarix, ay, il // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (bayt saniyə, bayt dəqiqə, bayt saat, bayt dayOfWeek, bayt dayOfMonth, bayt ay, bayt il) {// vaxt və tarix məlumatlarını DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS) olaraq təyin edir; Wire.write (0); // Wire.write (decToBcd (saniyə)) qeydiyyatına başlamaq üçün növbəti girişi təyin edin; // saniyələri təyin et Wire.write (decToBcd (dəqiqə)); // dəqiqələri təyin et Wire.write (decToBcd (saat)); // saatları təyin et Wire.write (decToBcd (dayOfWeek)); // həftənin gününü təyin et (1 = Bazar, 7 = Şənbə) Wire.write (decToBcd (dayOfMonth))); // tarixi təyin et (1 -dən 31 -ə qədər) Wire.write (decToBcd (ay)); // ay təyin Wire.write (decToBcd (il)); // ili təyin edin (0 -dan 99 -a qədər) Wire.endTransmission (); } etibarsız readDS3231time (bayt *saniyə, bayt *dəqiqə, bayt *saat, bayt *dayOfWeek, bayt *dayOfMonth, bayt *ay, bayt *il) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // DS3231 qeyd göstəricisini 00h Wire.endTransmission () olaraq təyin edin; Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // qeydiyyatdan 00h *saniyə başlayaraq DS3231 -dən yeddi bayt məlumat istəyin *bcdToDec (Wire.read () & 0x7f); *dəqiqə = bcdToDec (Wire.read ()); *saat = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *ay = bcdToDec (Wire.read ()); *il = bcdToDec (Wire.read ()); } void displayTime () {bayt saniyə, dəqiqə, saat, dayOfWeek, dayOfMonth, ay, il; // DS3231 readDS3231time (& ikinci, & dəqiqə, & saat, & dayOfWeek, & dayOfMonth, & ay və il) məlumatları almaq; // Serial.print (saat, DEC) serial monitoruna göndərin; // Serial.print (":") göstərildikdə bayt dəyişənini ondalık rəqəmə çevirmək; əgər (dəqiqə <10) {Serial.print ("0"); } Serial.print (dəqiqə, DEC); Serial.print (":"); əgər (ikinci <10) {Serial.print ("0"); } Serial.print (ikinci, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.çap (ay, DEC); Serial.print ("/"); Serial. çap (il, DEC); Serial.print ("Həftənin günü:"); keçid (dayOfWeek) {hal 1: Serial.println ("Bazar"); fasilə; hal 2: Serial.println ("Bazar ertəsi"); fasilə; hal 3: Serial.println ("Çərşənbə axşamı"); fasilə; hal 4: Serial.println ("Çərşənbə"); fasilə; hal 5: Serial.println ("Cümə axşamı"); fasilə; hal 6: Serial.println ("Cümə"); fasilə; hal 7: Serial.println ("Şənbə"); fasilə; }} boşluq döngəsi () {displayTime (); // Serial Monitorda real vaxt saatı məlumatlarını göstərmək, gecikmə (1000); // hər saniyə }

Çox kod ola bilər, ancaq idarə olunan hissələrə yaxşı bölünür.

Əvvəlcə I2C avtobus əlaqəsi üçün istifadə olunan Wire kitabxanasını və ardınca RTC üçün avtobus ünvanını 0x68 olaraq təyin etmək daxildir. Onlu ədədləri BCD-ə (ikili kodlu onluq) və əksinə çevirən iki funksiya gəlir. RTC IC -ləri ondalık deyil, BCD -də işlədiyi üçün bunlar lazımdır.

Saatı təyin etmək üçün setDS3231time () funksiyasından istifadə olunur. İstifadə etmək çox asandır, dəyərləri ildən -ilə saniyə daxil edin və RTC o vaxtdan başlayacaq. Məsələn, aşağıdakı tarix və saatı təyin etmək istəyirsinizsə - 26 Noyabr 2014 Çərşənbə və 21:42 və 30 saniyə - istifadə edərdiniz:

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

Addım 3:

Vaxtın 24 saatlıq vaxtdan istifadə edildiyini və dördüncü parametrin "həftənin günü" olduğunu unutmayın. Bu, bazar ertəsindən şənbə gününə qədər olan 1 ilə 7 aralığına düşür. Öz parametrlərinizi əlavə edirsinizsə, bu parametrlər bayt dəyərləridir.

Funksiyanı işlədikdən sonra // ilə əvvəlcədən kod yazmaq və kodunuzu yenidən yükləmək müdrikdir, buna görə elektrik dövrəyə alındıqda və ya mikro nəzarətçi sıfırlandıqda vaxtı sıfırlamayacaq. RTC -dən vaxtın oxunması eyni dərəcədə sadədir, əslində proses displayTime () funksiyasında səliqəli şəkildə izlənilə bilər. RTC -dən məlumatları saxlamaq üçün yeddi bayt dəyişən təyin etməlisiniz və bunlar daha sonra readDS3231time () funksiyasına daxil edilir. Məsələn, dəyişənləriniz:

bayt saniyə, dəqiqə, saat, dayOfWeek, dayOfMonth, ay, il;

… bunları istifadə edərək RTC -dən mövcud məlumatlarla onları yeniləyərdiniz:

readDS3232time (& ikinci, & dəqiqə, & saat, & dayOfWeek, & dayOfMonth, & ay, və il);

Vaxt və tarixi nümunə eskizdə olduğu kimi serial monitoruna göndərməkdən - məlumatları hər cür çıxış qurğusu üçün uyğun bir forma çevirməkdən sonra istədiyiniz kimi dəyişənləri istifadə edə bilərsiniz.

Hər şeyin işlədiyini yoxlamaq üçün nümayiş eskizinə uyğun vaxtı və tarixi daxil edin, yükləyin, setDS3231time () funksiyasını şərh edin və yenidən yükləyin. Sonra seriyalı monitoru açın və cari vaxt və tarixin işləyən bir ekranı ilə təmin olunmalısınız.

Bu nöqtədən etibarən, məlumatlarınızı real vaxt saat modulunuza təyin etmək və almaq üçün proqram vasitələriniz var və ümid edirik ki, bu ucuz modullardan necə istifadə edəcəyinizi başa düşürsünüz.

İstehsalçının veb saytından-DS1307 və DS3231-dən xüsusi real vaxt saatlarında daha çox məlumat əldə edə bilərsiniz.

Bu yazı pmdway.com tərəfindən sizə gətirildi - istehsalçılar və elektronika həvəskarları üçün hər şey, bütün dünyada pulsuz çatdırılma.

Tövsiyə: