İçindekiler:

Arduino ile Gerçek Zamanlı Saat: 3 Adım
Arduino ile Gerçek Zamanlı Saat: 3 Adım

Video: Arduino ile Gerçek Zamanlı Saat: 3 Adım

Video: Arduino ile Gerçek Zamanlı Saat: 3 Adım
Video: Arduino Dijital Saat Yapımı (RTC/Saat Modülü Kullanımı) 2024, Temmuz
Anonim
Arduino ile Gerçek Zamanlı Saat
Arduino ile Gerçek Zamanlı Saat

Bu projemizde Arduino ve RTC modülü yardımı ile saat yapacağız. Arduino'nun gerçek zamanı gösteremeyeceğini bildiğimiz için, LCD'de doğru zamanı görüntülemek için RTC modülünü kullanacağız. Tüm adımı dikkatlice okuyun, saatin işleyişini yapmanıza çok yardımcı olacaktır.

DS3231 Arduino kodu, DS1307 kodu gibidir ve her iki RTC yongası ile çalışır.

Aşağıdaki Arduino kodu, DS3231 RTC için herhangi bir kitaplık kullanmaz, Wire kitaplığı, I2C kuralını kullanan Arduino ve DS3231 arasındaki yazışmalar içindir.

Evet! Birçok elektronik mühendisi, zamana dayalı projeleri için buna güvenir, ancak RTC tamamen güvenilir değildir. Pille çalışır ve er ya da geç değiştirilmesi gerekir. IoT projelerine gelince, değerli SPI (Seri Çevre Birimi) pinlerini işgal eder ve etrafta dolaşan kablolarla dağınık hale gelir. Çözüm…. İşte kahramanımız NTP(Ağ zaman protokolü) geliyor. NTP internetten zaman aldığı için çok doğru. Bu protokolü bir istemci-sunucu modu kullanarak çalıştıracağız. işlem o kadar basittir ki Nodemcu bir istemci gibi davranır ve UDP kullanarak sunucudan bir NTP paketi ister. Karşılığında sunucu, istemciye verileri ayrıştıran bir paket gönderir. NTP, evrensel zaman senkronizasyon protokolüdür. Şimdi laboratuvar çalışma istasyonumuzu aydınlatalım

Adım 1: Gerekli Bileşenler

  • Arduino kurulu
  • DS3231 RTC kartı
  • 16x2 LCD ekran
  • 2 x basma düğmesi
  • 10K ohm değişken direnç (veya potansiyometre)
  • 330-ohm direnç
  • 3V düğme pil
  • ekmek tahtası
  • Atlama telleri

RTC molekülü DS3231

Zaman, insanların bu hızlı tempolu dünyasında gerekli olan temel bir duyudur. Gerçek zamanlı projede

RTC (A. K. A Gerçek zamanlı saat) kullanıyoruz

RTC Gerçek zamanlı saat (RTC), mevcut zamanı takip eden bir entegre devredir (IC). RTC, gerçek modda zamanı önemser. RTC genellikle bilgisayar anakartlarında ve gömülü sistemlerde bulunur ve zamanında erişim gerektirir.

Adım 2: Arduino Saatinin Bağlantısı

Arduino Saat Bağlantısı
Arduino Saat Bağlantısı
  • SCL pinini RTC modülüne Arduino A5'e bağlayın
  • SDA pinini RTC modülüne Arduino A4'e bağlayın
  • VCC'yi 5v'ye ve GND'yi GND'ye bağlayın
  • Pim 8'e bir buton bağlayın
  • Pin 9'a başka bir buton bağlayın
  • LCD'nin RS'sini Arduino'nun pin 2'sine bağlayın
  • LCD'nin E'sini Arduino'nun 3. pinine bağlayın
  • LCD'nin D7'sini Arduino'nun 7 numaralı pinine bağlayın
  • LCD'nin D6'sını Arduino'nun 6 numaralı pinine bağlayın
  • LCD'nin D5'ini Arduino'nun 5 numaralı pinine bağlayın
  • LCD'nin D4'ünü Arduino'nun 4 numaralı pinine bağlayın
  • VSS & K'yi GND'ye bağlayın
  • VDD ve A'yı 5v'ye bağlayın
  • vo'yu potansiyometre çıkış pinine bağlayın

Adım 3: RTC ile Arduino Saati Kodu

RTC ile Arduino Saat Kodu
RTC ile Arduino Saat Kodu

DS3231 yalnızca BCD formatı ile çalışır ve BCD'yi ondalık sayıya dönüştürmek ve tam tersi için aşağıdaki 2 satırı kullandım (dakika için örnek):// BCD'yi ondalık dakikaya dönüştür = (dakika >> 4) * 10 + (dakika ve 0x0F);

// Ondalık sayıyı BCDdakika'ya çevir = ((dakika / 10) << 4) + (dakika % 10); void DS3231_display(): zamanı ve takvimi görüntülemeden önce zamanı ve takvimi görüntüler ve takvim verileri BCD'den ondalık formata dönüştürülür.void blur_parameter():

// DS3231 ve Arduino kullanarak set butonları ile gerçek zamanlı saat ve takvim // LCD kütüphane kodunu içerir #include // Wire kütüphane kodunu içerir (I2C protokol cihazları için gereklidir) #include // LCD modül bağlantıları (RS, E, D4, D5), D6, D7) LiquidCrystal lcd(2, 3, 4, 5, 6, 7); geçersiz kurulum() { pinMode(8, INPUT_PULLUP); // button1 pin 8 pinMode(9, INPUT_PULLUP)'a bağlı; // button2 pin 9'a bağlı // LCD'nin sütun ve satır sayısını ayarla lcd.begin(16, 2); Wire.begin(); // i2c bus'a katıl } char Time = "TIME::: "; char Takvim = "TARİH: / /20"; bayt i, saniye, dakika, saat, tarih, ay, yıl; void DS3231_display(){ // BCD'yi saniyeye çevir = (saniye >> 4) * 10 + (saniye & 0x0F); dakika = (dakika >> 4) * 10 + (dakika ve 0x0F); saat = (saat >> 4) * 10 + (saat & 0x0F); tarih = (tarih >> 4) * 10 + (tarih ve 0x0F); ay = (ay >> 4) * 10 + (ay ve 0x0F); yıl = (yıl >> 4) * 10 + (yıl & 0x0F); // Dönüştürmeyi Sonlandırma Süresi[12] = saniye % 10 + 48; Zaman[11] = saniye / 10 + 48; Zaman[9] = dakika % 10 + 48; Zaman[8] = dakika / 10 + 48; Zaman[6] = saat % 10 + 48; Zaman[5] = saat / 10 + 48; Takvim[14] = yıl % 10 + 48; Takvim[13] = yıl / 10 + 48; Takvim[9] = ay % 10 + 48; Takvim[8] = ay / 10 + 48; Takvim[6] = tarih % 10 + 48; Takvim[5] = tarih / 10 + 48; lcd.setCursor(0, 0); lcd.print(Zaman); // Zamanı göster lcd.setCursor(0, 1); lcd.print(Takvim); // Takvimi göster } void flash_parameter(){ byte j = 0; while(j 23) // Eğer saat > 23 ==> saat = 0 parametre = 0; if(i == 1 && parametre > 59) // Eğer dakika > 59 ==> dakika = 0 parametre = 0; if(i == 2 && parametre > 31) // Eğer tarih > 31 ==> tarih = 1 parametre = 1; if(i == 3 && parametre > 12) // Eğer ay > 12 ==> ay = 1 parametre = 1; if(i == 4 && parametre > 99) // Yıl > 99 ==> ise yıl = 0 parametre = 0; sprintf(metin, "%02u", parametre); lcd.setCursor(x,y); lcd.print(metin); gecikme(200); // 200ms bekle } lcd.setCursor(x,y); lcd.print(" "); // İki boşluk göster blur_parameter(); sprintf(metin, "%02u", parametre); lcd.setCursor(x,y); lcd.print(metin); yanıp sönen_parametre(); if(!digitalRead(8)){ // Düğmeye (pin #8) basılırsa i++; // Bir sonraki parametre dönüş parametresi için 'i' artırın; // Parametre değerini döndür ve çık } } } void loop() { if(!digitalRead(8)){ // Düğmeye (pin #8) basılırsa i = 0; saat = edit(5, 0, saat); dakika = edit(8, 0, dakika); tarih = edit(5, 1, tarih); ay = edit(8, 1, ay); yıl = edit(13, 1, yıl); // Ondalık sayıyı BCD'ye çevir dakika = ((dakika / 10) << 4) + (dakika % 10); saat = ((saat / 10) << 4) + (saat % 10); tarih = ((tarih / 10) << 4) + (tarih % 10); ay = ((ay / 10) << 4) + (ay % 10); yıl = ((yıl / 10) << 4) + (yıl % 10); // Dönüştürmeyi sonlandır // DS3231 RTC'ye veri yaz Wire.beginTransmission(0x68); // DS3231 adresi Wire.write(0) ile I2C protokolünü başlatın; // Kayıt adresini gönder Wire.write(0); // Sesleri sıfırla ve osilatörü başlat Wire.write(dakika); // Dakikayı yaz Wire.write(saat); // Saati yaz Wire.write(1); // Günü yaz (kullanılmıyor) Wire.write(tarih); // Tarih yaz Wire.write(ay); // Ay yaz Wire.write(yıl); // Yılı yazın Wire.endTransmission(); // İletimi durdur ve I2C veri yolu gecikmesini serbest bırak(200); // 200ms bekle } Wire.beginTransmission(0x68); // DS3231 adresi Wire.write(0) ile I2C protokolünü başlatın; // Kayıt adresini gönder Wire.endTransmission(false); // I2C Wire.requestFrom(0x68, 7); // DS3231'den 7 bayt iste ve ikinci okumanın sonunda I2C veri yolunu serbest bırak = Wire.read(); // Kayıttan saniyeleri oku 0 dakika = Wire.read(); // Kayıttan dakikaları oku 1 saat = Wire.read(); // register 2 Wire.read(); // Kayıt 3'ten günü oku (kullanılmıyor) tarih = Wire.read(); // Kayıttan okuma tarihi 4 ay = Wire.read(); // Kayıttan ayı oku 5 yıl = Wire.read(); // yılı register 6'dan oku DS3231_display(); // Diaplay zamanı ve takvim gecikmesi(50); // 50ms bekle }

Önerilen: