Sommario:

Orologio con testo a scorrimento Arduino: 3 passaggi
Orologio con testo a scorrimento Arduino: 3 passaggi

Video: Orologio con testo a scorrimento Arduino: 3 passaggi

Video: Orologio con testo a scorrimento Arduino: 3 passaggi
Video: Arduino Text Scrolling Display | MAX7219 Dot Matrix 8-in-1 | ESP8266 NodeMCU | Subtitles 2024, Luglio
Anonim
Orologio con testo a scorrimento Arduino
Orologio con testo a scorrimento Arduino

Lo scopo di questo progetto è costruire un orologio di testo scorrevole che mostri l'ora mentre viene pronunciata (ad esempio, "è mezzanotte").

Questo è un progetto veloce: ti diamo abbastanza per iniziare con l'hardware e lo schizzo, e poi puoi portarlo avanti in base alle tue esigenze.

Passaggio 1: hardware

Hardware
Hardware

Avrai bisogno di tre elementi principali:

  • una scheda compatibile con Arduino Uno
  • un circuito o modulo di clock in tempo reale che utilizza un IC DS1307 o DS3231
  • e un display LED monocromatico in stile P10

Potresti volere un alimentatore esterno, ma ci arriveremo più avanti.

La prima fase consiste nell'adattare il tuo orologio in tempo reale. Clicca qui per il tutorial se hai bisogno di aiuto.

A questo punto spero che tu stia pensando "come imposti l'ora?".

Ci sono due risposte a questa domanda. Se stai usando il DS3231, impostalo nello schizzo (vedi sotto) poiché la precisione è molto buona, devi solo caricare lo schizzo con il nuovo orario due volte l'anno per coprire l'ora legale.

Altrimenti aggiungi una semplice interfaccia utente: un paio di pulsanti potrebbero farlo. Infine devi solo mettere l'hardware sul retro del DMD. C'è molto spazio per soddisfare le tue esigenze, una soluzione semplice potrebbe essere quella di allineare la scheda di controllo in modo da poter accedere facilmente alla presa USB e poi attaccarla con un po' di Sugru.

Per quanto riguarda l'alimentazione dell'orologio, puoi eseguire UN display LED da Arduino e funziona con una buona luminosità per l'uso in interni. Se si desidera che il DMD funzioni alla massima luminosità, che brucia la retina, è necessario utilizzare un alimentatore CC separato da 5 V 4 A. Se stai usando due DMD, questo va a 8A e così via. Collegare semplicemente l'alimentazione esterna ai terminali di un DMD (collegare il secondo o più DMD a questi terminali).

Se non hai voglia di tagliare l'estremità del cavo di alimentazione, usa un breakout della presa CC.

Passaggio 2: lo schizzo di Arduino

Dovrai installare le seguenti due librerie Arduino: TimerOne e DMD. Quindi carica lo schizzo:

// per RTC#include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // l'RTC DS1307 è 0x68

// per display a LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // potresti avere più di un DMD in un riga #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

Stringa finaleStringa; // usato per contenere la frase finale da visualizzare su DMD

void ScanDMD() // richiesto per DMD

{ dmd.scanDisplayBySPI(); }

configurazione nulla()

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

// per RTC

Wire.begin(); // avvia il bus I2C byte secondo, minuto, ora, giorno della settimana, giorno del mese, mese, anno; // cambia le variabili e decommenta setDateDs1307 per impostare l'ora // quindi commenta di nuovo la funzione e carica di nuovo lo sketch second = 0; minuto = 13; ora = 23; giornodellasettimana = 4; giorno del mese = 19; mese = 5; anno = 13; // setDateDs1307(secondo, minuto, ora, giorno della settimana, giorno del mese, mese, anno); }

// normali funzioni RTC

// Converte i normali numeri decimali in byte decimale codificato binario decToBcd(byte val) { return ((val/10*16) + (val%10)); }

// Converti i numeri decimali codificati binari in numeri decimali normali

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

void setDateDs1307(byte secondo, // 0-59

byte minuto, // 0-59 byte ora, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/byte mese, // 1-12 byte anno) // 0- 99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(secondo)); // Da 0 al bit 7 avvia l'orologio Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(mese)); Wire.write(decToBcd(year)); Wire.write(00010000); // invia 0x10 (hex) 00010000 (binario) al registro di controllo - attiva l'onda quadra Wire.endTransmission(); }

// Ottiene la data e l'ora dal ds1307

void getDateDs1307(byte *secondo, byte *minuto, byte *ora, byte *dayOfWeek, byte *dayOfMonth, byte *mese, byte *anno) { // Reimposta il puntatore del registro Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// Alcuni di questi necessitano di maschere perché alcuni bit sono bit di controllo

*secondo = bcdToDec(Wire.read() & 0x7f); *minuto = bcdToDec(Wire.read()); *ora = bcdToDec(Wire.read() & 0x3f); // È necessario modificarlo se 12 ore am/pm *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *mese = bcdToDec(Wire.read()); *anno = bcdToDec(Wire.read()); }

void drawText(String oldString)

{ dmd.clearScreen(true); dmd.selectFont(Arial_Black_16); char nuovaStringa[256]; int sLength = oldString.length(); oldString.toCharArray(newString, sLength+1); dmd.drawMarquee(newString, sLength, (32*DISPLAYS_ACROSS)-1, 0); inizio lungo=millis(); timer lungo=inizio; timer lungo2=inizio; booleano ret=false; while(!ret){ if ((timer+20) < millis()) { ret=dmd.stepMarquee(-1, 0); timer=millimetri(); } } }

void createTextTime(int hh, int mm)

// questo combina tutti i dati temporali in testo come una frase { finalString=" "; // cancella la frase per casi speciali (sotto) finalString=finalString+"It's ";

// ora aggiungi l'ora

if (hh==1 || hh==13) { finalString=finalString+"one"; } if (hh==2 || hh==14) { finalString=finalString+"due"; } if (hh==3 || hh==15) { finalString=finalString+"tre"; } if (hh==4 || hh==16) { finalString=finalString+"quattro"; } if (hh==5 || hh==17) { finalString=finalString+"cinque"; } if (hh==6 || hh==18) { finalString=finalString+"sei"; } if (hh==7 || hh==19) { finalString=finalString+"sette"; } if (hh==8 || hh==20) { finalString=finalString+"otto"; } if (hh==9 || hh==21) { finalString=finalString+"nove"; } if (hh==10 || hh==22) { finalString=finalString+"dieci"; } if (hh==11 || hh==23) { finalString=finalString+"undici"; }

// ora aggiungi i minuti

switch(mm){ case 1: finalString=finalString+"oh one"; rottura; caso 2: finalString=finalString+"oh due"; rottura; caso 3: finalString=finalString+"oh tre"; rottura; caso 4: finalString=finalString+"oh four"; rottura; caso 5: finalString=finalString+"oh five"; rottura; caso 6: finalString=finalString+"oh six"; rottura; caso 7: finalString=finalString+"oh sette"; rottura; caso 8: finalString=finalString+"oh otto"; rottura; caso 9: finalString=finalString+"oh nove"; rottura; caso 10: finalString=finalString+"dieci"; rottura; caso 11: finalString=finalString+"undici"; rottura; caso 12: finalString=finalString+"dodici"; rottura; caso 13: finalString=finalString+"tredici"; rottura; caso 14: finalString=finalString+"quattordici"; rottura; caso 15: finalString=finalString+"quindici"; rottura; caso 16: finalString=finalString+"sedici"; rottura; caso 17: finalString=finalString+"diciassette"; rottura; caso 18: finalString=finalString+"diciotto"; rottura; caso 19: finalString=finalString+"diciannove"; rottura; caso 20: stringafinale=Stringafinale+"venti"; rottura; caso 21: finalString=finalString+"ventuno "; rottura; caso 22: finalString=finalString+"ventidue"; rottura; caso 23: finalString=finalString+"ventitre"; rottura; caso 24: finalString=finalString+"ventiquattro"; rottura; caso 25: finalString=finalString+"venticinque"; rottura; caso 26: finalString=finalString+"ventisei"; rottura; caso 27: finalString=finalString+"ventisette"; rottura; caso 28: finalString=finalString+"ventotto"; rottura; caso 29: finalString=finalString+"ventinove"; rottura; case 30: finalString=finalString+"trenta"; rottura; case 31: finalString=finalString+"trentuno"; rottura; case 32: finalString=finalString+"trentadue"; rottura; case 33: finalString=finalString+"trentatre"; rottura; caso 34: finalString=finalString+"trentaquattro"; rottura; caso 35: finalString=finalString+"trentacinque"; rottura; caso 36: finalString=finalString+"trentasei"; rottura; caso 37: finalString=finalString+"trentasette"; rottura; caso 38: finalString=finalString+"trentotto"; rottura; caso 39: finalString=finalString+"trentanove"; rottura; case 40: finalString=finalString+"quaranta"; rottura; case 41: finalString=finalString+"quarantuno"; rottura; case 42: finalString=finalString+"quarantadue"; rottura; case 43: finalString=finalString+"quarantatre"; rottura; case 44: finalString=finalString+"quarantaquattro"; rottura; case 45: finalString=finalString+"quarantacinque"; rottura; case 46: finalString=finalString+"quarantasei"; rottura; case 47: finalString=finalString+"quarantasette"; rottura; case 48: finalString=finalString+"quarantotto"; rottura; case 49: finalString=finalString+"quarantanove"; rottura; case 50: finalString=finalString+"cinquanta"; rottura; caso 51: finalString=finalString+"cinquantuno"; rottura; caso 52: finalString=finalString+"cinquantadue"; rottura; case 53: finalString=finalString+"cinquantatre"; rottura; case 54: finalString=finalString+"cinquantaquattro"; rottura; caso 55: finalString=finalString+"cinquantacinque"; rottura; caso 56: finalString=finalString+"cinquantasei"; rottura; caso 57: finalString=finalString+"cinquantasette"; rottura; caso 58: finalString=finalString+"cinquantotto"; rottura; case 59: finalString=finalString+"cinquantanove "; rottura; }

// mezzogiorno?

if (hh==12 && mm==0) { finalString=finalString+"mezzogiorno "; } // mezzanotte? if (hh==00 && mm==0) { finalString=finalString+"midnight "; }

}

ciclo vuoto()

{ // ottiene l'ora dall'RTC byte secondo, minuto, ora, giorno della settimana, giorno del mese, mese, anno; getDateDs1307(&secondo, &minuto, &ora, &giornoSettimana, &giornoMese, &mese, &anno);

// converte l'ora in una stringa di frase

createTextTime(ora, minuto);

// ora invia il testo al DMD

drawText(finalString); }

Lo sketch ha le consuete funzioni per impostare e recuperare l'ora dai circuiti integrati dell'orologio in tempo reale DS1307/3232 e, come al solito con tutti i nostri orologi, è possibile inserire le informazioni sull'ora nelle variabili in void setup(), quindi decommentare setDateDs1307(), carica lo schizzo, commenta nuovamente setDateDs1307, quindi carica di nuovo lo schizzo. Ripeti questo processo per reimpostare l'ora se non hai aggiunto alcuna interfaccia utente basata su hardware.

Passaggio 3:

Una volta che l'ora viene recuperata in void loop(), viene passata alla funzione createTextTime(). Questa funzione crea la stringa di testo da visualizzare iniziando con "It's", quindi determina quali parole seguire a seconda dell'ora corrente. Infine la funzione drawText() converte la stringa che contiene il testo da visualizzare in una variabile di caratteri che può essere passata al DMD.

Consigliato: