İçindekiler:

DS1307 ve DS3231 Gerçek Zamanlı Saat Modüllerini Arduino İle Kullanmak: 3 Adım
DS1307 ve DS3231 Gerçek Zamanlı Saat Modüllerini Arduino İle Kullanmak: 3 Adım

Video: DS1307 ve DS3231 Gerçek Zamanlı Saat Modüllerini Arduino İle Kullanmak: 3 Adım

Video: DS1307 ve DS3231 Gerçek Zamanlı Saat Modüllerini Arduino İle Kullanmak: 3 Adım
Video: Arduino Dijital Saat Yapımı (RTC/Saat Modülü Kullanımı) 2024, Temmuz
Anonim
DS1307 ve DS3231 Gerçek Zamanlı Saat Modüllerini Arduino İle Kullanmak
DS1307 ve DS3231 Gerçek Zamanlı Saat Modüllerini Arduino İle Kullanmak
DS1307 ve DS3231 Gerçek Zamanlı Saat Modüllerini Arduino İle Kullanmak
DS1307 ve DS3231 Gerçek Zamanlı Saat Modüllerini Arduino İle Kullanmak

Çeşitli kaynaklardan DS1307 ve DS3231 gerçek zamanlı saat modüllerinin Arduino ile nasıl kullanılacağına dair talepler almaya devam ediyoruz - bu yüzden bu, bunların nasıl kullanılacağına dair iki bölümlük bir eğitimin ilkidir. Bu Arduino öğreticisi için, biri Maxim DS1307 (kare modül) ve DS3231 (dikdörtgen modül) tabanlı olmak üzere iki gerçek zamanlı saat modülümüz var.

Gerçek zamanlı saat modüllerindeki IC'ler arasında zaman tutmanın doğruluğu olan iki ana fark vardır. İlk modülde kullanılan DS1307 çok iyi çalışıyor ancak dış sıcaklık DS1307'nin dahili sayacını çalıştıran osilatör devresinin frekansını etkileyebilir.

Bu bir sorun gibi görünebilir, ancak genellikle saatin ayda yaklaşık beş dakika kadar kapanmasıyla sonuçlanır. DS3231, dış etkenlerden etkilenmeyen bir dahili osilatöre sahip olduğu için çok daha doğrudur ve bu nedenle yılda en fazla birkaç dakikaya kadar doğrudur. Bir DS1307 modülünüz varsa - kendinizi kötü hissetmeyin, yine de çok değerli bir anakarttır ve size iyi hizmet edecektir. Her iki modülde de yedek pil gereklidir.

Yeni bir CR2032 pil satın alıp modüle takmak iyi bir fikirdir. Bu modüller, saat ve tarihi takip etmenin yanı sıra, küçük bir EEPROM'a, bir alarm işlevine (yalnızca DS3231) ve çeşitli frekanslarda kare dalga oluşturma yeteneğine de sahiptir - bunların tümü ikinci bir eğitimin konusu olacaktır.

Adım 1: Modülünüzü Arduino'ya Bağlama

Her iki modül de bağlantıyı çok kolaylaştıran I2C veri yolunu kullanır.

Öncelikle, I2C veri yolu için Arduino veya uyumlu kartlarınızdaki hangi pinlerin kullanıldığını belirlemeniz gerekecek - bunlar SDA (veya veri) ve SCL (veya saat) olarak bilinecektir. Arduino Uno veya uyumlu kartlarda, bu pinler veri ve saat için A4 ve A5'tir;Arduino Mega'da pinler veri ve saat için D20 ve D21'dir;Pro Mini uyumlu bir pin kullanıyorsanız, pinler A4 ve A5'tir. ana pinlere paralel olan veri ve saat için.

DS1307 modülü

DS1307 modülüne sahipseniz, atlama kablolarını kullanabilmeniz için kabloları karta lehimlemeniz veya bazı satır içi başlık pimlerini lehimlemeniz gerekir. Ardından SCL ve SDA pinlerini Arduino'nuza ve Vcc pinini 5V pinine ve GND'yi GND'ye bağlayın.

DS3231 modülü

Başlık pinleri fabrikada karta takıldığından bu modülün bağlanması kolaydır. Jumper kablolarını tekrar SCL ve SDA'dan Arduino'ya ve tekrar modülün Vcc ve GND pinlerinden kartınızın 5V veya 3.3. V ve GND'sine çalıştırabilirsiniz. Ancak bunlar, kendi tellerinizi lehimlemek için diğer tarafta çoğaltılır. Bu modüllerin her ikisi de gerekli çekme dirençlerine sahiptir, bu nedenle kendinizinkini eklemeniz gerekmez. I2C veri yoluna bağlı tüm cihazlar gibi, SDA ve SCL kablolarının uzunluğunu minimumda tutmaya çalışın.

Adım 2: RTC Modülünüzden Saati Okuma ve Yazma

RTC modülünüzü bağladıktan sonra. aşağıdaki çizimi girin ve yükleyin. Çizimdeki notlar ve işlevler yalnızca DS3231'e atıfta bulunsa da, kod DS1307 ile de çalışır.

#include "Wire.h"#define DS3231_I2C_ADDRESS 0x68 // Normal ondalık sayıları ikili kodlanmış ondalık bayta çevir decToBcd(byte val) { return((val/10*16) + (val%10)); } // İkili kodlanmış ondalığı normal ondalık sayılara çevir byte bcdToDec(byte val) { return((val/16*10) + (val%16)); } geçersiz kurulum() { Wire.begin(); Seri.başla(9600); // başlangıç saatini buradan ayarlayın: // DS3231 saniye, dakika, saat, gün, tarih, ay, yıl // setDS3231time(30, 42, 21, 4, 26, 11, 14); } void setDS3231time(bayt saniye, bayt dakika, bayt saat, bayt haftanın günü, bayt ay ay, bayt yıl) { // saat ve tarih verilerini DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // sonraki girişi saniye cinsinden başlayacak şekilde ayarla register Wire.write(decToBcd(saniye)); // saniyeyi ayarla Wire.write(decToBcd(dakika)); // dakikayı ayarla Wire.write(decToBcd(saat)); // saati ayarla Wire.write(decToBcd(dayOfWeek)); // haftanın gününü ayarla (1=Pazar, 7=Cumartesi) Wire.write(decToBcd(dayOfMonth)); // tarihi (1'den 31'e) ayarla Wire.write(decToBcd(ay)); // ayı ayarla Wire.write(decToBcd(yıl)); // yılı (0'dan 99'a) ayarla Wire.endTransmission(); } void readDS3231time(bayt *saniye, bayt *dakika, bayt *saat, bayt *haftanın günü, bayt *ayAy, bayt *ay, bayt *yıl) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // DS3231 kayıt işaretçisini 00h Wire.endTransmission() olarak ayarla; Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // 00h kaydından başlayarak DS3231'den yedi baytlık veri isteyin *saniye = bcdToDec(Wire.read() & 0x7f); *dakika = bcdToDec(Wire.read()); *saat = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *ay = bcdToDec(Wire.read()); *yıl = bcdToDec(Wire.read()); } void displayTime() { byte saniye, dakika, saat, dayOfWeek, dayOfMonth, ay, yıl; // DS3231'den veri al readDS3231time(&saniye, &dakika, &saat, &dayOfWeek, &dayOfMonth, &month, &year); // seri monitöre gönder Serial.print(saat, DEC); // görüntülendiğinde bayt değişkenini ondalık sayıya çevir Serial.print(":"); if (dakika<10) { Serial.print("0"); } Seri.print(dakika, Aralık); Seri.print(":"); if (saniye<10) { Serial.print("0"); } Serial.print(saniye, Aralık); Seri.print(" "); Serial.print(Ay Günü, Aralık); Seri.print("/"); Serial.print(ay, Aralık); Seri.print("/"); Serial.print(yıl, Aralık); Serial.print("Haftanın günü: "); switch(dayOfWeek){ durum 1: Serial.println("Pazar"); kırmak; durum 2: Serial.println("Pazartesi"); kırmak; durum 3: Serial.println("Salı"); kırmak; durum 4: Serial.println("Çarşamba"); kırmak; durum 5: Serial.println("Perşembe"); kırmak; durum 6: Serial.println("Cuma"); kırmak; durum 7: Serial.println("Cumartesi"); kırmak; } } geçersiz döngü() { displayTime(); // Seri Monitörde gerçek zamanlı saat verilerini göster, delay(1000); // her saniye }

Çok fazla kod olabilir, ancak iyi yönetilebilir parçalara ayrılır.

Önce I2C bus iletişimi için kullanılan Wire kitaplığını içerir, ardından RTC için bus adresini 0x68 olarak tanımlar. Bunları, ondalık sayıları BCD'ye (ikili kodlu ondalık) dönüştüren iki işlev izler ve bunun tersi de geçerlidir. RTC IC'leri ondalık değil BCD'de çalıştığı için bunlar gereklidir.

setDS3231time() işlevi saati ayarlamak için kullanılır. Bunu kullanmak çok kolay, basit, değerleri yıldan saniyeye girin ve RTC o andan itibaren başlayacaktır. Örneğin, aşağıdaki tarih ve saati ayarlamak isterseniz – 26 Kasım 2014 Çarşamba ve 21:42 ve 30 saniye – şunları kullanırsınız:

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

Aşama 3:

Zamanın 24 saatlik zaman kullanılarak ayarlandığını ve dördüncü parametrenin “haftanın günü” olduğunu unutmayın. Bu, sırasıyla Pazar-Cumartesi olan 1 ile 7 arasında düşer. Kendi değişkenlerinizi değiştiriyorsanız, bu parametreler bayt değerleridir.

Fonksiyonu bir kez çalıştırdıktan sonra, önüne // eklemek ve kodunuzu tekrar yüklemek akıllıca olacaktır, bu nedenle güç açıldıktan veya mikro denetleyici sıfırlandıktan sonra zamanı sıfırlamayacaktır. RTC'nizden zamanı okumak da aynı derecede basittir, aslında süreç displayTime() fonksiyonu içinde düzgün bir şekilde takip edilebilir. RTC'den gelen verileri depolamak için yedi bayt değişken tanımlamanız gerekecektir ve bunlar daha sonra readDS3231time() işlevine eklenir. Örneğin, değişkenleriniz:

bayt saniye, dakika, saat, Haftanın günü, Ayın günü, ay, yıl;

… aşağıdakileri kullanarak RTC'den gelen mevcut verilerle bunları yenilersiniz:

readDS3232time(&saniye, &dakika, &saat, &dayOfWeek, &dayOfMonth, &ay, &year);

Ardından, örnek çizimde olduğu gibi saat ve tarihin seri monitöre gönderilmesinden, verileri her türlü çıktı aygıtı için uygun bir forma dönüştürmeye kadar değişkenleri uygun gördüğünüz şekilde kullanabilirsiniz.

Her şeyin çalıştığını kontrol etmek için, demo çizimine uygun saat ve tarihi girin, yükleyin, setDS3231time() işlevini yorumlayın ve yeniden yükleyin. Ardından seri monitörü açın ve size geçerli saat ve tarihin çalışan bir görüntüsü sağlanmalıdır.

Bu noktadan itibaren artık verileri ayarlamak ve gerçek zamanlı saat modülünüzden almak için yazılım araçlarına sahipsiniz ve umarız bu ucuz modüllerin nasıl kullanılacağını anlamışsınızdır.

Üreticinin web sitesinden - DS1307 ve DS3231 - belirli gerçek zamanlı saat IC'leri hakkında daha fazla bilgi edinebilirsiniz.

Bu gönderi size pmdway.com tarafından getirildi - dünya çapında ücretsiz teslimat ile üreticiler ve elektronik meraklıları için her şey.

Önerilen: