İçindekiler:
Video: Arduino Kayan Metin Saati: 3 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:19
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
Üç 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:
Kayan Metin Ekranı (A'dan Z'ye Kılavuz): 25 Adım (Resimlerle)
Kayan Metin Ekranı (A'dan Z'ye Kılavuzu): Bu talimatta / videoda, Arduino ile kayan metin ekranının nasıl yapılacağı adım adım talimatlarla size rehberlik edeceğim. Arduino için nasıl kod yapılır onu anlatmayacağım, size mevcut kodu nasıl kullanacağınızı göstereceğim. Neyi ve nerede bir araya gelmeniz gerekiyor
ESP8266'yı Kullanan Ağ Saati Dijital Saati: 4 Adım (Resimlerle)
ESP8266'yı Kullanarak Ağ Saati Dijital Saati: NTP sunucuları ile iletişim kuran ve ağ veya internet saatini gösteren küçük şirin bir dijital saatin nasıl oluşturulacağını öğreniyoruz. WeMos D1 mini'yi bir WiFi ağına bağlanmak, NTP zamanını almak ve bir OLED modülünde görüntülemek için kullanıyoruz.Yukarıdaki video t
Emeklilik Saati / Sayım/Dn Saati: 4 Adım (Resimli)
Emeklilik Saati / Sayım / Dn Saati: Çekmecede bu 8x8 LED nokta vuruşlu ekranlardan birkaçı vardı ve onlarla ne yapacağımı düşünüyordum. Diğer talimatlardan esinlenerek, gelecekteki bir tarihe/saate geri sayım yapmak için bir geri sayım/yukarı geri sayım ekranı oluşturma fikrini aldım ve eğer hedef zaman p
Bir Arduino'yu Kitaplık Olmadan Kayan Bir Metin Görüntülemek İçin Başka Bir Arduino Kullanarak Programlamak: 5 Adım
Bir Arduino'yu Kitaplık Olmadan Kayan Bir Metni Görüntülemek için Başka Bir Arduino Kullanarak Programlama: Sony Spresense veya Arduino Uno o kadar pahalı değil ve çok fazla güç gerektirmez. Ancak projenizin güç, alan ve hatta bütçe kısıtlaması varsa Arduino Pro Mini kullanmayı düşünebilirsiniz. Arduino Pro Micro'nun aksine, Arduino Pro Mi
İnternet Saati: NTP Protokolüyle ESP8266 NodeMCU Kullanan OLED İle Tarih ve Saati Görüntüleme: 6 Adım
İnternet Saati: OLED ile Tarih ve Saati Görüntüleme ESP8266 ile NodeMCU Kullanarak NTP Protokolü ile: Merhaba arkadaşlar, bu talimatta internetten zaman alacak bir internet saati oluşturacağız, böylece bu projenin çalışması için herhangi bir RTC'ye ihtiyacı olmayacak, sadece bir çalışan internet bağlantısı Ve bu proje için bir esp8266'ya ihtiyacınız var