İçindekiler:

Arduino Kayan Metin Saati: 3 Adım
Arduino Kayan Metin Saati: 3 Adım

Video: Arduino Kayan Metin Saati: 3 Adım

Video: Arduino Kayan Metin Saati: 3 Adım
Video: Arduino LCD Ekran Kullanımı | I2C modüllü 2x16 LCD Ekran 2024, Temmuz
Anonim
Arduino Kayan Metin Saati
Arduino Kayan Metin Saati

Bu projenin amacı, zamanı söylendiği gibi gösteren kayan bir metin saati oluşturmaktır (örneğin, "gece yarısı").

Bu hızlı bir projedir – size donanım ve eskiz ile başlamanız için yeterince şey veriyoruz ve ardından ihtiyaçlarınıza göre daha ileri götürebilirsiniz.

Adım 1: Donanım

Donanım
Donanım

Üç ana öğeye ihtiyacınız olacak -

  • Arduino Uno uyumlu bir kart
  • DS1307 veya DS3231 IC kullanan gerçek zamanlı bir saat devresi veya modülü
  • ve monokrom P10 tarzı bir LED ekran

Harici bir güç kaynağı isteyebilirsiniz, ancak buna daha sonra geleceğiz.

İlk aşama, gerçek zamanlı saatinize uymaktır. Bununla ilgili yardıma ihtiyacınız varsa öğretici için buraya tıklayın.

Şimdiye kadar umarım “zamanı nasıl ayarlarsınız?” diye düşünüyorsunuzdur.

Bu sorunun iki cevabı var. DS3231'i kullanıyorsanız, doğruluk çok iyi olduğu için çizimde ayarlayın (aşağıya bakın), gün ışığından yararlanma tasarrufunu karşılamak için yalnızca yeni saatle taslağı yılda iki kez yüklemeniz gerekir.

Aksi takdirde basit bir kullanıcı arayüzü ekleyin - birkaç düğme bunu yapabilir. Son olarak, donanımı DMD'nin arkasına koymanız yeterlidir. Kendi ihtiyaçlarınızı karşılayacak çok fazla alan var, basit bir çözüm, USB soketine kolayca erişebilmeniz için kontrol panosunu hizalamak olabilir - ve sonra biraz Sugru ile yapıştırın.

Saate güç vermeyle ilgili olarak - Arduino'dan ONE LED ekran çalıştırabilirsiniz ve iç mekan kullanımı için iyi bir parlaklıkta çalışır. DMD'nin tam, retina yakan parlaklıkta çalışmasını istiyorsanız, ayrı bir 5V 4A DC güç kaynağı kullanmanız gerekir. İki DMD kullanıyorsanız – bu 8A'ya gider vb. Harici gücü bir DMD terminaline bağlamanız yeterlidir (ikinci veya daha fazla DMD'yi bu terminallere bağlayın).

Güç kaynağı kablonuzun ucunu kesmek istemiyorsanız, bir DC soket çıkışı kullanın.

Adım 2: Arduino Kroki

Aşağıdaki iki Arduino kütüphanesini kurmanız gerekecek - TimerOne ve DMD. Ardından taslağı yükleyin:

// RTC#include "Wire.h" için #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC 0x68'dir

// LED ekran için

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // birden fazla DMD'niz olabilir satır #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // DMD'de görüntülenecek son cümleyi tutmak için kullanılır

void ScanDMD() // DMD için gerekli

{ dmd.scanDisplayBySPI(); }

geçersiz kurulum()

{ // DMD Timer1.initialize(5000 için); Timer1.attachInterrupt(ScanDMD); dmd.clearScreen(doğru);

// RTC için

Wire.begin(); // I2C veri yolu baytını başlat saniye, dakika, saat, haftanın günü, ayın günü, ay, yıl; // değişkenleri değiştirin ve zamanı ayarlamak için setDateDs1307'nin yorumunu kaldırın // sonra işlevi yeniden yorumlayın ve çizimi tekrar yükleyin saniye = 0; dakika = 13; saat = 23; haftanın günü = 4; günOfAy = 19; ay = 5; yıl = 13; // setDateDs1307(saniye, dakika, saat, Haftanın günü, Ayın günü, ay, yıl); }

// olağan RTC işlevleri

// Normal ondalık sayıları ikili kodlanmış ondalık bayta çevir decToBcd(byte val) { return ((val/10*16) + (val%10)); }

// İkili kodlanmış ondalık sayıyı normal ondalık sayılara dönüştür

bayt bcdToDec(bayt değeri) { dönüş ((değer/16*10) + (değer %16)); }

void setDateDs1307(bayt saniye, // 0-59

bayt dakika, // 0-59 bayt saat, // 1-23 baytHaftanın günü, // 1-7 bayt ayAy, // 1-28/29/bayt ay, // 1-12 bayt yıl) // 0- 99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(saniye)); // 0 ila bit 7 saati başlatır Wire.write(decToBcd(dakika)); Wire.write(decToBcd(saat)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(ay)); Wire.write(decToBcd(yıl)); Wire.write(00010000); // kontrol kaydına 0x10 (hex) 00010000 (ikili) gönderir - kare dalgayı açar Wire.endTransmission(); }

// ds1307'den tarih ve saati alır

void getDateDs1307(bayt *saniye, bayt *dakika, bayt *saat, bayt *haftanın günü, bayt *ayAy, bayt *ay, bayt *yıl) { // Kayıt işaretçisini sıfırlayın Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// Bazı bitler kontrol biti olduğu için bunlardan birkaçı maskeye ihtiyaç duyar

*ikinci = bcdToDec(Wire.read() & 0x7f); *dakika = bcdToDec(Wire.read()); *saat = bcdToDec(Wire.read() & 0x3f); // Eğer 12 saat am/pm ise bunu değiştirmemiz gerekiyor *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *ay = bcdToDec(Wire.read()); *yıl = bcdToDec(Wire.read()); }

void drawText(String oldString)

{ dmd.clearScreen(doğru); dmd.selectFont(Arial_Black_16); char yeniString[256]; int sLength = oldString.length(); oldString.toCharArray(newString, sLength+1); dmd.drawMarquee(newString, sLength, (32*DISPLAYS_ACROSS)-1, 0); uzun başlangıç=milis(); uzun zamanlayıcı=başlangıç; uzun zamanlayıcı2=başlangıç; boolean ret=yanlış; while(!ret){ if ((zamanlayıcı+20) < millis()) { ret=dmd.stepMarquee(-1, 0); zamanlayıcı=milis(); } } }

geçersiz createTextTime(int hh, int mm)

// bu, tüm zaman verilerini tek bir cümle olarak metne dönüştürür { finalString=" "; // özel durumlar için cümleyi sil (aşağıda) finalString=finalString+"It's ";

// şimdi saati ekle

if (hh==1 || hh==13) { finalString=finalString+"bir "; } if (hh==2 || hh==14) { finalString=finalString+"iki"; } if (hh==3 || hh==15) { finalString=finalString+"üç "; } if (hh==4 || hh==16) { finalString=finalString+"dört"; } if (hh==5 || hh==17) { finalString=finalString+"beş"; } if (hh==6 || hh==18) { finalString=finalString+"six"; } if (hh==7 || hh==19) { finalString=finalString+"seven "; } if (hh==8 || hh==20) { finalString=finalString+"sekiz"; } if (hh==9 || hh==21) { finalString=finalString+"nine "; } if (hh==10 || hh==22) { finalString=finalString+"ten "; } if (hh==11 || hh==23) { finalString=finalString+"eleven "; }

// şimdi dakikaları ekle

switch(mm){ durum 1: finalString=finalString+"oh one"; kırmak; durum 2: finalString=finalString+"ah iki"; kırmak; durum 3: finalString=finalString+"ah üç"; kırmak; durum 4: finalString=finalString+"ah dört"; kırmak; durum 5: finalString=finalString+"ah beş"; kırmak; durum 6: finalString=finalString+"oh altı"; kırmak; durum 7: finalString=finalString+"oh yedi"; kırmak; durum 8: finalString=finalString+"oh sekiz"; kırmak; durum 9: finalString=finalString+"oh dokuz"; kırmak; durum 10: finalString=finalString+"ten"; kırmak; durum 11: finalString=finalString+"onbir"; kırmak; durum 12: finalString=finalString+"on iki"; kırmak; durum 13: finalString=finalString+"onüç"; kırmak; durum 14: finalString=finalString+"on dört"; kırmak; durum 15: finalString=finalString+"onbeş"; kırmak; durum 16: finalString=finalString+"onaltı"; kırmak; durum 17: finalString=finalString+"yedi"; kırmak; durum 18: finalString=finalString+"onsekiz"; kırmak; durum 19: finalString=finalString+"dokuz"; kırmak; durum 20: finalString=finalString+"yirmi"; kırmak; durum 21: finalString=finalString+"yirmi bir"; kırmak; durum 22: finalString=finalString+"yirmi iki"; kırmak; durum 23: finalString=finalString+"yirmi üç"; kırmak; durum 24: finalString=finalString+"yirmi dört"; kırmak; durum 25: finalString=finalString+"yirmi beş"; kırmak; durum 26: finalString=finalString+"yirmi altı"; kırmak; durum 27: finalString=finalString+"yirmi yedi"; kırmak; durum 28: finalString=finalString+"yirmi sekiz"; kırmak; durum 29: finalString=finalString+"yirmi dokuz"; kırmak; vaka 30: finalString=finalString+"otuz"; kırmak; durum 31: finalString=finalString+"otuz bir"; kırmak; durum 32: finalString=finalString+"otuz iki"; kırmak; durum 33: finalString=finalString+"otuz üç"; kırmak; durum 34: finalString=finalString+"otuz dört"; kırmak; durum 35: finalString=finalString+"otuz beş"; kırmak; durum 36: finalString=finalString+"otuz altı"; kırmak; durum 37: finalString=finalString+"otuz yedi"; kırmak; durum 38: finalString=finalString+"otuz sekiz"; kırmak; case 39: finalString=finalString+"otuz dokuz"; kırmak; durum 40: finalString=finalString+"kırk"; kırmak; durum 41: finalString=finalString+"kırk bir"; kırmak; durum 42: finalString=finalString+"kırk iki"; kırmak; durum 43: finalString=finalString+"kırk üç"; kırmak; durum 44: finalString=finalString+"kırk dört"; kırmak; durum 45: finalString=finalString+"kırk beş"; kırmak; durum 46: finalString=finalString+"kırk altı"; kırmak; case 47: finalString=finalString+"kırk yedi"; kırmak; vaka 48: finalString=finalString+"kırk sekiz"; kırmak; durum 49: finalString=finalString+"kırk dokuz"; kırmak; vaka 50: finalString=finalString+"elli"; kırmak; durum 51: finalString=finalString+"elli bir"; kırmak; case 52: finalString=finalString+"elli iki"; kırmak; case 53: finalString=finalString+"elli üç"; kırmak; case 54: finalString=finalString+"elli dört"; kırmak; durum 55: finalString=finalString+"elli beş"; kırmak; case 56: finalString=finalString+"elli altı"; kırmak; durum 57: finalString=finalString+"elli yedi"; kırmak; durum 58: finalString=finalString+"elli sekiz"; kırmak; durum 59: finalString=finalString+"elli dokuz"; kırmak; }

// öğlen?

if (hh==12 && mm==0) { finalString=finalString+"gün ortası "; } // gece yarısı? if (hh==00 && mm==0) { finalString=finalString+"gece yarısı "; }

}

boşluk döngüsü()

{ // RTC baytından zamanı alın saniye, dakika, saat, haftanın günü, ayın günü, ay, yıl; getDateDs1307(&saniye, &dakika, &saat, &dayOfWeek, &dayOfMonth, &month, &year);

// zamanı bir cümle dizisine çevir

createTextTime(saat, dakika);

// şimdi metni DMD'ye gönder

drawText(finalString); }

Çizim, DS1307/3232 gerçek zamanlı saat IC'lerinden zamanı ayarlamak ve almak için olağan fonksiyonlara sahiptir ve tüm saatlerimizde olduğu gibi, void setup() içindeki değişkenlere zaman bilgilerini girebilir, ardından setDateDs1307() yorumunu kaldırabilirsiniz, taslağı yükleyin, setDateDs1307'yi yeniden yorumlayın, ardından taslağı bir kez daha yükleyin. Donanım tabanlı bir kullanıcı arabirimi eklemediyseniz, saati yeniden ayarlamak için bu işlemi tekrarlayın.

Aşama 3:

Void loop() içinde zaman alındığında, createTextTime() işlevine iletilir. Bu işlev, “It's” ile başlayarak görüntülenecek metin dizesini oluşturur ve ardından geçerli zamana bağlı olarak hangi sözcüklerin izleneceğini belirler. Son olarak drawText() işlevi, görüntülenecek metni tutan dizeyi DMD'ye iletilebilecek bir karakter değişkenine dönüştürür.

Önerilen: