Sisällysluettelo:

Arduino -rullaava tekstikello: 3 vaihetta
Arduino -rullaava tekstikello: 3 vaihetta

Video: Arduino -rullaava tekstikello: 3 vaihetta

Video: Arduino -rullaava tekstikello: 3 vaihetta
Video: You will get straight As using this device 💀 #electronics #engineering #arduino 2024, Marraskuu
Anonim
Arduino vieritys tekstikello
Arduino vieritys tekstikello

Tämän projektin tarkoituksena on rakentaa vierittävä tekstikello, joka näyttää ajan puhuessaan (esimerkiksi "on keskiyö").

Tämä on nopea projekti - annamme sinulle tarpeeksi laitteiston ja luonnoksen aloittamiseen, ja voit viedä sen edelleen tarpeidesi mukaan.

Vaihe 1: Laitteisto

Laitteisto
Laitteisto

Tarvitset kolme suurta tavaraa -

  • Arduino Uno -yhteensopiva levy
  • reaaliaikainen kellopiiri tai moduuli, joka käyttää joko DS1307- tai DS3231-IC: tä
  • ja yksivärinen P10-tyyppinen LED-näyttö

Haluat ehkä ulkoisen virtalähteen, mutta tulemme siihen myöhemmin.

Ensimmäinen vaihe on sovittaa reaaliaikainen kellosi. Napsauta tästä opetusohjelmaan, jos tarvitset apua siinä.

Toivon nyt, että mietit "miten asetat ajan?".

Tähän kysymykseen on kaksi vastausta. Jos käytät DS3231 -laitetta, aseta se luonnokseen (katso alla), koska tarkkuus on erittäin hyvä, sinun tarvitsee vain ladata luonnos uudella kellonajalla kahdesti vuodessa kesäajan säästämiseksi.

Muussa tapauksessa lisää yksinkertainen käyttöliittymä-pari painiketta voi tehdä sen. Lopuksi sinun tarvitsee vain laittaa laitteisto DMD: n taakse. Omia tarpeitasi on riittävästi, yksinkertainen ratkaisu voi olla ohjauskortin kohdistaminen niin, että voit käyttää USB -liitäntää helposti - ja kiinnitä se sitten joidenkin Sugru -laitteiden kanssa.

Kellon virransyötön suhteen - voit käyttää YKSI LED -näyttöä Arduinosta, ja se toimii hyvällä kirkkaudella sisäkäyttöön. Jos haluat, että DMD toimii täydellä, verkkokalvon polttavalla kirkkaudella, sinun on käytettävä erillistä 5V 4A DC -virtalähdettä. Jos käytät kahta DMD: tä - se menee 8A: een ja niin edelleen. Liitä ulkoinen virta vain yhteen DMD -liittimeen (liitä toinen tai useampi DMD -liitin näihin liittimiin).

Jos et halua katkaista virtajohdon päätä, käytä DC -pistorasian katkaisua.

Vaihe 2: Arduino -luonnos

Sinun on asennettava seuraavat kaksi Arduino -kirjastoa - TimerOne ja DMD. Lataa sitten luonnos:

// RTC: lle #sisältää "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC on 0x68

// LED -näytölle

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // sinulla voi olla useampi kuin yksi DMD rivi #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

Merkkijono finalString; // käytetään pitämään viimeinen lause näkyvissä DMD: ssä

void ScanDMD () // vaaditaan DMD: lle

{dmd.scanDisplayBySPI (); }

mitätön asennus ()

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

// RTC: lle

Wire.begin (); // käynnistää I2C -väylän tavu sekunti, minuutti, tunti, päiväViikko, päiväKuukausi, kuukausi, vuosi; // muuta muuttujia ja poista komento setDateDs1307 asettaaksesi ajan // kommentoi sitten uudelleen funktiota ja lataa luonnos uudelleen second = 0; minuutti = 13; tunti = 23; dayOfWeek = 4; dayOfMonth = 19; kuukausi = 5; vuosi = 13; // setDateDs1307 (toinen, minuutti, tunti, päiväViikon päivä, kuukausi, kuukausi, vuosi); }

// tavalliset RTC -toiminnot

// Muunna normaalit desimaaliluvut binäärikoodatuksi desimaalitavuun decToBcd (tavu val) {return ((val/10*16) + (val%10)); }

// Muunna binäärikoodattu desimaali normaaliksi desimaaliluvuksi

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

void setDateDs1307 (tavu sekunti, // 0-59

tavut minuutti, // 0-59 tavutunti, // 1-23 tavun päivä viikosta, // 1-7 tavun päivä kuukaudessa, // 1-28/29/tavukuukausi, // 1-12 tavun vuosi) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (toinen)); // 0 bittiin 7 käynnistää kellon Wire.write (decToBcd (minuutti)); Wire.write (decToBcd (tunti)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (kuukausi)); Wire.write (decToBcd (vuosi)); Wire.write (00010000); // lähettää 0x10 (hex) 00010000 (binaarinen) ohjausrekisteriin - kytkee neliöaallon Wire.endTransmission (); }

// Hakee päivämäärän ja kellonajan ds1307: stä

void getDateDs1307 (tavu *sekunti, tavu *minuutti, tavu *tunti, tavu *dayOfWeek, tavu *dayOfMonth, tavu *kuukausi, tavu *vuosi) {// Nollaa rekisteriosoitin Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Jotkut näistä tarvitsevat maskeja, koska tietyt bitit ovat ohjausbittejä

*toinen = bcdToDec (Wire.read () & 0x7f); *minuutti = bcdToDec (Wire.read ()); *tunti = bcdToDec (Wire.read () & 0x3f); // Tämä on muutettava, jos 12 tuntia am/pm *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *kuukausi = bcdToDec (Wire.read ()); *vuosi = 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); pitkä alku = millis (); pitkä ajastin = käynnistys; pitkä ajastin2 = aloitus; boolean ret = epätosi; while (! ret) {if ((ajastin+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); ajastin = millis (); }}}

void createTextTime (int hh, int mm)

// tämä murskaa koko ajan datan tekstiksi yhdeksi lauseeksi {finalString = ""; // pyyhi lause pois erityistapauksia varten (alla) finalString = finalString+"It's";

// lisää nyt tunti

jos (hh == 1 || hh == 13) {finalString = finalString+"yksi"; } jos (hh == 2 || hh == 14) {finalString = finalString+"two"; } jos (hh == 3 || hh == 15) {finalString = finalString+"kolme"; } jos (hh == 4 || hh == 16) {finalString = finalString+"four"; } jos (hh == 5 || hh == 17) {finalString = finalString+"viisi"; } jos (hh == 6 || hh == 18) {finalString = finalString+"six"; } jos (hh == 7 || hh == 19) {finalString = finalString+"seitsemän"; } jos (hh == 8 || hh == 20) {finalString = finalString+"kahdeksan"; } jos (hh == 9 || hh == 21) {finalString = finalString+"yhdeksän"; } jos (hh == 10 || hh == 22) {finalString = finalString+"ten"; } jos (hh == 11 || hh == 23) {finalString = finalString+"yksitoista"; }

// lisää nyt minuutit

kytkin (mm) {tapaus 1: finalString = finalString+"oh one"; tauko; tapaus 2: finalString = finalString+"oh two"; tauko; tapaus 3: finalString = finalString+"oh three"; tauko; tapaus 4: finalString = finalString+"oh four"; tauko; tapaus 5: finalString = finalString+"oh five"; tauko; tapaus 6: finalString = finalString+"oh six"; tauko; tapaus 7: finalString = finalString+"oh seven"; tauko; tapaus 8: finalString = finalString+"oh eight"; tauko; tapaus 9: finalString = finalString+"oh nine"; tauko; tapaus 10: finalString = finalString+"ten"; tauko; tapaus 11: finalString = finalString+"yksitoista"; tauko; tapaus 12: finalString = finalString+"kaksitoista"; tauko; tapaus 13: finalString = finalString+"kolmetoista"; tauko; tapaus 14: finalString = finalString+"neljätoista"; tauko; tapaus 15: finalString = finalString+"viisitoista"; tauko; tapaus 16: finalString = finalString+"kuusitoista"; tauko; tapaus 17: finalString = finalString+"seventeen"; tauko; tapaus 18: finalString = finalString+"kahdeksantoista"; tauko; tapaus 19: finalString = finalString+"yhdeksäntoista"; tauko; tapaus 20: finalString = finalString+"kaksikymmentä"; tauko; tapaus 21: finalString = finalString+"21"; tauko; tapaus 22: finalString = finalString+"kaksikymmentäkaksi"; tauko; tapaus 23: finalString = finalString+"kaksikymmentä kolme"; tauko; tapaus 24: finalString = finalString+"kaksikymmentäneljä"; tauko; tapaus 25: finalString = finalString+"kaksikymmentäviisi"; tauko; tapaus 26: finalString = finalString+"kaksikymmentäkuusi"; tauko; tapaus 27: finalString = finalString+"kaksikymmentäseitsemän"; tauko; tapaus 28: finalString = finalString+"kaksikymmentäkahdeksan"; tauko; tapaus 29: finalString = finalString+"kaksikymmentäyhdeksän"; tauko; tapaus 30: finalString = finalString+"kolmekymmentä"; tauko; tapaus 31: finalString = finalString+"kolmekymmentä yksi"; tauko; tapaus 32: finalString = finalString+"kolmekymmentäkaksi"; tauko; tapaus 33: finalString = finalString+"kolmekymmentä kolme"; tauko; tapaus 34: finalString = finalString+"kolmekymmentäneljä"; tauko; tapaus 35: finalString = finalString+"kolmekymmentäviisi"; tauko; tapaus 36: finalString = finalString+"kolmekymmentäkuusi"; tauko; tapaus 37: finalString = finalString+"kolmekymmentäseitsemän"; tauko; tapaus 38: finalString = finalString+"kolmekymmentäkahdeksan"; tauko; tapaus 39: finalString = finalString+"kolmekymmentäyhdeksän"; tauko; tapaus 40: finalString = finalString+"neljäkymmentä"; tauko; tapaus 41: finalString = finalString+"neljäkymmentä yksi"; tauko; tapaus 42: finalString = finalString+"neljäkymmentäkaksi"; tauko; tapaus 43: finalString = finalString+"neljäkymmentä kolme"; tauko; tapaus 44: finalString = finalString+"neljäkymmentäneljä"; tauko; tapaus 45: finalString = finalString+"neljäkymmentäviisi"; tauko; tapaus 46: finalString = finalString+"neljäkymmentäkuusi"; tauko; tapaus 47: finalString = finalString+"neljäkymmentäseitsemän"; tauko; tapaus 48: finalString = finalString+"neljäkymmentäkahdeksan"; tauko; tapaus 49: finalString = finalString+"neljäkymmentäyhdeksän"; tauko; tapaus 50: finalString = finalString+"fifty"; tauko; tapaus 51: finalString = finalString+"fifty one"; tauko; tapaus 52: finalString = finalString+"viisikymmentäkaksi"; tauko; tapaus 53: finalString = finalString+"viisikymmentä kolme"; tauko; tapaus 54: finalString = finalString+"viisikymmentäneljä"; tauko; tapaus 55: finalString = finalString+"viisikymmentäviisi"; tauko; tapaus 56: finalString = finalString+"viisikymmentäkuusi"; tauko; tapaus 57: finalString = finalString+"viisikymmentäseitsemän"; tauko; tapaus 58: finalString = finalString+"viisikymmentäkahdeksan"; tauko; tapaus 59: finalString = finalString+"viisikymmentäyhdeksän"; tauko; }

// keskipäivä?

if (hh == 12 && mm == 0) {finalString = finalString+"keskipäivä"; } // keskiyö? if (hh == 00 && mm == 0) {finalString = finalString+"keskiyö"; }

}

tyhjä silmukka ()

{// hae aika RTC -tavulta sekunti, minuutti, tunti, dayOfWeek, dayOfMonth, kuukausi, vuosi; getDateDs1307 (& sekunti, & minuutti, & tunti, & päivä viikossa, & päivä kuukaudessa, & kuukausi & vuosi);

// muuntaa ajan lauseeksi

createTextTime (tunti, minuutti);

// lähetä nyt teksti DMD: lle

drawText (finalString); }

Luonnoksessa on tavanomaiset toiminnot, joilla aika asetetaan ja haetaan reaaliaikaisista DS1307/3232-kellokytkimistä, ja kuten kaikilla kelloillamme, voit syöttää aikatiedot muuttujiin tyhjässä asetuksessa () ja sitten uncomment setDateDs1307 (), lataa luonnos, kommentoi uudelleen setDateDs1307 ja lataa sitten luonnos uudelleen. Toista tämä prosessi asettaaksesi ajan uudelleen, jos et lisännyt laitteistopohjaista käyttöliittymää.

Vaihe 3:

Kun aika on haettu void -silmukasta (), se välitetään funktiolle createTextTime (). Tämä toiminto luo näytettävän tekstimerkkijonon alkamalla "Se" ja määrittää sitten seuraavat sanat senhetkisen ajan mukaan. Lopuksi funktio drawText () muuntaa tekstin pitävän merkkijonon näytettäväksi merkkimuuttujaksi, joka voidaan välittää DMD: lle.

Suositeltava: