Innehållsförteckning:

Arduino Scrolling Text Clock: 3 steg
Arduino Scrolling Text Clock: 3 steg

Video: Arduino Scrolling Text Clock: 3 steg

Video: Arduino Scrolling Text Clock: 3 steg
Video: How to make a Scrolling display at home || Circuit Animation Part-3 2024, Juli
Anonim
Arduino rullande textur
Arduino rullande textur

Syftet med detta projekt är att bygga en rullande textklocka som visar tiden när den talas (till exempel "det är midnatt").

Detta är ett snabbt projekt - vi ger dig tillräckligt för att komma igång med hårdvaran och skissen, och sedan kan du ta det vidare för att passa dina behov.

Steg 1: Hårdvara

Hårdvara
Hårdvara

Du behöver tre huvudartiklar -

  • ett Arduino Uno-kompatibelt kort
  • en realtidsklocka eller modul med antingen en DS1307 eller DS3231 IC
  • och en monokrom P10-stil LED-display

Du kanske vill ha en extern strömförsörjning, men vi kommer till det senare.

Det första steget är att passa din realtidsklocka. Klicka här för handledning om du behöver hjälp med det.

Nu hoppas jag att du tänker "hur ställer du in tiden?".

Det finns två svar på den frågan. Om du använder DS3231 ställer du in den i skissen (se nedan) eftersom noggrannheten är mycket bra, du behöver bara ladda upp skissen med den nya tiden två gånger om året för att täcka sommartid.

Lägg annars till ett enkelt användargränssnitt-ett par knappar kan göra det. Slutligen behöver du bara sätta hårdvaran på baksidan av DMD. Det finns gott om utrymme för att tillgodose dina egna behov. En enkel lösning kan vara att justera kontrollkortet så att du enkelt kan komma åt USB -uttaget - och sedan hålla ner det med lite Sugru.

När det gäller att driva klockan - du kan köra en LED -skärm från Arduino, och den körs med en bra ljusstyrka för inomhusbruk. Om du vill att DMD ska fungera fullt ut, retina-brinnande ljusstyrka måste du använda en separat 5V 4A DC strömförsörjning. Om du använder två DMD: er går det till 8A och så vidare. Anslut helt enkelt den externa strömmen till en DMD: s terminaler (anslut den andra eller fler DMD: erna till dessa terminaler).

Om du inte vill hacka änden av din strömkabel, använd ett DC -uttag.

Steg 2: Arduino -skissen

Du måste installera följande två Arduino -bibliotek - TimerOne och DMD. Ladda sedan upp skissen:

// för RTC #inkluderar "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC är 0x68

// för LED -display

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // you could have more than one DMD in a rad #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // används för att hålla den sista meningen att visa på DMD

void ScanDMD () // krävs för DMD

{dmd.scanDisplayBySPI (); }

void setup ()

{// för DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (true);

// för RTC

Wire.begin (); // elda upp I2C -bussbyte sekund, minut, timme, dayOfWeek, dayOfMonth, månad, år; // ändra variablerna och avmarkera setDateDs1307 för att ställa in tiden // kommentera sedan om funktionen och ladda upp skissen igen second = 0; minut = 13; timme = 23; dayOfWeek = 4; dayOfMonth = 19; månad = 5; år = 13; // setDateDs1307 (second, minute, hour, dayOfWeek, dayOfMonth, month, year); }

// vanliga RTC -funktioner

// Konvertera normala decimaltal till binärt kodade decimal byte decToBcd (byte val) {return ((val/10*16) + (val%10)); }

// Konvertera binärt kodade decimaler till normala decimalnummer

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

void setDateDs1307 (byte second, // 0-59

byte minut, // 0-59 byte timme, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/byte månad, // 1-12 byte år) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (andra)); // 0 till bit 7 startar klockan Wire.write (decToBcd (minut)); Wire.write (decToBcd (timme)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (månad)); Wire.write (decToBcd (år)); Wire.write (00010000); // skickar 0x10 (hex) 00010000 (binärt) till styrregistret - slår på fyrkantvåg Wire.endTransmission (); }

// Hämtar datum och tid från ds1307

void getDateDs1307 (byte *sekund, byte *minut, byte *timme, byte *dayOfWeek, byte *dayOfMonth, byte *månad, byte *år) {// Återställ registerpekaren Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Några av dessa behöver masker eftersom vissa bitar är kontrollbitar

*second = bcdToDec (Wire.read () & 0x7f); *minut = bcdToDec (Wire.read ()); *timme = bcdToDec (Wire.read () & 0x3f); // Behöver ändra detta om 12 timmar am/pm *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *månad = bcdToDec (Wire.read ()); *år = 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); lång start = millis (); lång timer = start; lång timer2 = start; booleskt ret = false; medan (! ret) {if ((timer+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); timer = millis (); }}}

void createTextTime (int hh, int mm)

// det här sammanställer hela tiden data till text som en mening {finalString = ""; // torka meningen för specialfall (nedan) finalString = finalString+"It's";

// lägg nu till timmen

if (hh == 1 || hh == 13) {finalString = finalString+"en"; } if (hh == 2 || hh == 14) {finalString = finalString+"två"; } if (hh == 3 || hh == 15) {finalString = finalString+"tre"; } if (hh == 4 || hh == 16) {finalString = finalString+"fyra"; } if (hh == 5 || hh == 17) {finalString = finalString+"fem"; } if (hh == 6 || hh == 18) {finalString = finalString+"sex"; } if (hh == 7 || hh == 19) {finalString = finalString+"sju"; } if (hh == 8 || hh == 20) {finalString = finalString+"åtta"; } if (hh == 9 || hh == 21) {finalString = finalString+"nio"; } om (hh == 10 || hh == 22) {finalString = finalString+"tio"; } if (hh == 11 || hh == 23) {finalString = finalString+"elva"; }

// lägg nu till protokollet

switch (mm) {case 1: finalString = finalString+"oh one"; ha sönder; fall 2: finalString = finalString+"åh två"; ha sönder; fall 3: finalString = finalString+"åh tre"; ha sönder; fall 4: finalString = finalString+"åh fyra"; ha sönder; fall 5: finalString = finalString+"åh fem"; ha sönder; fall 6: finalString = finalString+"åh sex"; ha sönder; fall 7: finalString = finalString+"åh sju"; ha sönder; fall 8: finalString = finalString+"åh åtta"; ha sönder; fall 9: finalString = finalString+"åh nio"; ha sönder; fall 10: finalString = finalString+"tio"; ha sönder; fall 11: finalString = finalString+"elva"; ha sönder; fall 12: finalString = finalString+"tolv"; ha sönder; fall 13: finalString = finalString+"tretton"; ha sönder; fall 14: finalString = finalString+"fjorton"; ha sönder; fall 15: finalString = finalString+"femton"; ha sönder; fall 16: finalString = finalString+"sexton"; ha sönder; fall 17: finalString = finalString+"sjutton"; ha sönder; fall 18: finalString = finalString+"arton"; ha sönder; fall 19: finalString = finalString+"nitton"; ha sönder; fall 20: finalString = finalString+"tjugo"; ha sönder; fall 21: finalString = finalString+"tjugoen"; ha sönder; fall 22: finalString = finalString+"tjugotvå"; ha sönder; fall 23: finalString = finalString+"tjugotre"; ha sönder; fall 24: finalString = finalString+"tjugofyra"; ha sönder; fall 25: finalString = finalString+"tjugofem"; ha sönder; fall 26: finalString = finalString+"tjugosex"; ha sönder; fall 27: finalString = finalString+"tjugosju"; ha sönder; fall 28: finalString = finalString+"tjugoåtta"; ha sönder; fall 29: finalString = finalString+"tjugonio"; ha sönder; fall 30: finalString = finalString+"trettio"; ha sönder; fall 31: finalString = finalString+"trettio"; ha sönder; fall 32: finalString = finalString+"trettiotvå"; ha sönder; fall 33: finalString = finalString+"trettiotre"; ha sönder; fall 34: finalString = finalString+"trettiofyra"; ha sönder; fall 35: finalString = finalString+"trettiofem"; ha sönder; fall 36: finalString = finalString+"trettiosex"; ha sönder; fall 37: finalString = finalString+"trettiosju"; ha sönder; fall 38: finalString = finalString+"trettioåtta"; ha sönder; fall 39: finalString = finalString+"trettio nio"; ha sönder; fall 40: finalString = finalString+"fyrtio"; ha sönder; fall 41: finalString = finalString+"fyrtio"; ha sönder; fall 42: finalString = finalString+"fyrtiotvå"; ha sönder; fall 43: finalString = finalString+"fyrtiotre"; ha sönder; fall 44: finalString = finalString+"fyrtiofyra"; ha sönder; fall 45: finalString = finalString+"fyrtiofem"; ha sönder; fall 46: finalString = finalString+"fyrtiosex"; ha sönder; fall 47: finalString = finalString+"fyrtiosju"; ha sönder; fall 48: finalString = finalString+"fyrtioåtta"; ha sönder; fall 49: finalString = finalString+"fyrtio nio"; ha sönder; fall 50: finalString = finalString+"femtio"; ha sönder; fall 51: finalString = finalString+"femtio en"; ha sönder; fall 52: finalString = finalString+"femtiotvå"; ha sönder; fall 53: finalString = finalString+"femtiotre"; ha sönder; fall 54: finalString = finalString+"femtiofyra"; ha sönder; fall 55: finalString = finalString+"femtiofem"; ha sönder; fall 56: finalString = finalString+"femtiosex"; ha sönder; fall 57: finalString = finalString+"femtiosju"; ha sönder; fall 58: finalString = finalString+"femtioåtta"; ha sönder; fall 59: finalString = finalString+"femtio nio"; ha sönder; }

// mitt på dagen?

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

}

void loop ()

{// få tiden från RTC -byte sekund, minut, timme, dayOfWeek, dayOfMonth, månad, år; getDateDs1307 (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

// konvertera tiden till en meningssträng

createTextTime (timme, minut);

// skicka nu texten till DMD

drawText (finalString); }

Skissen har de vanliga funktionerna för att ställa in och hämta tiden från DS1307/3232 realtidsklocka IC: er, och som vanligt med alla våra klockor kan du ange tidsinformationen i variablerna i void setup (), sedan avkommentera setDateDs1307 (), ladda upp skissen, kommentera setDateDs1307 igen och ladda upp skissen igen. Upprepa processen för att återställa tiden om du inte har lagt till något maskinvarubaserat användargränssnitt.

Steg 3:

När tiden hämtats i void loop (), skickas den till funktionen createTextTime (). Denna funktion skapar textsträngen som ska visas genom att börja med "It's" och bestämmer sedan vilka ord som ska följas beroende på aktuell tid. Slutligen konverterar funktionen drawText () strängen som håller texten för att visas till en teckenvariabel som kan skickas till DMD.

Rekommenderad: