Kazalo:

Arduino pomikajoča se besedilna ura: 3 koraki
Arduino pomikajoča se besedilna ura: 3 koraki

Video: Arduino pomikajoča se besedilna ura: 3 koraki

Video: Arduino pomikajoča se besedilna ura: 3 koraki
Video: Marlin Firmware - VScode PlatformIO Install - Build Basics 2024, November
Anonim
Arduino pomikajoča se besedilna ura
Arduino pomikajoča se besedilna ura

Namen tega projekta je izdelati drsno besedilno uro, ki prikazuje čas, ko se govori (na primer »polnoč je«).

To je hiter projekt - damo vam dovolj, da nadaljujete s strojno opremo in skico, nato pa lahko nadaljujete, da ustreza vašim potrebam.

1. korak: Strojna oprema

Strojna oprema
Strojna oprema

Potrebovali boste tri glavne predmete -

  • plošča, združljiva z Arduino Uno
  • vezje ali modul ure v realnem času z uporabo DS1307 ali DS3231 IC
  • in enobarvni LED zaslon v slogu P10

Morda boste želeli zunanji napajalnik, vendar bomo k temu prišli pozneje.

Prva stopnja je, da prilagodite svojo uro v realnem času. Če potrebujete pomoč pri tem, kliknite tukaj za vadnico.

Do sedaj upam, da razmišljate "kako nastavite čas?".

Na to vprašanje obstajata dva odgovora. Če uporabljate DS3231, ga samo nastavite na skici (glejte spodaj), ker je natančnost zelo dobra, morate skico z novim časom naložiti le dvakrat letno, da pokrijete poletni čas.

V nasprotnem primeru dodajte preprost uporabniški vmesnik-nekaj gumbov bi to lahko storilo. Nazadnje morate le postaviti strojno opremo na zadnjo stran DMD. Obstaja veliko možnosti za zadovoljitev lastnih potreb, preprosta rešitev je lahko, da nadzorno ploščo poravnate tako, da boste z lahkoto dostopali do vtičnice USB - in jo nato prilepite z nekaj Sugruja.

Kar zadeva napajanje ure - iz Arduina lahko zaženete EN LED zaslon, ki deluje pri dobri svetlosti za notranjo uporabo. Če želite, da DMD deluje pri polni svetlosti, ki gori na mrežnici, morate uporabiti ločeno 5V 4A enosmerno napajanje. Če uporabljate dva DMD -ja - to gre za 8A itd. Enostavno priključite zunanje napajanje na enega priključka DMD (drugi ali več DMD priključite na te priključke).

Če vam ni všeč, da bi odrezali konec napajalnega kabla, uporabite prekinitev enosmerne vtičnice.

2. korak: Skica Arduino

Namestiti morate naslednji dve knjižnici Arduino - TimerOne in DMD. Nato naložite skico:

// za RTC #vključite "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // RTC DS1307 je 0x68

// za LED zaslon

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // lahko imate več kot en DMD v vrstica #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // uporablja se za zadrževanje zadnjega stavka za prikaz na DMD

void ScanDMD () // potrebno za DMD

{dmd.scanDisplayBySPI (); }

void setup ()

{// za DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (res);

// za RTC

Wire.begin (); // sproži bajt vodila I2C sekunda, minuta, ura, danOfWeek, dayOfMonth, mesec, leto; // spremenite spremenljivke in razkomentirajte setDateDs1307, da nastavite čas // nato ponovno komentirajte funkcijo in znova naložite skico second = 0; minuta = 13; ura = 23; dayOfWeek = 4; dayOfMonth = 19; mesec = 5; leto = 13; // setDateDs1307 (druga, minuta, ura, dayOfWeek, dayOfMonth, mesec, leto); }

// običajne funkcije RTC

// Pretvorimo običajna decimalna števila v binarno kodiran decimalni bajt decToBcd (byte val) {return ((val/10*16) + (val%10)); }

// Pretvorimo binarno kodirano decimalko v običajna decimalna števila

bajt bcdToDec (bajt val) {return ((val/16*10) + (val%16)); }

void setDateDs1307 (sekunda bajtov, // 0-59

bajtna minuta, // 0-59 bajtna ura, // 1-23 bajtni danOfWeek, // 1-7 bajtni danOfMonth, // 1-28/29/bajtni mesec, // 1-12 bajtno leto) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (drugi)); // od 0 do bita 7 zažene uro Wire.write (decToBcd (minuta)); Wire.write (decToBcd (ura)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mesec)); Wire.write (decToBcd (leto)); Wire.write (00010000); // pošilja 0x10 (šestnajstiško) 00010000 (binarno) v krmilni register - vklopi kvadratni val Wire.endTransmission (); }

// Dobi datum in čas iz ds1307

void getDateDs1307 (bajt *sekunda, bajt *minuta, bajt *ura, bajt *dayOfWeek, bajt *dayOfMonth, bajt *mesec, bajt *leto) {// Ponastavi kazalec registra Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Nekaj teh potrebuje maske, ker so določeni bitovi kontrolni

*drugi = bcdToDec (Wire.read () & 0x7f); *minuta = bcdToDec (Wire.read ()); *ura = bcdToDec (Wire.read () & 0x3f); // To je treba spremeniti, če je 12 ur/popoldne *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *mesec = bcdToDec (Wire.read ()); *leto = bcdToDec (Wire.read ()); }

void drawText (String oldString)

{dmd.clearScreen (true); 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); dolg začetek = millis (); dolg časovnik = začetek; dolg časovnik2 = zagon; boolean ret = false; while (! ret) {if ((timer+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); timer = millis (); }}}

void createTextTime (int hh, int mm)

// to ves čas združi podatke v besedilo kot en stavek {finalString = ""; // izbrisati stavek za posebne primere (spodaj) finalString = finalString+"To je";

// zdaj dodamo uro

if (hh == 1 || hh == 13) {finalString = finalString+"ena"; } if (hh == 2 || hh == 14) {finalString = finalString+"dva"; } if (hh == 3 || hh == 15) {finalString = finalString+"tri"; } if (hh == 4 || hh == 16) {finalString = finalString+"štiri"; } if (hh == 5 || hh == 17) {finalString = finalString+"pet"; } if (hh == 6 || hh == 18) {finalString = finalString+"šest"; } if (hh == 7 || hh == 19) {finalString = finalString+"sedem"; } if (hh == 8 || hh == 20) {finalString = finalString+"osem"; } if (hh == 9 || hh == 21) {finalString = finalString+"devet"; } if (hh == 10 || hh == 22) {finalString = finalString+"deset"; } if (hh == 11 || hh == 23) {finalString = finalString+"enajst"; }

// zdaj dodajte minute

stikalo (mm) {primer 1: finalString = finalString+"oh ena"; zlom; primer 2: finalString = finalString+"oh dva"; zlom; primer 3: finalString = finalString+"oh tri"; zlom; primer 4: finalString = finalString+"oh štiri"; zlom; primer 5: finalString = finalString+"oh pet"; zlom; primer 6: finalString = finalString+"oh šest"; zlom; primer 7: finalString = finalString+"oh sedem"; zlom; primer 8: finalString = finalString+"oh osem"; zlom; primer 9: finalString = finalString+"oh devet"; zlom; primer 10: finalString = finalString+"deset"; zlom; primer 11: finalString = finalString+"enajst"; zlom; primer 12: finalString = finalString+"dvanajst"; zlom; primer 13: finalString = finalString+"trinajst"; zlom; primer 14: finalString = finalString+"štirinajst"; zlom; primer 15: finalString = finalString+"petnajst"; zlom; primer 16: finalString = finalString+"šestnajst"; zlom; primer 17: finalString = finalString+"sedemnajst"; zlom; primer 18: finalString = finalString+"osemnajst"; zlom; primer 19: finalString = finalString+"devetnajst"; zlom; primer 20: finalString = finalString+"dvajset"; zlom; primer 21: finalString = finalString+"enaindvajset"; zlom; primer 22: finalString = finalString+"dvaindvajset"; zlom; primer 23: finalString = finalString+"triindvajset"; zlom; primer 24: finalString = finalString+"štiriindvajset"; zlom; primer 25: finalString = finalString+"petindvajset"; zlom; primer 26: finalString = finalString+"šestindvajset"; zlom; primer 27: finalString = finalString+"sedemindvajset"; zlom; primer 28: finalString = finalString+"osemindvajset"; zlom; primer 29: finalString = finalString+"devetindvajset"; zlom; primer 30: finalString = finalString+"trideset"; zlom; primer 31: finalString = finalString+"enaindvajset"; zlom; primer 32: finalString = finalString+"dvaintrideset"; zlom; primer 33: finalString = finalString+"trideset tri"; zlom; primer 34: finalString = finalString+"štiriintrideset"; zlom; primer 35: finalString = finalString+"petintrideset"; zlom; primer 36: finalString = finalString+"šestintrideset"; zlom; primer 37: finalString = finalString+"sedemintrideset"; zlom; primer 38: finalString = finalString+"osemintrideset"; zlom; primer 39: finalString = finalString+"devetintrideset"; zlom; primer 40: finalString = finalString+"štirideset"; zlom; primer 41: finalString = finalString+"enainštirideset"; zlom; primer 42: finalString = finalString+"dvainštirideset"; zlom; primer 43: finalString = finalString+"triinštirideset"; zlom; primer 44: finalString = finalString+"štiriinštirideset"; zlom; primer 45: finalString = finalString+"petinštirideset"; zlom; primer 46: finalString = finalString+"šestinštirideset"; zlom; primer 47: finalString = finalString+"sedeminštirideset"; zlom; primer 48: finalString = finalString+"oseminštirideset"; zlom; primer 49: finalString = finalString+"devetindevetdeset"; zlom; primer 50: finalString = finalString+"petdeset"; zlom; primer 51: finalString = finalString+"enainpetdeset"; zlom; primer 52: finalString = finalString+"dvainpetdeset"; zlom; primer 53: finalString = finalString+"triinpetdeset"; zlom; primer 54: finalString = finalString+"štiriinpetdeset"; zlom; primer 55: finalString = finalString+"petinpetdeset"; zlom; primer 56: finalString = finalString+"petinpetdeset"; zlom; primer 57: finalString = finalString+"sedeminpetdeset"; zlom; primer 58: finalString = finalString+"oseminpetdeset"; zlom; primer 59: finalString = finalString+"devetindevetdeset"; zlom; }

// opoldne?

if (hh == 12 && mm == 0) {finalString = finalString+"opoldne"; } // polnoč? if (hh == 00 && mm == 0) {finalString = finalString+"polnoč"; }

}

void loop ()

{// dobite čas iz bajta RTC sekunda, minuta, ura, danOfWeek, dayOfMonth, mesec, leto; getDateDs1307 (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

// pretvorimo čas v stavčni niz

createTextTime (ura, minuta);

// zdaj pošljite besedilo v DMD

drawText (finalString); }

Skica ima običajne funkcije za nastavitev in pridobivanje časa iz IC-jev ure realnega časa DS1307/3232, in kot običajno z vsemi našimi urami lahko vnesete informacije o času v spremenljivke v void setup (), nato odkomentirajte setDateDs1307 (), naložite skico, znova komentirajte setDateDs1307 in nato še enkrat naložite skico. Ponovite ta postopek, da znova nastavite čas, če niste dodali nobenega uporabniškega vmesnika, ki temelji na strojni opremi.

3. korak:

Ko je čas pridobljen v void loop (), se posreduje funkciji createTextTime (). Ta funkcija ustvari besedilni niz za prikaz tako, da se začne z »To je«, nato pa določi, katerim besedam je treba slediti, odvisno od trenutnega časa. Na koncu funkcija drawText () pretvori niz, ki vsebuje besedilo, za prikaz v spremenljivko znakov, ki jo je mogoče poslati v DMD.

Priporočena: