Inhoudsopgave:

Arduino scrollende tekstklok - Ajarnpa
Arduino scrollende tekstklok - Ajarnpa

Video: Arduino scrollende tekstklok - Ajarnpa

Video: Arduino scrollende tekstklok - Ajarnpa
Video: как сделать простой, Arduino POV отображать ТЕКСТ, ЧАСЫ, utsource 2024, November
Anonim
Arduino scrollende tekstklok
Arduino scrollende tekstklok

Het doel van dit project is om een scrollende tekstklok te bouwen die de tijd weergeeft zoals deze wordt uitgesproken (bijvoorbeeld "het is middernacht").

Dit is een snel project - we geven je genoeg om aan de slag te gaan met de hardware en schets, en dan kun je verder gaan om aan je behoeften te voldoen.

Stap 1: Hardware

Hardware
Hardware

Je hebt drie belangrijke items nodig -

  • een Arduino Uno-compatibel bord
  • een real-time klokcircuit of module met behulp van een DS1307 of DS3231 IC
  • en een monochroom LED-display in P10-stijl

Misschien wilt u een externe voeding, maar daar komen we later op terug.

De eerste fase is om uw realtime klok te passen. Klik hier voor de tutorial als je daar hulp bij nodig hebt.

Ik hoop dat je nu denkt "hoe stel je de tijd in?".

Er zijn twee antwoorden op die vraag. Als u de DS3231 gebruikt, stelt u deze gewoon in de schets in (zie hieronder), omdat de nauwkeurigheid erg goed is, u hoeft de schets slechts twee keer per jaar te uploaden met de nieuwe tijd om de zomertijd te dekken.

Voeg anders een eenvoudige gebruikersinterface toe - een paar knoppen zouden het kunnen doen. Ten slotte hoeft u alleen nog maar de hardware op de achterkant van de DMD te plaatsen. Er is voldoende ruimte om aan uw eigen behoeften te voldoen, een eenvoudige oplossing zou kunnen zijn om de besturingskaart uit te lijnen zodat u gemakkelijk toegang hebt tot de USB-aansluiting - en deze vervolgens vast te plakken met wat Sugru.

Met betrekking tot het aandrijven van de klok - u kunt EEN LED-display van de Arduino gebruiken en het werkt met een goede helderheid voor gebruik binnenshuis. Als u wilt dat de DMD op volle, netvliesverbrandende helderheid werkt, moet u een aparte 5V 4A DC-voeding gebruiken. Als u twee DMD's gebruikt, gaat dat naar 8A, enzovoort. Sluit gewoon de externe voeding aan op de terminals van een DMD (sluit de tweede of meer DMD's op deze terminals aan).

Als je geen zin hebt om het uiteinde van je voedingskabel af te hakken, gebruik dan een DC-stopcontact.

Stap 2: De Arduino-schets

U moet de volgende twee Arduino-bibliotheken installeren: TimerOne en DMD. Upload vervolgens de schets:

// voor RTC # include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // de DS1307 RTC is 0x68

// voor LED-display

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // u zou meer dan één DMD in een rij #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finaleString; // gebruikt om de laatste zin vast te houden om weer te geven op DMD

void ScanDMD() // vereist voor DMD

{ dmd.scanDisplayBySPI(); }

ongeldige setup()

{ // voor DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (waar);

// voor RTC

Draad.begin(); // start I2C-busbyte seconde, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar; // verander de variabelen en verwijder het commentaar op de setDateDs1307 om de tijd in te stellen // becommentarieer vervolgens de functie opnieuw en upload de schets opnieuw tweede = 0; minuut = 13; uur = 23; dagVanWeek = 4; dayOfMonth = 19; maand = 5; jaar = 13; // setDateDs1307 (seconde, minuut, uur, dag van de week, dag van de maand, maand, jaar); }

// gebruikelijke RTC-functies

// Converteer normale decimale getallen naar binair gecodeerde decimale byte decToBcd(byte val) { return ((val/10*16) + (val%10)); }

// Converteer binair gecodeerde decimalen naar normale decimale getallen

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

void setDateDs1307 (byte seconde, // 0-59

byte minuut, // 0-59 byte uur, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/byte maand, // 1-12 byte jaar) // 0- 99 { Wire.beginTransmission (DS1307_I2C_ADDRESS); Draad.schrijven(0); Wire.write (decToBcd (tweede)); // 0 tot bit 7 start de klok Wire.write(decToBcd(minute)); Wire.write(decToBcd(uur)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(maand)); Wire.write(decToBcd(jaar)); Wire.write(00010000); // verzendt 0x10 (hex) 00010000 (binair) om het register te controleren - schakelt blokgolf Wire.endTransmission () in; }

// Haalt de datum en tijd van de ds1307

void getDateDs1307 (byte * seconde, byte * minuut, byte * uur, byte * dayOfWeek, byte * dayOfMonth, byte * maand, byte * jaar) { // Reset de registeraanwijzer Wire.beginTransmission (DS1307_I2C_ADDRESS); Draad.schrijven(0); Wire.endTransmission();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Een paar hiervan hebben maskers nodig omdat bepaalde bits controlebits zijn

*seconde = bcdToDec(Wire.read() & 0x7f); *minuut = bcdToDec(Wire.read()); *uur = bcdToDec(Wire.read() & 0x3f); // Moet dit wijzigen als 12 uur am/pm *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *maand = bcdToDec(Wire.read()); *jaar = bcdToDec(Wire.read()); }

void drawText(String oldString)

{ dmd.clearScreen (waar); dmd.selectFont(Arial_Black_16); char nieuweString[256]; int sLength = oldString.length(); oldString.toCharArray(newString, sLength+1); dmd.drawMarquee(newString, sLength, (32*DISPLAYS_ACROSS)-1, 0); lange start=millis(); lange timer=start; lange timer2=start; boolean ret=false; while(!ret){ if ((timer+20) < millis()) { ret=dmd.stepMarquee(-1, 0); timer=millis(); } } }

void createTextTime(int hh, int mm)

// dit vermaalt alle tijdgegevens in tekst als één zin { finalString=" "; // veeg de zin weg voor speciale gevallen (hieronder) finalString=finalString+"It's";

// voeg nu het uur toe

if (hh==1 || hh==13) { finalString=finalString+"een"; } if (hh==2 || hh==14) { finalString=finalString+"twee"; } if (hh==3 || hh==15) { finalString=finalString+"drie "; } if (hh==4 || hh==16) { finalString=finalString+"vier"; } if (hh==5 || hh==17) { finalString=finalString+"vijf"; } if (hh==6 || hh==18) { finalString=finalString+"zes"; } if (hh==7 || hh==19) { finalString=finalString+"zeven"; } if (hh==8 || hh==20) { finalString=finalString+"acht"; } if (hh==9 || hh==21) { finalString=finalString+"negen"; } if (hh==10 || hh==22) { finalString=finalString+"tien"; } if (hh==11 || hh==23) { finalString=finalString+"eleven"; }

// voeg nu de minuten toe

switch(mm){ geval 1: finalString=finalString+"oh een"; pauze; geval 2: finalString=finalString+"oh twee"; pauze; geval 3: finalString=finalString+"oh drie"; pauze; geval 4: finalString=finalString+"oh vier"; pauze; geval 5: finalString=finalString+"oh vijf"; pauze; geval 6: finalString=finalString+"oh zes"; pauze; geval 7: finalString=finalString+"oh zeven"; pauze; geval 8: finalString=finalString+"oh acht"; pauze; geval 9: finalString=finalString+"oh negen"; pauze; geval 10: finalString=finalString+"tien"; pauze; geval 11: finalString=finalString+"elf"; pauze; geval 12: finalString=finalString+"twaalf"; pauze; geval 13: finalString=finalString+"dertien"; pauze; geval 14: finalString=finalString+"veertien"; pauze; geval 15: finalString=finalString+"vijftien"; pauze; geval 16: finalString=finalString+"zestien"; pauze; geval 17: finalString=finalString+"zeventien"; pauze; geval 18: finalString=finalString+"achttien"; pauze; geval 19: finalString=finalString+"negentien "; pauze; geval 20: finalString=finalString+"twintig "; pauze; geval 21: finalString=finalString+"eenentwintig"; pauze; geval 22: finalString=finalString+"tweeëntwintig "; pauze; geval 23: finalString=finalString+"drieëntwintig "; pauze; geval 24: finalString=finalString+"vierentwintig"; pauze; geval 25: finalString=finalString+"vijfentwintig"; pauze; geval 26: finalString=finalString+"zesentwintig"; pauze; geval 27: finalString=finalString+"zevenentwintig"; pauze; geval 28: finalString=finalString+"achtentwintig "; pauze; geval 29: finalString=finalString+"negenentwintig "; pauze; geval 30: finalString=finalString+"dertig"; pauze; geval 31: finalString=finalString+"eenendertig"; pauze; geval 32: finalString=finalString+"tweeëndertig"; pauze; geval 33: finalString=finalString+"drieëndertig"; pauze; geval 34: finalString=finalString+"vierendertig"; pauze; geval 35: finalString=finalString+"vijfendertig"; pauze; geval 36: finalString=finalString+"zesendertig"; pauze; geval 37: finalString=finalString+"zevenendertig"; pauze; geval 38: finalString=finalString+"achtendertig"; pauze; geval 39: finalString=finalString+"negenendertig "; pauze; geval 40: finalString=finalString+"veertig"; pauze; geval 41: finalString=finalString+"eenenveertig"; pauze; geval 42: finalString=finalString+"tweeënveertig "; pauze; geval 43: finalString=finalString+"drieënveertig"; pauze; geval 44: finalString=finalString+"vierenveertig"; pauze; geval 45: finalString=finalString+"vijfenveertig"; pauze; geval 46: finalString=finalString+"zesenveertig"; pauze; geval 47: finalString=finalString+"zevenenveertig"; pauze; geval 48: finalString=finalString+"achtenveertig"; pauze; geval 49: finalString=finalString+"negenveertig"; pauze; geval 50: finalString=finalString+"vijftig"; pauze; geval 51: finalString=finalString+"eenenvijftig"; pauze; geval 52: finalString=finalString+"tweeënvijftig "; pauze; geval 53: finalString=finalString+"drieënvijftig"; pauze; geval 54: finalString=finalString+"vierenvijftig"; pauze; geval 55: finalString=finalString+"vijfenvijftig"; pauze; geval 56: finalString=finalString+"zesenvijftig"; pauze; geval 57: finalString=finalString+"zevenvijftig"; pauze; geval 58: finalString=finalString+"achtenvijftig"; pauze; geval 59: finalString=finalString+"negenenvijftig"; pauze; }

// middag?

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

}

lege lus()

{ // haal de tijd uit de RTC byte seconde, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar; getDateDs1307(&seconde, &minuut, &uur, &dayOfWeek, &dayOfMonth, &maand, &jaar);

// zet de tijd om in een zinsreeks

createTextTime (uur, minuut);

// stuur nu de tekst naar de DMD

drawText(finalString); }

De schets heeft de gebruikelijke functies om de tijd in te stellen en op te halen van DS1307/3232 real-time klok-IC's, en zoals gebruikelijk bij al onze klokken kunt u de tijdinformatie invoeren in de variabelen in void setup(), en vervolgens het commentaar verwijderen setDateDs1307(), upload de schets, becommentarieer setDateDs1307 opnieuw en upload de schets nogmaals. Herhaal dat proces om de tijd opnieuw in te stellen als u geen op hardware gebaseerde gebruikersinterface hebt toegevoegd.

Stap 3:

Zodra de tijd is opgehaald in void loop(), wordt deze doorgegeven aan de functie createTextTime(). Deze functie maakt de tekstreeks die moet worden weergegeven door te beginnen met "It's ", en bepaalt vervolgens welke woorden moeten volgen, afhankelijk van de huidige tijd. Ten slotte converteert de functie drawText() de tekenreeks die de tekst bevat die moet worden weergegeven, naar een tekenvariabele die kan worden doorgegeven aan de DMD.

Aanbevolen: