Cuprins:

Arduino Scrolling Text Clock: 3 pași
Arduino Scrolling Text Clock: 3 pași

Video: Arduino Scrolling Text Clock: 3 pași

Video: Arduino Scrolling Text Clock: 3 pași
Video: Как использовать SSD1306 128x32 OLED-дисплей I2C с кодом Arduino 2024, Iulie
Anonim
Ceas Arduino Scrolling Text
Ceas Arduino Scrolling Text

Scopul acestui proiect este de a construi un ceas de text care să afișeze ora în timp ce este vorbit (de exemplu, „este miezul nopții”).

Acesta este un proiect rapid - vă oferim suficient pentru a începe cu hardware-ul și schița, iar apoi îl puteți duce mai departe pentru a se potrivi nevoilor dvs.

Pasul 1: Hardware

Hardware
Hardware

Veți avea nevoie de trei elemente majore -

  • o placa compatibila Arduino Uno
  • un circuit sau modul de ceas în timp real utilizând fie un DS1307, fie DS3231 IC
  • și un afișaj LED monocrom în stil P10

S-ar putea să doriți o sursă de alimentare externă, dar vom ajunge la asta mai târziu.

Prima etapă este potrivirea ceasului dvs. în timp real. Faceți clic aici pentru tutorial dacă aveți nevoie de ajutor.

Până acum sper să vă gândiți „cum setați timpul?”.

Există două răspunsuri la această întrebare. Dacă utilizați DS3231, doar setați-l în schiță (a se vedea mai jos), deoarece precizia este foarte bună, trebuie să încărcați schița cu noua oră de două ori pe an pentru a acoperi economia de vară.

În caz contrar, adăugați o interfață de utilizator simplă - ar putea face asta câteva butoane. În cele din urmă trebuie doar să puneți hardware-ul pe spatele DMD. Există o mulțime de posibilități pentru a vă satisface propriile nevoi, o soluție simplă ar putea fi alinierea plăcii de control, astfel încât să puteți accesa priza USB cu ușurință - și apoi să o lipiți cu niște Sugru.

În ceea ce privește alimentarea ceasului - puteți rula un afișaj LED de la Arduino și funcționează la o luminozitate bună pentru utilizare în interior. Dacă doriți ca DMD să funcționeze la luminozitate maximă, arzătoare a retinei, trebuie să utilizați o sursă de alimentare separată de 5V 4A DC. Dacă utilizați două DMD-uri, acesta merge la 8A și așa mai departe. Pur și simplu conectați puterea externă la terminalele unui DMD (conectați al doilea sau mai multe DMD-uri la aceste terminale).

Dacă nu vă place să tăiați capătul cablului de alimentare, utilizați o priză de curent continuu.

Pasul 2: Schița Arduino

Va trebui să instalați următoarele două biblioteci Arduino - TimerOne și DMD. Apoi încărcați schița:

// pentru RTC # include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC este 0x68

// pentru afișaj LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // ați putea avea mai multe DMD într-un rând #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // folosit pentru a menține propoziția finală pentru a fi afișată pe DMD

void ScanDMD () // necesar pentru DMD

{dmd.scanDisplayBySPI (); }

configurare nulă ()

{// pentru DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (adevărat);

// pentru RTC

Wire.begin (); // declanșați octetul de autobuz I2C secund, minut, oră, dayOfWeek, dayOfMonth, lună, an; // modificați variabilele și decomentați setDateDs1307 pentru a seta ora // apoi comentați din nou funcția și încărcați schița din nou a doua = 0; minut = 13; ora = 23; dayOfWeek = 4; dayOfMonth = 19; luna = 5; an = 13; // setDateDs1307 (second, minute, hour, dayOfWeek, dayOfMonth, month, year); }

// funcții obișnuite RTC

// Conversia numerelor zecimale normale în octet zecimal codat binar decToBcd (octet val) {return ((val / 10 * 16) + (val% 10)); }

// Convertiți zecimale codate binare în numere zecimale normale

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

void setDateDs1307 (octet secund, // 0-59

octet minut, // 0-59 octet oră, // 1-23 octet ziOfWeek, // 1-7 octet ziOfMonth, // 1-28 / 29 / octet lună, // 1-12 octet an) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (second)); // 0 la bitul 7 pornește ceasul Wire.write (decToBcd (minut)); Wire.write (decToBcd (oră)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (lună)); Wire.write (decToBcd (anul)); Wire.write (00010000); // trimite 0x10 (hex) 00010000 (binar) la registrul de control - activează unda pătrată Wire.endTransmission (); }

// Obține data și ora din ds1307

void getDateDs1307 (octet * secundă, octet * minut, octet * oră, octet * dayOfWeek, octet * dayOfMonth, octet * lună, octet * an) {// Resetați indicatorul de înregistrare Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Câteva dintre acestea au nevoie de măști, deoarece anumiți biți sunt biți de control

* second = bcdToDec (Wire.read () & 0x7f); * minute = bcdToDec (Wire.read ()); * ora = bcdToDec (Wire.read () & 0x3f); // Trebuie să schimbați acest lucru dacă 12 ore am / pm * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * luna = bcdToDec (Wire.read ()); * an = bcdToDec (Wire.read ()); }

void drawText (String oldString)

{dmd.clearScreen (adevărat); 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); start lung = milis (); cronometru lung = start; cronometru lung2 = start; boolean ret = false; while (! ret) {if ((timer + 20) <millis ()) {ret = dmd.stepMarquee (-1, 0); timer = milis (); }}}

void createTextTime (int hh, int mm)

// aceasta blochează tot timpul datele în text ca o singură propoziție {finalString = ""; // ștergeți propoziția pentru cazuri speciale (mai jos) finalString = finalString + „Este”;

// acum adaugă ora

if (hh == 1 || hh == 13) {finalString = finalString + "one"; } if (hh == 2 || hh == 14) {finalString = finalString + "two"; } if (hh == 3 || hh == 15) {finalString = finalString + "three"; } if (hh == 4 || hh == 16) {finalString = finalString + "four"; } if (hh == 5 || hh == 17) {finalString = finalString + "five"; } if (hh == 6 || hh == 18) {finalString = finalString + "six"; } if (hh == 7 || hh == 19) {finalString = finalString + "seven"; } if (hh == 8 || hh == 20) {finalString = finalString + "opt"; } if (hh == 9 || hh == 21) {finalString = finalString + "nouă"; } if (hh == 10 || hh == 22) {finalString = finalString + "zece"; } if (hh == 11 || hh == 23) {finalString = finalString + "unsprezece"; }

// acum adaugă minutele

switch (mm) {case 1: finalString = finalString + "oh one"; pauză; caz 2: finalString = finalString + "oh doi"; pauză; caz 3: finalString = finalString + "oh trei"; pauză; caz 4: finalString = finalString + "oh patru"; pauză; caz 5: finalString = finalString + "oh cinci"; pauză; caz 6: finalString = finalString + "oh six"; pauză; caz 7: finalString = finalString + "oh șapte"; pauză; caz 8: finalString = finalString + "oh opt"; pauză; caz 9: finalString = finalString + "oh nouă"; pauză; caz 10: finalString = finalString + "zece"; pauză; caz 11: finalString = finalString + "unsprezece"; pauză; caz 12: finalString = finalString + "douăsprezece"; pauză; caz 13: finalString = finalString + "treisprezece"; pauză; caz 14: finalString = finalString + "paisprezece"; pauză; caz 15: finalString = finalString + "cincisprezece"; pauză; cazul 16: finalString = finalString + "șaisprezece"; pauză; caz 17: finalString = finalString + "șaptesprezece"; pauză; caz 18: finalString = finalString + "optsprezece"; pauză; cazul 19: finalString = finalString + "nouăsprezece"; pauză; caz 20: finalString = finalString + "douăzeci"; pauză; cazul 21: finalString = finalString + "douăzeci și unu"; pauză; caz 22: finalString = finalString + "douăzeci și două"; pauză; caz 23: finalString = finalString + "douăzeci și trei"; pauză; caz 24: finalString = finalString + "douăzeci și patru"; pauză; caz 25: finalString = finalString + "douăzeci și cinci"; pauză; caz 26: finalString = finalString + "douăzeci și șase"; pauză; caz 27: finalString = finalString + "douăzeci și șapte"; pauză; cazul 28: finalString = finalString + "douăzeci și opt"; pauză; cazul 29: finalString = finalString + "douăzeci și nouă"; pauză; caz 30: finalString = finalString + "treizeci"; pauză; caz 31: finalString = finalString + "treizeci și unu"; pauză; caz 32: finalString = finalString + "treizeci și doi"; pauză; caz 33: finalString = finalString + "treizeci și trei"; pauză; caz 34: finalString = finalString + "treizeci și patru"; pauză; cazul 35: finalString = finalString + "treizeci și cinci"; pauză; caz 36: finalString = finalString + "treizeci și șase"; pauză; caz 37: finalString = finalString + "treizeci și șapte"; pauză; caz 38: finalString = finalString + "treizeci și opt"; pauză; caz 39: finalString = finalString + "treizeci și nouă"; pauză; caz 40: finalString = finalString + "patruzeci"; pauză; caz 41: finalString = finalString + "patruzeci și unu"; pauză; cazul 42: finalString = finalString + "patruzeci și doi"; pauză; caz 43: finalString = finalString + "patruzeci și trei"; pauză; caz 44: finalString = finalString + "patruzeci și patru"; pauză; caz 45: finalString = finalString + "patruzeci și cinci"; pauză; cazul 46: finalString = finalString + "patruzeci și șase"; pauză; caz 47: finalString = finalString + "patruzeci și șapte"; pauză; caz 48: finalString = finalString + "patruzeci și opt"; pauză; caz 49: finalString = finalString + "patruzeci și nouă"; pauză; caz 50: finalString = finalString + "cincizeci"; pauză; caz 51: finalString = finalString + "cincizeci și unu"; pauză; caz 52: finalString = finalString + "cincizeci și doi"; pauză; caz 53: finalString = finalString + "cincizeci și trei"; pauză; caz 54: finalString = finalString + "cincizeci și patru"; pauză; caz 55: finalString = finalString + "cincizeci și cinci"; pauză; caz 56: finalString = finalString + "cincizeci și șase"; pauză; cazul 57: finalString = finalString + "cincizeci și șapte"; pauză; caz 58: finalString = finalString + "cincizeci și opt"; pauză; caz 59: finalString = finalString + "cincizeci și nouă"; pauză; }

// miezul zilei?

if (hh == 12 && mm == 0) {finalString = finalString + "midday"; } // miezul nopții? if (hh == 00 && mm == 0) {finalString = finalString + "midnight"; }

}

bucla nulă ()

{// obțineți ora din octetul RTC secundă, minut, oră, dayOfWeek, dayOfMonth, lună, an; getDateDs1307 (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

// converti timpul într-un șir de propoziții

createTextTime (oră, minut);

// acum trimiteți textul către DMD

drawText (finalString); }

Schița are funcțiile obișnuite de setare și recuperare a timpului de la IC-urile DS1307 / 3232 în timp real, și, ca de obicei, cu toate ceasurile noastre puteți introduce informațiile despre timp în variabilele din setarea nulă (), apoi decomentați setDateDs1307 (), încărcați schița, comentați din nou setDateDs1307, apoi încărcați schița încă o dată. Repetați acel proces pentru a restabili ora dacă nu ați adăugat nicio interfață de utilizator bazată pe hardware.

Pasul 3:

Odată ce timpul este recuperat în bucla void (), acesta este trecut la funcția createTextTime (). Această funcție creează șirul de text pentru a fi afișat începând cu „Este” și apoi determină ce cuvinte să urmeze în funcție de ora curentă. În cele din urmă, funcția drawText () convertește șirul care ține textul pentru a fi afișat într-o variabilă de caractere care poate fi transmisă DMD.

Recomandat: