Mündəricat:

Arduino Kaydırma Mətn Saatı: 3 addım
Arduino Kaydırma Mətn Saatı: 3 addım

Video: Arduino Kaydırma Mətn Saatı: 3 addım

Video: Arduino Kaydırma Mətn Saatı: 3 addım
Video: Как использовать термопару MAX6675 типа k с Arduino 2024, Noyabr
Anonim
Arduino Kaydırma Mətn Saatı
Arduino Kaydırma Mətn Saatı

Bu layihənin məqsədi, vaxtın necə danışıldığını göstərən bir mətn saatı qurmaqdır (məsələn, "gecə yarısıdır").

Bu sürətli bir layihədir - biz sizə aparat və eskizlə davam etmək üçün kifayət qədər şey veririk və sonra ehtiyaclarınıza uyğun olaraq daha da irəli apara bilərsiniz.

Addım 1: Avadanlıq

Avadanlıq
Avadanlıq

Üç əsas maddəyə ehtiyacınız olacaq -

  • Arduino Uno ilə uyğun bir lövhə
  • bir DS1307 və ya DS3231 IC istifadə edərək real vaxt saatı dövrə və ya modul
  • və monoxrom P10 tipli LED displey

Xarici bir enerji təchizatı istəyə bilərsiniz, amma bunu daha sonra əldə edəcəyik.

Birinci mərhələ, real vaxt saatınıza uyğunlaşmaqdır. Bunun üçün yardıma ehtiyacınız varsa, təlimat üçün bura vurun.

İndiyə qədər "vaxtı necə təyin edirsən?" Deyə düşünürsən.

Bu sualın iki cavabı var. DS3231 -dən istifadə edirsinizsə, dəqiqliyi çox yaxşı olduğu üçün onu eskizdə yerləşdirin (aşağıya baxın), gün işığına qənaət etmək üçün ildə iki dəfə eskizi yeni vaxtla yükləməlisiniz.

Əks təqdirdə sadə bir istifadəçi interfeysi əlavə edin-bir neçə düymə bunu edə bilər. Nəhayət, cihazı DMD -nin arxasına qoymalısınız. Öz ehtiyaclarınızı ödəmək üçün bir çox sahə var, sadə bir həll, idarəetmə lövhəsini hizalamaq ola bilər, beləliklə USB soketinə asanlıqla daxil ola bilərsiniz və sonra onu bir az Sugru ilə yapışdırın.

Saatın gücünə gəldikdə - Arduinodan BİR LED ekranı işlədə bilərsiniz və daxili istifadə üçün yaxşı bir parlaqlıqda işləyir. DMD-nin tam işləməsini istəyirsinizsə, retinanı yandıran parlaqlıq üçün ayrıca 5V 4A DC enerji təchizatı istifadə etməlisiniz. İki DMD istifadə edirsinizsə - bu 8A -ya gedir və s. Sadəcə xarici gücü bir DMD terminalına qoşun (ikinci və ya daha çox DMD -ni bu terminallara qoşun).

Elektrik təchizatı kabelinizin ucunu kəsmək istəmirsinizsə, bir DC prizindən istifadə edin.

Addım 2: Arduino Sketch

Aşağıdakı iki Arduino kitabxanasını - TimerOne və DMD qurmalısınız. Sonra eskizi yükləyin:

// RTC #üçün "Wire.h" daxil edin #DS1307_I2C_ADDRESS 0x68 təyin edin // DS1307 RTC 0x68 -dir

// LED ekran üçün

#"SPI.h" daxil edin "" DMD.h "daxil edin" "TimerOne.h" daxil edin "" SystemFont5x7.h "daxil edin" "Arial_black_16.h" daxil edin #DISPLAYS_ACROSS 1 müəyyən edin // birdən çox DMD -ə sahib ola bilərsiniz sıra #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // DMD -də göstərmək üçün son cümləni saxlamaq üçün istifadə olunur

void ScanDMD () // DMD üçün tələb olunur

{dmd.scanDisplayBySPI (); }

boş quraşdırma ()

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

// RTC üçün

Wire.begin (); // I2C avtobus baytını saniyə, dəqiqə, saat, dayOfWeek, dayOfMonth, ay, il yandırın; // dəyişənləri dəyişdirin və vaxtı təyin etmək üçün setDateDs1307-ə şərh yazmayın // sonra funksiyanı yenidən şərh edin və eskizi yenidən ikinci dəfə yükləyin = 0; dəqiqə = 13; saat = 23; dayOfWeek = 4; dayOfMonth = 19; ay = 5; il = 13; // setDateDs1307 (saniyə, dəqiqə, saat, dayOfWeek, dayOfMonth, ay, il); }

// adi RTC funksiyaları

// Normal ondalık ədədlərini ikili kodlu onlu baytlara çevir decToBcd (byte val) {return ((val/10*16) + (val%10)); }

// İkili kodlu onluğu normal onluq ədədlərə çevirin

bayt bcdToDec (bayt dəyər) {qaytar ((val/16*10) + (dəyər%16)); }

boşluq setDateDs1307 (bayt saniyə, // 0-59

bayt dəqiqə, // 0-59 bayt saat, // 1-23 bayt günOfWeek, // 1-7 bayt günOfMonth, // 1-28/29/bayt ay, // 1-12 bayt il) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (ikinci)); // 0 -dan bit 7 -ə qədər Wire.write (decToBcd (dəqiqə)) saatı başlayır; Wire.write (decToBcd (saat)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (ay)); Wire.write (decToBcd (il)); Wire.write (00010000); // nəzarət reyestrinə 0x10 (hex) 00010000 (ikili) göndərir - Wire.endTransmission () kvadrat dalğasını işə salır; }

// Tarix və saatı ds1307 -dən alır

void getDateDs1307 (bayt *saniyə, bayt *dəqiqə, bayt *saat, bayt *dayOfWeek, bayt *dayOfMonth, bayt *ay, bayt *il) {// Wire.beginTransmission qeyd qeydini sıfırlayın (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Bunlardan bir neçəsinə maskalar lazımdır, çünki müəyyən bitlər nəzarət bitidir

*saniyə = bcdToDec (Wire.read () & 0x7f); *dəqiqə = bcdToDec (Wire.read ()); *saat = bcdToDec (Wire.read () & 0x3f); // Saat 12/am *dayOfWeek = bcdToDec (Wire.read ()) olduqda bunu dəyişdirmək lazımdır; *dayOfMonth = bcdToDec (Wire.read ()); *ay = bcdToDec (Wire.read ()); *il = bcdToDec (Wire.read ()); }

void drawText (oldString String)

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

boşluq createTextTime (int ss, int mm)

// bu, bütün vaxt məlumatlarını mətnə bir cümlə kimi yığır {finalString = ""; // xüsusi hallar üçün cümləni silin (aşağıda) finalString = finalString+"Bu";

// indi saatı əlavə edin

əgər (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+"four"; } if (hh == 5 || hh == 17) {finalString = finalString+"beş"; } if (hh == 6 || hh == 18) {finalString = finalString+"altı"; } if (hh == 7 || hh == 19) {finalString = finalString+"yeddi"; } if (hh == 8 || hh == 20) {finalString = finalString+"səkkiz"; } if (hh == 9 || hh == 21) {finalString = finalString+"dokuz"; } if (hh == 10 || hh == 22) {finalString = finalString+"on"; } if (hh == 11 || hh == 23) {finalString = finalString+"on bir"; }

// indi dəqiqə əlavə edin

keçid (mm) {hal 1: finalString = finalString+"oh one"; fasilə; hal 2: finalString = finalString+"oh iki"; fasilə; hal 3: finalString = finalString+"oh üç"; fasilə; hal 4: finalString = finalString+"oh dörd"; fasilə; hal 5: finalString = finalString+"beş beş"; fasilə; hal 6: finalString = finalString+"oh altı"; fasilə; hal 7: finalString = finalString+"oh yeddi"; fasilə; hal 8: finalString = finalString+"oh səkkiz"; fasilə; hal 9: finalString = finalString+"oh doqquz"; fasilə; hal 10: finalString = finalString+"on"; fasilə; hal 11: finalString = finalString+"on bir"; fasilə; hal 12: finalString = finalString+"on iki"; fasilə; hal 13: finalString = finalString+"on üç"; fasilə; hal 14: finalString = finalString+"on dörd"; fasilə; hal 15: finalString = finalString+"on beş"; fasilə; hal 16: finalString = finalString+"on altı"; fasilə; hal 17: finalString = finalString+"on yeddi"; fasilə; hal 18: finalString = finalString+"on səkkiz"; fasilə; hal 19: finalString = finalString+"on doqquz"; fasilə; hal 20: finalString = finalString+"iyirmi"; fasilə; hal 21: finalString = finalString+"iyirmi bir"; fasilə; hal 22: finalString = finalString+"iyirmi iki"; fasilə; hal 23: finalString = finalString+"iyirmi üç"; fasilə; hal 24: finalString = finalString+"iyirmi dörd"; fasilə; hal 25: finalString = finalString+"iyirmi beş"; fasilə; hal 26: finalString = finalString+"iyirmi altı"; fasilə; hal 27: finalString = finalString+"iyirmi yeddi"; fasilə; hal 28: finalString = finalString+"iyirmi səkkiz"; fasilə; hal 29: finalString = finalString+"iyirmi doqquz"; fasilə; hal 30: finalString = finalString+"otuz"; fasilə; hal 31: finalString = finalString+"otuz bir"; fasilə; hal 32: finalString = finalString+"otuz iki"; fasilə; hal 33: finalString = finalString+"otuz üç"; fasilə; hal 34: finalString = finalString+"otuz dörd"; fasilə; hal 35: finalString = finalString+"otuz beş"; fasilə; hal 36: finalString = finalString+"otuz altı"; fasilə; hal 37: finalString = finalString+"otuz yeddi"; fasilə; hal 38: finalString = finalString+"otuz səkkiz"; fasilə; hal 39: finalString = finalString+"otuz doqquz"; fasilə; hal 40: finalString = finalString+"qırx"; fasilə; hal 41: finalString = finalString+"qırx bir"; fasilə; hal 42: finalString = finalString+"qırx iki"; fasilə; hal 43: finalString = finalString+"qırx üç"; fasilə; hal 44: finalString = finalString+"qırx dörd"; fasilə; hal 45: finalString = finalString+"qırx beş"; fasilə; hal 46: finalString = finalString+"qırx altı"; fasilə; iş 47: finalString = finalString+"qırx yeddi"; fasilə; hal 48: finalString = finalString+"qırx səkkiz"; fasilə; hal 49: finalString = finalString+"qırx doqquz"; fasilə; hal 50: finalString = finalString+"əlli"; fasilə; hal 51: finalString = finalString+"əlli bir"; fasilə; hal 52: finalString = finalString+"əlli iki"; fasilə; hal 53: finalString = finalString+"əlli üç"; fasilə; hal 54: finalString = finalString+"əlli dörd"; fasilə; hal 55: finalString = finalString+"əlli beş"; fasilə; hal 56: finalString = finalString+"əlli altı"; fasilə; hal 57: finalString = finalString+"əlli yeddi"; fasilə; hal 58: finalString = finalString+"əlli səkkiz"; fasilə; iş 59: finalString = finalString+"əlli doqquz"; fasilə; }

// günorta?

if (hh == 12 && mm == 0) {finalString = finalString+"midday"; } // gecə yarısı? if (hh == 00 && mm == 0) {finalString = finalString+"gecə yarısı"; }

}

boşluq döngəsi ()

{// vaxtı RTC baytından saniyə, dəqiqə, saat, dayOfWeek, dayOfMonth, ay, il əldə edin; getDateDs1307 (& ikinci, & dəqiqə, & saat, & dayOfWeek, & dayOfMonth, & ay, & il);

// vaxtı cümlə sətirinə çevirin

createTextTime (saat, dəqiqə);

// indi mətni DMD -yə göndərin

drawText (finalString); }

Eskiz, DS1307/3232 real vaxt saat IC-lərindən vaxtı təyin etmək və almaq üçün adi funksiyalara malikdir və bütün saatlarla olduğu kimi, vaxt məlumatlarını boşluq parametrlərində dəyişənlərə daxil edə bilərsiniz (), sonra setDateDs1307 (), eskizi yükləyin, setDateDs1307-ni yenidən şərh edin, sonra eskizi bir daha yükləyin. Hər hansı bir hardware əsaslı istifadəçi interfeysi əlavə etməmisinizsə, vaxtı yenidən təyin etmək üçün bu prosesi təkrarlayın.

Addım 3:

Void loop () -da vaxt alındıqdan sonra createTextTime () funksiyasına ötürülür. Bu funksiya "Bu" ilə başlayaraq göstəriləcək mətn simvolunu yaradır və sonra cari vaxtdan asılı olaraq hansı sözlərin təqib olunacağını təyin edir. Nəhayət drawText () funksiyası mətni tutan sətri DMD -ə ötürülə bilən bir xarakter dəyişəninə çevirir.

Tövsiyə: