Sadržaj:

Arduino klizni tekstualni sat: 3 koraka
Arduino klizni tekstualni sat: 3 koraka

Video: Arduino klizni tekstualni sat: 3 koraka

Video: Arduino klizni tekstualni sat: 3 koraka
Video: Lesson 98: Arduino 10 LED Push button Projects, Potentiometer LED Voltmeter and Traffic Light 2024, Srpanj
Anonim
Arduino klizni tekstualni sat
Arduino klizni tekstualni sat

Svrha ovog projekta je izgraditi klizni tekstualni sat koji prikazuje vrijeme dok se izgovara (na primjer, "ponoć je").

Ovo je brzi projekt - dajemo vam dovoljno da započnete s hardverom i skicom, a zatim ga možete nastaviti dalje prema svojim potrebama.

Korak 1: Hardver

Hardver
Hardver

Trebat će vam tri glavne stavke -

  • ploča kompatibilna s Arduino Uno
  • krug ili modul sata u stvarnom vremenu koji koristi DS1307 ili DS3231 IC
  • i jednobojni LED zaslon u stilu P10

Možda želite vanjsko napajanje, ali o tome ćemo kasnije.

Prva faza je prilagođavanje vašem satu u stvarnom vremenu. Kliknite ovdje za vodič ako vam je potrebna pomoć oko toga.

Nadam se da već razmišljate "kako namještate vrijeme?".

Na to pitanje postoje dva odgovora. Ako koristite DS3231, samo ga postavite na skicu (vidi dolje) jer je točnost vrlo dobra, samo morate dvaput godišnje prenijeti skicu s novim vremenom kako biste pokrili ljetno računanje vremena.

U protivnom dodajte jednostavno korisničko sučelje-to bi moglo učiniti nekoliko gumba. Konačno, samo trebate staviti hardver na stražnju stranu DMD -a. Postoji mnogo prostora za zadovoljavanje vlastitih potreba, jednostavno rješenje moglo bi biti poravnavanje upravljačke ploče tako da s lakoćom možete pristupiti USB utičnici - a zatim je zalijepiti s nekim Sugruom.

Što se tiče napajanja sata - možete pokrenuti JEDAN LED zaslon s Arduina i on radi pri dobroj svjetlini za unutarnju upotrebu. Ako želite da DMD radi punom svjetlinom koja gori na mrežnici, morate koristiti zasebno 5V 4A DC napajanje. Ako koristite dva DMD -a - to ide na 8A i tako dalje. Jednostavno spojite vanjsko napajanje na jedan priključak DMD -a (na ove stezaljke priključite drugi ili više DMD -ova).

Ako vam se ne sviđa sjeckanje kraja kabela za napajanje, upotrijebite prekid istosmjerne utičnice.

Korak 2: Arduino skica

Morat ćete instalirati sljedeće dvije Arduino knjižnice - TimerOne i DMD. Zatim prenesite skicu:

// za RTC #uključuje "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC 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 // mogli biste imati više od jednog DMD -a u red #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

Niz finalString; // koristi se za držanje posljednje rečenice za prikaz na DMD -u

void ScanDMD () // potrebno za DMD

{dmd.scanDisplayBySPI (); }

void setup ()

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

// za RTC

Wire.begin (); // aktiviranje bajta sabirnice I2C sekunda, minuta, sat, danOfWeek, dayOfMonth, mjesec, godina; // mijenjamo varijable i raskomentiramo setDateDs1307 za postavljanje vremena // zatim ponovno komentiramo funkciju i ponovo učitavamo skicu second = 0; minuta = 13; sat = 23; dayOfWeek = 4; dayOfMonth = 19; mjesec = 5; godina = 13; // setDateDs1307 (drugi, minut, sat, danOtjedan, danOdMjesec, mjesec, godina); }

// uobičajene funkcije RTC -a

// Pretvorimo normalne decimalne brojeve u binarno kodirani decimalni bajt decToBcd (byte val) {return ((val/10*16) + (val%10)); }

// Pretvorimo binarno kodirane decimalne brojeve u normalne decimalne brojeve

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

void setDateDs1307 (sekunda bajta, // 0-59

bajt minuta, // 0-59 bajtnih sati, // 1-23 bajt danOfWeek, // 1-7 bajt danOfMonth, // 1-28/29/bajt mjesec, // 1-12 bajt godina) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (drugi)); // 0 do bita 7 pokreće sat Wire.write (decToBcd (minuta)); Wire.write (decToBcd (sat)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mjesec)); Wire.write (decToBcd (godina)); Wire.write (00010000); // šalje 0x10 (hex) 00010000 (binarno) u upravljački registar - uključuje kvadratni val Wire.endTransmission (); }

// Dobiva datum i vrijeme iz ds1307

void getDateDs1307 (byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {// Poništite pokazivač registra Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Nekoliko od njih trebaju maske jer su određeni bitovi kontrolni bitovi

*drugi = bcdToDec (Wire.read () & 0x7f); *minuta = bcdToDec (Wire.read ()); *sat = bcdToDec (Wire.read () & 0x3f); // Moramo to promijeniti ako je 12 sati prije podne/dan *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *mjesec = bcdToDec (Wire.read ()); *godina = 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); dugačak početak = millis (); long timer = start; long timer2 = start; boolean ret = false; while (! ret) {if ((timer+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); timer = millis (); }}}

void createTextTime (int hh, int mm)

// ovo cijelo vrijeme pretvara podatke u tekst kao jednu rečenicu {finalString = ""; // brisanje rečenice za posebne slučajeve (ispod) finalString = finalString+"To je";

// sada dodamo sat

if (hh == 1 || hh == 13) {finalString = finalString+"jedan"; } if (hh == 2 || hh == 14) {finalString = finalString+"dva"; } if (hh == 3 || hh == 15) {finalString = finalString+"tri"; } if (hh == 4 || hh == 16) {finalString = finalString+"četiri"; } if (hh == 5 || hh == 17) {finalString = finalString+"pet"; } if (hh == 6 || hh == 18) {finalString = finalString+"šest"; } if (hh == 7 || hh == 19) {finalString = finalString+"sedam"; } if (hh == 8 || hh == 20) {finalString = finalString+"osam"; } if (hh == 9 || hh == 21) {finalString = finalString+"devet"; } if (hh == 10 || hh == 22) {finalString = finalString+"deset"; } if (hh == 11 || hh == 23) {finalString = finalString+"jedanaest"; }

// sada dodajte minute

prekidač (mm) {slučaj 1: finalString = finalString+"oh jedan"; pauza; slučaj 2: finalString = finalString+"oh dva"; pauza; slučaj 3: finalString = finalString+"oh tri"; pauza; slučaj 4: finalString = finalString+"oh četiri"; pauza; slučaj 5: finalString = finalString+"oh pet"; pauza; slučaj 6: finalString = finalString+"oh šest"; pauza; slučaj 7: finalString = finalString+"oh sedam"; pauza; slučaj 8: finalString = finalString+"oh osam"; pauza; slučaj 9: finalString = finalString+"oh devet"; pauza; slučaj 10: finalString = finalString+"deset"; pauza; slučaj 11: finalString = finalString+"jedanaest"; pauza; slučaj 12: finalString = finalString+"dvanaest"; pauza; slučaj 13: finalString = finalString+"trinaest"; pauza; slučaj 14: finalString = finalString+"četrnaest"; pauza; slučaj 15: finalString = finalString+"petnaest"; pauza; slučaj 16: finalString = finalString+"šesnaest"; pauza; slučaj 17: finalString = finalString+"sedamnaest"; pauza; slučaj 18: finalString = finalString+"osamnaest"; pauza; slučaj 19: finalString = finalString+"devetnaest"; pauza; slučaj 20: finalString = finalString+"dvadeset"; pauza; slučaj 21: finalString = finalString+"dvadeset jedan"; pauza; slučaj 22: finalString = finalString+"dvadeset dva"; pauza; slučaj 23: finalString = finalString+"dvadeset tri"; pauza; slučaj 24: finalString = finalString+"dvadeset četiri"; pauza; slučaj 25: finalString = finalString+"dvadeset pet"; pauza; slučaj 26: finalString = finalString+"dvadeset šest"; pauza; slučaj 27: finalString = finalString+"dvadeset sedam"; pauza; slučaj 28: finalString = finalString+"dvadeset osam"; pauza; slučaj 29: finalString = finalString+"dvadeset devet"; pauza; slučaj 30: finalString = finalString+"trideset"; pauza; slučaj 31: finalString = finalString+"trideset jedan"; pauza; slučaj 32: finalString = finalString+"trideset dva"; pauza; slučaj 33: finalString = finalString+"trideset tri"; pauza; slučaj 34: finalString = finalString+"trideset četiri"; pauza; slučaj 35: finalString = finalString+"trideset pet"; pauza; slučaj 36: finalString = finalString+"trideset šest"; pauza; slučaj 37: finalString = finalString+"trideset sedam"; pauza; slučaj 38: finalString = finalString+"trideset osam"; pauza; slučaj 39: finalString = finalString+"trideset devet"; pauza; slučaj 40: finalString = finalString+"četrdeset"; pauza; slučaj 41: finalString = finalString+"četrdeset jedan"; pauza; slučaj 42: finalString = finalString+"četrdeset dva"; pauza; slučaj 43: finalString = finalString+"četrdeset tri"; pauza; slučaj 44: finalString = finalString+"četrdeset četiri"; pauza; slučaj 45: finalString = finalString+"četrdeset pet"; pauza; slučaj 46: finalString = finalString+"četrdeset šest"; pauza; slučaj 47: finalString = finalString+"četrdeset sedam"; pauza; slučaj 48: finalString = finalString+"četrdeset osam"; pauza; slučaj 49: finalString = finalString+"četrdeset devet"; pauza; slučaj 50: finalString = finalString+"pedeset"; pauza; slučaj 51: finalString = finalString+"pedeset jedan"; pauza; slučaj 52: finalString = finalString+"pedeset dva"; pauza; slučaj 53: finalString = finalString+"pedeset tri"; pauza; slučaj 54: finalString = finalString+"pedeset četiri"; pauza; slučaj 55: finalString = finalString+"pedeset pet"; pauza; slučaj 56: finalString = finalString+"pedeset šest"; pauza; slučaj 57: finalString = finalString+"pedeset sedam"; pauza; slučaj 58: finalString = finalString+"pedeset osam"; pauza; slučaj 59: finalString = finalString+"pedeset devet"; pauza; }

// podne?

if (hh == 12 && mm == 0) {finalString = finalString+"podne"; } // ponoć? if (hh == 00 && mm == 0) {finalString = finalString+"ponoć"; }

}

void loop ()

{// dobiti vrijeme iz RTC bajta sekunda, minuta, sat, danOfWeek, danOfMonth, mjesec, godina; getDateDs1307 (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

// pretvara vrijeme u niz rečenica

createTextTime (sat, minuta);

// sada pošaljite tekst u DMD

drawText (finalString); }

Skica ima uobičajene funkcije za postavljanje i dohvaćanje vremena s IC-ova sata u stvarnom vremenu DS1307/3232, a kao i obično sa svim našim satovima možete unijeti podatke o vremenu u varijable u void setup (), zatim ukloniti komentare setDateDs1307 (), prenesite skicu, ponovno komentirajte setDateDs1307, a zatim još jednom prenesite skicu. Ponovite taj postupak da biste ponovno postavili vrijeme ako niste dodali hardversko korisničko sučelje.

3. korak:

Nakon što se vrijeme dohvati u void loop (), prosljeđuje se funkciji createTextTime (). Ova funkcija stvara tekstualni niz za prikaz počevši s "To je", a zatim određuje koje riječi treba slijediti, ovisno o trenutnom vremenu. Konačno, funkcija drawText () pretvara niz koji sadrži tekst za prikaz u znakovnu varijablu koja se može proslijediti u DMD.

Preporučeni: