Taula de continguts:

Rellotge de text de desplaçament Arduino: 3 passos
Rellotge de text de desplaçament Arduino: 3 passos

Vídeo: Rellotge de text de desplaçament Arduino: 3 passos

Vídeo: Rellotge de text de desplaçament Arduino: 3 passos
Vídeo: CS50 2015 - Week 8, continued 2024, De novembre
Anonim
Rellotge de text de desplaçament Arduino
Rellotge de text de desplaçament Arduino

L’objectiu d’aquest projecte és crear un rellotge de text desplaçable que mostri l’hora a mesura que es parla (per exemple, “és mitjanit”).

Aquest és un projecte ràpid: us donem prou per començar amb el maquinari i l’esbós i, a continuació, el podeu portar més enllà segons les vostres necessitats.

Pas 1: maquinari

Maquinari
Maquinari

Necessitareu tres elements principals:

  • una placa compatible amb Arduino Uno
  • un circuit o mòdul de rellotge en temps real que utilitza un IC DS1307 o DS3231
  • i una pantalla LED monocroma a l'estil P10

És possible que vulgueu una font d’alimentació externa, però hi arribarem més endavant.

La primera etapa és adaptar-se al rellotge en temps real. Feu clic aquí per obtenir el tutorial si necessiteu ajuda.

A hores d'ara espero que estigueu pensant "com fixeu el temps?".

Hi ha dues respostes a aquesta pregunta. Si utilitzeu el DS3231, simplement configureu-lo a l’esbós (vegeu més avall), ja que la precisió és molt bona, només heu de penjar l’esbós amb la nova hora dues vegades a l’any per cobrir l’estiu.

En cas contrari, afegiu una interfície d’usuari senzilla: podrien fer-ho un parell de botons. Finalment, només cal posar el maquinari a la part posterior del DMD. Hi ha un ampli abast per satisfer les vostres pròpies necessitats; una solució senzilla pot ser alinear la placa de control perquè pugueu accedir fàcilment a la presa USB i, després, enganxar-la amb una mica de Sugru.

Pel que fa a l’encesa del rellotge: podeu executar una pantalla LED ONE des de l’Arduino i funciona amb una bona brillantor per a ús interior. Si voleu que el DMD funcioni al màxim amb la brillantor que crema la retina, heu d’utilitzar una font d’alimentació de 5V 4A CC separada. Si feu servir dos DMD, això passa a 8A, etc. Simplement connecteu l’alimentació externa als terminals d’un DMD (connecteu el segon o més DMD a aquests terminals).

Si no us ve de gust picar l’extrem del cable de la font d’alimentació, utilitzeu una presa de corrent continu.

Pas 2: l'esbós d'Arduino

Haureu d’instal·lar les dues biblioteques Arduino següents: TimerOne i DMD. A continuació, pengeu l'esbós:

// per a RTC # inclou "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // el DS1307 RTC és 0x68

// per a pantalla LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // podríeu tenir més d'un DMD en un fila #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // solia contenir la frase final per mostrar-la a DMD

void ScanDMD () // necessari per a DMD

{dmd.scanDisplayBySPI (); }

configuració nul·la ()

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

// per a RTC

Wire.begin (); // activar el byte del bus I2C segon, minut, hora, dayOfWeek, dayOfMonth, mes, any; // canvieu les variables i descommenteu setDateDs1307 per definir l'hora //, a continuació, torneu a comentar la funció i torneu a carregar l'esbós segon = 0; minut = 13; hora = 23; dayOfWeek = 4; dayOfMonth = 19; mes = 5; any = 13; // setDateDs1307 (segon, minut, hora, dayOfWeek, dayOfMonth, mes, any); }

// funcions RTC habituals

// Converteix els nombres decimals normals en bytes decimals codificats binaris decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); }

// Converteix decimal codificat binari en nombres decimals normals

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

void setDateDs1307 (segon de byte, // 0-59

minut de byte, // 0-59 hora de byte, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28 / 29 / byte mes, // 1-12 byte any) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (segon)); // 0 al bit 7 inicia el rellotge Wire.write (decToBcd (minut)); Wire.write (decToBcd (hora)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mes)); Wire.write (decToBcd (any)); Wire.write (00010000); // envia 0x10 (hex) 00010000 (binari) al registre de control: activa l'ona quadrada Wire.endTransmission (); }

// Obté la data i l'hora des del ds1307

void getDateDs1307 (byte * segon, byte * minut, byte * hora, byte * dayOfWeek, byte * dayOfMonth, byte * mes, byte * any) {// Restableix el punter del registre Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Alguns d'aquests necessiten màscares perquè certs bits són bits de control

* segon = bcdToDec (Wire.read () & 0x7f); * minut = bcdToDec (Wire.read ()); * hora = bcdToDec (Wire.read () & 0x3f); // Cal canviar-ho si a les 12 hores del matí / a la tarda * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * mes = bcdToDec (Wire.read ()); * any = 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); inici llarg = millis (); temporitzador llarg = inici; temporitzador llarg2 = inici; ret booleà = fals; while (! ret) {if ((temporitzador + 20) <millis ()) {ret = dmd.stepMarquee (-1, 0); temporitzador = millis (); }}}

void createTextTime (int hh, int mm)

// això combina totes les dades de temps en text com una frase {finalString = ""; // esborreu la frase per a casos especials (a sota) finalString = finalString + "És";

// ara afegiu l’hora

if (hh == 1 || hh == 13) {finalString = finalString + "one"; } if (hh == 2 || hh == 14) {finalString = finalString + "dos"; } if (hh == 3 || hh == 15) {finalString = finalString + "three"; } if (hh == 4 || hh == 16) {finalString = finalString + "quatre"; } if (hh == 5 || hh == 17) {finalString = finalString + "cinc"; } if (hh == 6 || hh == 18) {finalString = finalString + "sis"; } if (hh == 7 || hh == 19) {finalString = finalString + "seven"; } if (hh == 8 || hh == 20) {finalString = finalString + "vuit"; } if (hh == 9 || hh == 21) {finalString = finalString + "nou"; } if (hh == 10 || hh == 22) {finalString = finalString + "deu"; } if (hh == 11 || hh == 23) {finalString = finalString + "onze"; }

// ara afegiu els minuts

commutador (mm) {cas 1: finalString = finalString + "oh one"; trencar; cas 2: finalString = finalString + "oh dos"; trencar; cas 3: finalString = finalString + "oh tres"; trencar; cas 4: finalString = finalString + "oh quatre"; trencar; cas 5: finalString = finalString + "oh five"; trencar; cas 6: finalString = finalString + "oh sis"; trencar; cas 7: finalString = finalString + "oh set"; trencar; cas 8: finalString = finalString + "oh vuit"; trencar; cas 9: finalString = finalString + "oh nou"; trencar; cas 10: finalString = finalString + "deu"; trencar; cas 11: finalString = finalString + "onze"; trencar; cas 12: finalString = finalString + "dotze"; trencar; cas 13: finalString = finalString + "tretze"; trencar; cas 14: finalString = finalString + "catorze"; trencar; cas 15: finalString = finalString + "quinze"; trencar; cas 16: finalString = finalString + "setze"; trencar; cas 17: finalString = finalString + "disset"; trencar; cas 18: finalString = finalString + "divuit"; trencar; cas 19: finalString = finalString + "dinou"; trencar; cas 20: finalString = finalString + "vint"; trencar; cas 21: finalString = finalString + "vint-i-un"; trencar; cas 22: finalString = finalString + "vint-i-dos"; trencar; cas 23: finalString = finalString + "vint-i-tres"; trencar; cas 24: finalString = finalString + "vint-i-quatre"; trencar; cas 25: finalString = finalString + "vint-i-cinc"; trencar; cas 26: finalString = finalString + "vint-i-sis"; trencar; cas 27: finalString = finalString + "vint set"; trencar; cas 28: finalString = finalString + "vint-i-vuit"; trencar; cas 29: finalString = finalString + "vint-i-nou"; trencar; cas 30: finalString = finalString + "trenta"; trencar; cas 31: finalString = finalString + "trenta-un"; trencar; cas 32: finalString = finalString + "trenta-dos"; trencar; cas 33: finalString = finalString + "trenta-tres"; trencar; cas 34: finalString = finalString + "trenta-quatre"; trencar; cas 35: finalString = finalString + "trenta-cinc"; trencar; cas 36: finalString = finalString + "trenta-sis"; trencar; cas 37: finalString = finalString + "trenta set"; trencar; cas 38: finalString = finalString + "trenta-vuit"; trencar; cas 39: finalString = finalString + "trenta-nou"; trencar; cas 40: finalString = finalString + "quaranta"; trencar; cas 41: finalString = finalString + "quaranta-un"; trencar; cas 42: finalString = finalString + "quaranta dos"; trencar; cas 43: finalString = finalString + "quaranta-tres"; trencar; cas 44: finalString = finalString + "quaranta-quatre"; trencar; cas 45: finalString = finalString + "quaranta cinc"; trencar; cas 46: finalString = finalString + "quaranta-sis"; trencar; cas 47: finalString = finalString + "quaranta set"; trencar; cas 48: finalString = finalString + "quaranta vuit"; trencar; cas 49: finalString = finalString + "quaranta nou"; trencar; cas 50: finalString = finalString + "cinquanta"; trencar; cas 51: finalString = finalString + "cinquanta un"; trencar; cas 52: finalString = finalString + "cinquanta dos"; trencar; cas 53: finalString = finalString + "cinquanta-tres"; trencar; cas 54: finalString = finalString + "cinquanta quatre"; trencar; cas 55: finalString = finalString + "cinquanta cinc"; trencar; cas 56: finalString = finalString + "cinquanta-sis"; trencar; cas 57: finalString = finalString + "cinquanta set"; trencar; cas 58: finalString = finalString + "cinquanta vuit"; trencar; cas 59: finalString = finalString + "cinquanta nou"; trencar; }

// migdia?

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

}

bucle buit ()

{// obtenir el temps del byte RTC segon, minut, hora, dayOfWeek, dayOfMonth, mes, any; getDateDs1307 (& segon, & minut, & hora, & dayOfWeek, & dayOfMonth, & mes, & any);

// converteix l’hora en una cadena de frases

createTextTime (hora, minut);

// ara envieu el text al DMD

drawText (finalString); }

L’esbós té les funcions habituals per configurar i recuperar l’hora dels circuits de rellotge en temps real DS1307 / 3232 i, com és habitual amb tots els nostres rellotges, podeu introduir la informació horària a les variables de la configuració nul·la () i, a continuació, descommentar setDateDs1307 (), carregueu l'esbós, torneu a comentar setDateDs1307 i, a continuació, torneu a carregar l'esbós. Repetiu aquest procés per restablir l'hora si no heu afegit cap interfície d'usuari basada en maquinari.

Pas 3:

Un cop recuperada l'hora en void loop (), es passa a la funció createTextTime (). Aquesta funció crea la cadena de text que es mostra començant per "És" i, a continuació, determina quines paraules cal seguir en funció de l'hora actual. Finalment, la funció drawText () converteix la cadena que conté el text per mostrar-la en una variable de caràcters que es pot passar al DMD.

Recomanat: