Cuprins:
Video: Arduino Scrolling Text Clock: 3 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:44
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
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:
ESP32 Scrolling WordClock pe LED Matrix: 5 pași (cu imagini)
ESP32 Scrolling WordClock pe LED Matrix: În acest proiect creez un WordClock Scrolling cu un ESP32, LED Matrix și o cutie de trabucuri. Un WordClock este un ceas care indică timpul, mai degrabă decât să-l imprime pe ecran sau să aibă mâini pe care le poți citi. Acest ceas vă va spune că sunt 10 minute pa
Programarea unui Arduino Folosind un alt Arduino pentru a afișa un text derulant fără bibliotecă: 5 pași
Programarea unui Arduino Folosirea unui alt Arduino pentru a afișa un text derulant fără bibliotecă: Sony Spresense sau Arduino Uno nu sunt atât de scumpe și nu necesită multă energie. Cu toate acestea, dacă proiectul dvs. are limite de putere, spațiu sau chiar buget, vă recomandăm să utilizați Arduino Pro Mini. Spre deosebire de Arduino Pro Micro, Arduino Pro Mi
Cum să trimiteți mesaje text SMS din proiectul dvs. Arduino ESP: 6 pași
Cum să trimiteți mesaje text SMS din proiectul dvs. Arduino ESP: Această instrucțiune demonstrează cum să trimiteți mesaje text SMS din proiectul dvs. arduino utilizând un dispozitiv ESP8266 și o conexiune WiFi. De ce să utilizați SMS-uri? mesaje. * Mesajele SMS pot, de asemenea
Convertor Arduino Text în vorbire folosind LM386 - Talking Arduino Project - Biblioteca Talkie Arduino: 5 pași
Convertor Arduino Text în vorbire folosind LM386 | Talking Arduino Project | Biblioteca Talkie Arduino: Bună băieți, în multe dintre proiecte avem nevoie de arduino să vorbească ceva cum ar fi vorbind ceas sau spunând niște date, astfel încât în acest instructables vom converti textul în vorbire folosind Arduino
M-Clock Minimode Multimode Clock: 11 pași
M-Clock Miniature Multimode Clock: Minimalist's Clock? Ceas multi-mod? Ceas Matrix? Acesta este un proiect de ceas multi-mod bazat pe MSP430G2432. Poate fi asamblat fără lipire și utilizarea minimă a sculelor. Cu o rezoluție limitată de afișare de 8x8 pixeli, acest ceas de 12 ore arată ora