Inhaltsverzeichnis:

Arduino Scrolling Text Clock - Gunook
Arduino Scrolling Text Clock - Gunook

Video: Arduino Scrolling Text Clock - Gunook

Video: Arduino Scrolling Text Clock - Gunook
Video: Scrolling Matrix with Bluetooth and clock 2024, November
Anonim
Arduino Scrolling Text Clock
Arduino Scrolling Text Clock

Der Zweck dieses Projekts besteht darin, eine Lauftextuhr zu bauen, die die gesprochene Zeit anzeigt (z. B. „es ist Mitternacht“).

Dies ist ein schnelles Projekt – wir geben Ihnen genug, um mit der Hardware und der Skizze loszulegen, und dann können Sie es nach Ihren Bedürfnissen weiterführen.

Schritt 1: Hardware

Hardware
Hardware

Sie benötigen drei Hauptgegenstände –

  • ein Arduino Uno-kompatibles Board
  • eine Echtzeituhrschaltung oder ein Modul mit einem DS1307- oder DS3231-IC
  • und ein monochromes LED-Display im P10-Stil

Vielleicht möchten Sie eine externe Stromversorgung, aber dazu kommen wir später.

Der erste Schritt besteht darin, Ihre Echtzeituhr anzupassen. Klicken Sie hier für das Tutorial, wenn Sie dabei Hilfe benötigen.

Ich hoffe, Sie denken jetzt: „Wie stellen Sie die Zeit ein?“.

Auf diese Frage gibt es zwei Antworten. Wenn Sie den DS3231 verwenden, stellen Sie ihn einfach in der Skizze ein (siehe unten), da die Genauigkeit sehr gut ist, Sie müssen die Skizze nur zweimal im Jahr mit der neuen Uhrzeit hochladen, um die Sommerzeit abzudecken.

Andernfalls fügen Sie eine einfache Benutzeroberfläche hinzu – ein paar Schaltflächen könnten es tun. Schließlich müssen Sie nur noch die Hardware auf die Rückseite des DMD legen. Es gibt viel Spielraum für die eigenen Bedürfnisse, eine einfache Lösung könnte darin bestehen, die Steuerplatine so auszurichten, dass Sie problemlos auf die USB-Buchse zugreifen können – und diese dann mit etwas Sugru festkleben.

In Bezug auf die Stromversorgung der Uhr – Sie können EIN LED-Display vom Arduino aus betreiben, und es läuft mit einer guten Helligkeit für den Innenbereich. Wenn Sie möchten, dass das DMD mit voller, retinabrennender Helligkeit läuft, müssen Sie ein separates 5V 4A DC-Netzteil verwenden. Wenn Sie zwei DMDs verwenden, geht das bis 8A und so weiter. Schließen Sie einfach die externe Stromversorgung an die Anschlüsse eines DMDs an (schließen Sie das zweite oder mehrere DMDs an diese Anschlüsse an).

Wenn Sie das Ende Ihres Stromversorgungskabels nicht abschneiden möchten, verwenden Sie einen DC-Buchsen-Breakout.

Schritt 2: Die Arduino-Skizze

Sie müssen die folgenden beiden Arduino-Bibliotheken installieren – TimerOne und DMD. Dann laden Sie die Skizze hoch:

// für RTC#include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // die DS1307 RTC ist 0x68

// für LED-Anzeige

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // Sie könnten mehr als ein DMD in a. haben Zeile #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // wird verwendet, um den letzten Satz zu halten, der auf DMD angezeigt werden soll

void ScanDMD() // erforderlich für DMD

{ dmd.scanDisplayBySPI(); }

Void-Setup ()

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

// für RTC

Wire.begin(); // I2C-Bus-Byte starten Sekunde, Minute, Stunde, dayOfWeek, dayOfMonth, month, year; // die Variablen ändern und setDateDs1307 auskommentieren, um die Zeit einzustellen // dann die Funktion erneut auskommentieren und die Skizze erneut hochladen second = 0; Minute = 13; Stunde = 23; dayOfweek = 4; dayOfMonth = 19; Monat = 5; Jahr = 13; // setDateDs1307(Sekunde, Minute, Stunde, dayOfWeek, dayOfMonth, Monat, Jahr); }

// übliche RTC-Funktionen

// Konvertieren Sie normale Dezimalzahlen in binär codiertes Dezimalbyte decToBcd(byte val) { return ((val/10*16) + (val%10)); }

// Konvertiere binär codierte Dezimalzahlen in normale Dezimalzahlen

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

void setDateDs1307 (Byte Sekunde, // 0-59

Byte Minute, // 0-59 Byte Stunde, // 1-23 Byte DayOfWeek, // 1-7 Byte DayOfMonth, // 1-28/29/Byte Monat, // 1-12 Byte Jahr) // 0- 99 { Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write(0); Wire.write (decToBcd (zweite)); // 0 bis Bit 7 startet die Uhr Wire.write (decToBcd (minute)); Wire.write (decToBcd (Stunde)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (Monat)); Wire.write (decToBcd (Jahr)); Wire.write(00010000); // sendet 0x10 (hex) 00010000 (binär) an das Steuerregister - schaltet die Rechteckwelle ein Wire.endTransmission(); }

// Ruft Datum und Uhrzeit vom ds1307 ab

void getDateDs1307(Byte *Sekunde, Byte *Minute, Byte *Stunde, Byte *TagOfWeek, Byte *TagOfMonth, Byte *Monat, Byte *Jahr) { // Registerzeiger zurücksetzen Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// Einige davon benötigen Masken, da bestimmte Bits Kontrollbits sind

*zweite = bcdToDec(Wire.read() & 0x7f); *Minute = bcdToDec(Wire.read()); *Stunde = bcdToDec(Wire.read() & 0x3f); // Muss dies ändern, wenn 12 Stunden am/pm *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *Monat = bcdToDec(Wire.read()); *Jahr = bcdToDec(Wire.read()); }

void drawText(String oldString)

{ dmd.clearScreen (wahr); dmd.selectFont(Arial_Black_16); char neuerString[256]; int sLength = oldString.length(); oldString.toCharArray(newString, sLength+1); dmd.drawMarquee(newString, sLength, (32*DISPLAYS_ACROSS)-1, 0); langer start=millis(); langer Timer=Start; langer Timer2=Start; boolesches ret=false; Während (! ret) { if ((timer + 20) < millis ()) { ret = dmd.stepMarquee (-1, 0); Timer=Millis(); } } }

void createTextTime(int hh, int mm)

// dies mischt alle Zeitdaten in Text als einen Satz zusammen { finalString=" "; // den Satz für Sonderfälle auslöschen (unten) finalString=finalString+"It's";

// füge jetzt die Stunde hinzu

if (hh==1 || hh==13) { finalString=finalString+"one"; } if (hh==2 || hh==14) { finalString=finalString+"zwei"; } if (hh==3 || hh==15) { finalString=finalString+"drei"; } if (hh==4 || hh==16) { finalString=finalString+"vier"; } if (hh==5 || hh==17) { finalString=finalString+"fünf"; } if (hh==6 || hh==18) { finalString=finalString+"six"; } if (hh==7 || hh==19) { finalString=finalString+"sieben"; } if (hh==8 || hh==20) { finalString=finalString+"acht"; } if (hh==9 || hh==21) { finalString=finalString+"neun"; } if (hh==10 || hh==22) { finalString=finalString+"zehn"; } if (hh==11 || hh==23) { finalString=finalString+"eleven"; }

// füge jetzt die Minuten hinzu

Schalter (mm) { Fall 1: finalString=finalString+"oh one"; brechen; Fall 2: finalString=finalString+"oh two"; brechen; Fall 3: finalString=finalString+"oh drei"; brechen; Fall 4: finalString=finalString+"oh vier"; brechen; Fall 5: finalString=finalString+"oh five"; brechen; Fall 6: finalString=finalString+"oh sechs"; brechen; Fall 7: finalString=finalString+"oh sieben"; brechen; Fall 8: finalString=finalString+"oh acht"; brechen; Fall 9: finalString=finalString+"oh neun"; brechen; Fall 10: finalString=finalString+"zehn"; brechen; Fall 11: finalString=finalString+"elf"; brechen; Fall 12: finalString=finalString+"zwölf"; brechen; Fall 13: finalString=finalString+"dreizehn"; brechen; Fall 14: finalString=finalString+"vierzehn"; brechen; Fall 15: finalString=finalString+"fünfzehn"; brechen; Fall 16: finalString=finalString+"sechzehn"; brechen; Fall 17: finalString=finalString+"siebzehn"; brechen; Fall 18: finalString=finalString+"achtzehn"; brechen; Fall 19: finalString=finalString+"neunzehn"; brechen; Fall 20: finalString=finalString+"zwanzig"; brechen; Fall 21: finalString=finalString+"einundzwanzig"; brechen; Fall 22: finalString=finalString+"zweiundzwanzig"; brechen; Fall 23: finalString=finalString+"dreiundzwanzig"; brechen; Fall 24: finalString=finalString+"vierundzwanzig"; brechen; Fall 25: finalString=finalString+"fünfundzwanzig"; brechen; Fall 26: finalString=finalString+"sechsundzwanzig"; brechen; Fall 27: finalString=finalString+"siebenundzwanzig"; brechen; Fall 28: finalString=finalString+"achtundzwanzig"; brechen; Fall 29: finalString=finalString+"neunundzwanzig"; brechen; Fall 30: finalString=finalString+"dreißig"; brechen; Fall 31: finalString=finalString+"einunddreißig"; brechen; Fall 32: finalString=finalString+"zweiunddreißig"; brechen; Fall 33: finalString=finalString+"dreiunddreißig"; brechen; Fall 34: finalString=finalString+"vierunddreißig"; brechen; Fall 35: finalString=finalString+"fünfunddreißig"; brechen; Fall 36: finalString=finalString+"sechsunddreißig"; brechen; Fall 37: finalString=finalString+"siebenunddreißig"; brechen; Fall 38: finalString=finalString+"achtunddreißig"; brechen; Fall 39: finalString=finalString+"neununddreißig"; brechen; Fall 40: finalString=finalString+"vierzig"; brechen; Fall 41: finalString=finalString+"einundvierzig"; brechen; Fall 42: finalString=finalString+"zweiundvierzig"; brechen; Fall 43: finalString=finalString+"dreiundvierzig"; brechen; Fall 44: finalString=finalString+"vierundvierzig"; brechen; Fall 45: finalString=finalString+"fünfundvierzig"; brechen; Fall 46: finalString=finalString+"sechsundvierzig"; brechen; Fall 47: finalString=finalString+"siebenundvierzig"; brechen; Fall 48: finalString=finalString+"achtundvierzig"; brechen; Fall 49: finalString=finalString+"neunundvierzig"; brechen; Fall 50: finalString=finalString+"fünfzig"; brechen; Fall 51: finalString=finalString+"einundfünfzig"; brechen; Fall 52: finalString=finalString+"zweiundfünfzig"; brechen; Fall 53: finalString=finalString+"dreiundfünfzig"; brechen; Fall 54: finalString=finalString+"vierundfünfzig"; brechen; Fall 55: finalString=finalString+"fünfundfünfzig"; brechen; Fall 56: finalString=finalString+"56"; brechen; Fall 57: finalString=finalString+"siebenundfünfzig"; brechen; Fall 58: finalString=finalString+"achtundfünfzig"; brechen; Fall 59: finalString=finalString+"neunundfünfzig"; brechen; }

// Mittag?

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

}

Leere Schleife ()

{ // Hole die Zeit aus dem RTC-Byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&Sekunde, &Minute, &Stunde, &TagOfWoche, &TagOfMonat, &Monat, &Jahr);

// die Zeit in eine Satzzeichenfolge umwandeln

createTextTime(Stunde, Minute);

// jetzt den Text an das DMD senden

drawText(finalString); }

Der Sketch hat die üblichen Funktionen, um die Zeit von DS1307/3232-Echtzeituhr-ICs einzustellen und abzurufen, und wie bei allen unseren Uhren können Sie die Zeitinformationen in die Variablen in void setup() eingeben und dann setDateDs1307() auskommentieren. Laden Sie die Skizze hoch, kommentieren Sie setDateDs1307 erneut und laden Sie die Skizze erneut hoch. Wiederholen Sie diesen Vorgang, um die Zeit neu einzustellen, wenn Sie keine hardwarebasierte Benutzeroberfläche hinzugefügt haben.

Schritt 3:

Sobald die Zeit in void loop() abgerufen wurde, wird sie an die Funktion createTextTime() übergeben. Diese Funktion erstellt die anzuzeigende Textzeichenfolge, indem sie mit „It’s“beginnt, und bestimmt dann, welche Wörter in Abhängigkeit von der aktuellen Uhrzeit folgen. Schließlich wandelt die Funktion drawText() den String, der den anzuzeigenden Text enthält, in eine Zeichenvariable um, die an das DMD übergeben werden kann.

Empfohlen: