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, Novembar
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 ekran u stilu P10

Možda želite vanjsko napajanje, ali na to ćemo doći 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 (pogledajte dolje) jer je točnost vrlo dobra, potrebno je samo skicirati skicu s novim vremenom dva puta godišnje kako biste pokrili ljetno računanje vremena.

U suprotnom slučaju dodajte jednostavno korisničko sučelje-nekoliko tipki bi to moglo učiniti. Konačno, samo trebate staviti hardver na stražnju stranu DMD -a. Postoji mnogo prostora za zadovoljavanje vaših potreba, jednostavno rješenje bi moglo 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 ekran s Arduina i on radi pri dobroj svjetlini za unutrašnju 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 (priključite drugi ili više DMD -ova na ove priključke).

Ako vam se ne sviđa da prekinete kraj kabela za napajanje, upotrijebite prekid istosmjerne utičnice.

Korak 2: Arduino skica

Morat ćete instalirati sljedeće dvije Arduino biblioteke - TimerOne i DMD. Zatim otpremite skicu:

// za RTC #uključuje "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC je 0x68

// za LED displej

#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);

String 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 (true);

// za RTC

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

// uobičajene funkcije RTC -a

// Pretvorimo normalne decimalne brojeve u binarno kodirani decimalni bajt decToBcd (bajt 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 bit 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 kontrolni registar - uključuje kvadratni val Wire.endTransmission (); }

// Dobija datum i vrijeme iz ds1307

void getDateDs1307 (bajt *druga, bajt *minuta, bajt *sat, bajt *danOfWeek, bajt *danOfMonth, bajt *mjesec, bajt *godina) {// 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

*second = bcdToDec (Wire.read () & 0x7f); *minute = bcdToDec (Wire.read ()); *sat = bcdToDec (Wire.read () & 0x3f); // Moramo promijeniti ovo 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); long start = 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 pretvara sve vremenske podatke u tekst kao jednu rečenicu {finalString = ""; // briše rečenicu 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"; break; slučaj 2: finalString = finalString+"oh dva"; break; slučaj 3: finalString = finalString+"oh tri"; break; slučaj 4: finalString = finalString+"oh četiri"; break; slučaj 5: finalString = finalString+"oh pet"; break; slučaj 6: finalString = finalString+"oh šest"; break; slučaj 7: finalString = finalString+"oh sedam"; break; slučaj 8: finalString = finalString+"oh osam"; break; slučaj 9: finalString = finalString+"oh devet"; break; slučaj 10: finalString = finalString+"deset"; break; slučaj 11: finalString = finalString+"jedanaest"; break; slučaj 12: finalString = finalString+"dvanaest"; break; slučaj 13: finalString = finalString+"trinaest"; break; slučaj 14: finalString = finalString+"četrnaest"; break; slučaj 15: finalString = finalString+"petnaest"; break; slučaj 16: finalString = finalString+"šesnaest"; break; slučaj 17: finalString = finalString+"sedamnaest"; break; slučaj 18: finalString = finalString+"osamnaest"; break; slučaj 19: finalString = finalString+"devetnaest"; break; slučaj 20: finalString = finalString+"dvadeset"; break; slučaj 21: finalString = finalString+"dvadeset jedan"; break; slučaj 22: finalString = finalString+"dvadeset dva"; break; slučaj 23: finalString = finalString+"dvadeset tri"; break; slučaj 24: finalString = finalString+"dvadeset četiri"; break; slučaj 25: finalString = finalString+"dvadeset pet"; break; slučaj 26: finalString = finalString+"dvadeset šest"; break; slučaj 27: finalString = finalString+"dvadeset sedam"; break; slučaj 28: finalString = finalString+"dvadeset osam"; break; slučaj 29: finalString = finalString+"dvadeset devet"; break; slučaj 30: finalString = finalString+"trideset"; break; slučaj 31: finalString = finalString+"trideset jedan"; break; slučaj 32: finalString = finalString+"trideset dva"; break; slučaj 33: finalString = finalString+"trideset tri"; break; slučaj 34: finalString = finalString+"trideset četiri"; break; slučaj 35: finalString = finalString+"trideset pet"; break; slučaj 36: finalString = finalString+"trideset šest"; break; slučaj 37: finalString = finalString+"trideset sedam"; break; slučaj 38: finalString = finalString+"trideset osam"; break; slučaj 39: finalString = finalString+"trideset devet"; break; slučaj 40: finalString = finalString+"četrdeset"; break; slučaj 41: finalString = finalString+"četrdeset jedan"; break; slučaj 42: finalString = finalString+"četrdeset dva"; break; slučaj 43: finalString = finalString+"četrdeset tri"; break; slučaj 44: finalString = finalString+"četrdeset četiri"; break; slučaj 45: finalString = finalString+"četrdeset pet"; break; slučaj 46: finalString = finalString+"četrdeset šest"; break; slučaj 47: finalString = finalString+"četrdeset sedam"; break; slučaj 48: finalString = finalString+"četrdeset osam"; break; slučaj 49: finalString = finalString+"četrdeset devet"; break; slučaj 50: finalString = finalString+"pedeset"; break; slučaj 51: finalString = finalString+"pedeset jedan"; break; slučaj 52: finalString = finalString+"pedeset dva"; break; slučaj 53: finalString = finalString+"pedeset tri"; break; slučaj 54: finalString = finalString+"pedeset četiri"; break; slučaj 55: finalString = finalString+"pedeset pet"; break; slučaj 56: finalString = finalString+"pedeset šest"; break; slučaj 57: finalString = finalString+"pedeset sedam"; break; slučaj 58: finalString = finalString+"pedeset osam"; break; slučaj 59: finalString = finalString+"pedeset devet"; break; }

// podne?

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

}

void loop ()

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

// pretvara vrijeme u niz rečenica

createTextTime (sat, minut);

// sada šaljemo 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 (), otpremite skicu, ponovo komentirajte setDateDs1307, a zatim još jednom prenesite skicu. Ponovite taj postupak za ponovno postavljanje vremena ako niste dodali hardversko korisničko sučelje.

Korak 3:

Nakon što se vrijeme dohvati u void loop (), prosljeđuje se funkciji createTextTime (). Ova funkcija stvara tekstualni niz za prikaz počevši sa "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 promenljivu koja se može proslediti DMD -u.

Preporučuje se: