INHOUDSOPGAWE:

Arduino -rolteksklok: 3 stappe
Arduino -rolteksklok: 3 stappe

Video: Arduino -rolteksklok: 3 stappe

Video: Arduino -rolteksklok: 3 stappe
Video: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Julie
Anonim
Arduino rolteksklok
Arduino rolteksklok

Die doel van hierdie projek is om 'n blaai -tekshorlosie te bou wat die tyd wys soos dit uitgespreek word (byvoorbeeld, "dit is middernag").

Dit is 'n vinnige projek - ons gee u genoeg om aan die gang te kom met die hardeware en skets, en dan kan u dit verder neem om aan u behoeftes te voldoen.

Stap 1: Hardeware

Hardeware
Hardeware

U benodig drie belangrike items -

  • 'n Arduino Uno-compatible bord
  • 'n intydse klokstroombaan of module met behulp van 'n DS1307 of DS3231 IC
  • en 'n monochrome P10-styl LED-skerm

U wil moontlik 'n eksterne kragtoevoer hê, maar ons sal later daarby uitkom.

Die eerste fase is om by u intydse horlosie te pas. Klik hier vir die tutoriaal as u hulp nodig het.

Ek hoop nou dat u dink "hoe stel u die tyd in?".

Daar is twee antwoorde op die vraag. As u die DS3231 gebruik, stel dit net in die skets (sien hieronder), aangesien die akkuraatheid baie goed is, hoef u die skets slegs twee keer per jaar met die nuwe tyd op te laai om dagligbesparings te dek.

Voeg andersins 'n eenvoudige gebruikerskoppelvlak by-'n paar knoppies kan dit doen. Uiteindelik hoef u net die hardeware agter op die DMD te plaas. Daar is genoeg ruimte om aan u eie behoeftes te voldoen; 'n eenvoudige oplossing kan wees om die bedieningsbord in lyn te bring sodat u maklik toegang tot die USB -aansluiting kan kry - en dit dan met 'n bietjie Sugru kan vassteek.

Met betrekking tot die aanstuur van die horlosie - u kan EEN LED -skerm van die Arduino gebruik, en dit werk met 'n goeie helderheid vir binnenshuise gebruik. As u wil hê dat die DMD ten volle moet werk, met netvliesbrand, moet u 'n aparte 5V 4A DC-kragtoevoer gebruik. As u twee DMD's gebruik - dit gaan na 8A, ensovoorts. Koppel eenvoudig die eksterne krag aan een DMD se terminale (koppel die tweede of meer DMD's aan hierdie terminale).

As u nie die einde van u kragtoevoerkabel wil kap nie, gebruik 'n DC -aansluiting.

Stap 2: Die Arduino -skets

U moet die volgende twee Arduino -biblioteke installeer - TimerOne en DMD. Laai dan die skets op:

// vir RTC #sluit "Wire.h" in #definieer DS1307_I2C_ADDRESS 0x68 // die DS1307 RTC is 0x68

// vir LED -skerm

#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 ry #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // word gebruik om die laaste sin te bevat om op DMD te vertoon

leegte ScanDMD () // benodig vir DMD

{dmd.scanDisplayBySPI (); }

leemte opstelling ()

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

// vir RTC

Wire.begin (); // maak I2C -busbyte tweede, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar; // verander die veranderlikes en maak 'n opmerking van die setDateDs1307 om die tyd in te stel // lewer dan weer 'n opmerking oor die funksie en laai die skets weer tweede op = 0; minuut = 13; uur = 23; dayOfWeek = 4; dayOfMonth = 19; maand = 5; jaar = 13; // setDateDs1307 (tweede, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar); }

// gewone RTC -funksies

// Skakel normale desimale getalle om in binêre gekodeerde desimale greep decToBcd (byte val) {return ((val/10*16) + (val%10)); }

// Skakel binêre gekodeerde desimale na normale desimale getalle om

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

void setDateDs1307 (byte sekonde, // 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); Wire.write (0); Wire.write (decToBcd (tweede)); // 0 tot bietjie 7 begin die klok Wire.write (decToBcd (minuut)); Wire.write (decToBcd (uur)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (maand)); Wire.write (decToBcd (jaar)); Wire.write (00010000); // stuur 0x10 (heks) 00010000 (binêre) na die registerregister - skakel vierkantsgolf Wire.endTransmission () aan; }

// Kry die datum en tyd van die ds1307

void getDateDs1307 (byte *tweede, byte *minuut, byte *uur, byte *dayOfWeek, byte *dayOfMonth, byte *maand, byte *jaar) {// Herstel die registerwyser Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// 'n Paar hiervan benodig maskers omdat sekere bisse kontrolebits is

*tweede = bcdToDec (Wire.read () & 0x7f); *minuut = bcdToDec (Wire.read ()); *uur = bcdToDec (Wire.read () & 0x3f); // Moet dit verander as 12 uur/uur *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *maand = bcdToDec (Wire.read ()); *jaar = bcdToDec (Wire.read ()); }

void drawText (string ou string)

{dmd.clearScreen (waar); 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); lang begin = millis (); lang timer = begin; lang timer2 = begin; boolean ret = false; terwyl (! ret) {if ((timer+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); timer = millis (); }}}

void createTextTime (int hh, int mm)

// dit meng die heeltyd gegewens in teks as 'n sin {finalString = ""; // vee die sin uit vir spesiale gevalle (hieronder) finalString = finalString+"It's";

// voeg nou die uur by

as (hh == 1 || hh == 13) {finalString = finalString+"een"; } as (hh == 2 || hh == 14) {finalString = finalString+"twee"; } as (hh == 3 || hh == 15) {finalString = finalString+"drie"; } as (hh == 4 || hh == 16) {finalString = finalString+"vier"; } as (hh == 5 || hh == 17) {finalString = finalString+"vyf"; } as (hh == 6 || hh == 18) {finalString = finalString+"ses"; } as (hh == 7 || hh == 19) {finalString = finalString+"sewe"; } as (hh == 8 || hh == 20) {finalString = finalString+"agt"; } as (hh == 9 || hh == 21) {finalString = finalString+"nege"; } as (hh == 10 || hh == 22) {finalString = finalString+"tien"; } as (hh == 11 || hh == 23) {finalString = finalString+"elf"; }

// voeg nou die notule by

skakelaar (mm) {geval 1: finalString = finalString+"oh one"; breek; geval 2: finalString = finalString+"oh two"; breek; geval 3: finalString = finalString+"oh drie"; breek; geval 4: finalString = finalString+"oh vier"; breek; saak 5: finalString = finalString+"oh five"; breek; saak 6: finalString = finalString+"oh six"; breek; saak 7: finalString = finalString+"oh seven"; breek; saak 8: finalString = finalString+"oh eight"; breek; saak 9: finalString = finalString+"o nege"; breek; saak 10: finalString = finalString+"tien"; breek; saak 11: finalString = finalString+"elf"; breek; saak 12: finalString = finalString+"twaalf"; breek; saak 13: finalString = finalString+"dertien"; breek; saak 14: finalString = finalString+"veertien"; breek; saak 15: finalString = finalString+"vyftien"; breek; saak 16: finalString = finalString+"sestien"; breek; saak 17: finalString = finalString+"seventeen"; breek; saak 18: finalString = finalString+"agttien"; breek; saak 19: finalString = finalString+"negentien"; breek; saak 20: finalString = finalString+"twintig"; breek; saak 21: finalString = finalString+"een en twintig"; breek; saak 22: finalString = finalString+"twee en twintig"; breek; saak 23: finalString = finalString+"drie en twintig"; breek; saak 24: finalString = finalString+"vier en twintig"; breek; saak 25: finalString = finalString+"vyf en twintig"; breek; saak 26: finalString = finalString+"ses en twintig"; breek; saak 27: finalString = finalString+"sewe en twintig"; breek; saak 28: finalString = finalString+"agt en twintig"; breek; saak 29: finalString = finalString+"nege en twintig"; breek; saak 30: finalString = finalString+"dertig"; breek; saak 31: finalString = finalString+"een en dertig"; breek; saak 32: finalString = finalString+"twee en dertig"; breek; saak 33: finalString = finalString+"drie en dertig"; breek; saak 34: finalString = finalString+"vier en dertig"; breek; saak 35: finalString = finalString+"vyf en dertig"; breek; saak 36: finalString = finalString+"ses en dertig"; breek; saak 37: finalString = finalString+"sewe en dertig"; breek; saak 38: finalString = finalString+"agt en dertig"; breek; saak 39: finalString = finalString+"nege en dertig"; breek; saak 40: finalString = finalString+"veertig"; breek; saak 41: finalString = finalString+"een en veertig"; breek; saak 42: finalString = finalString+"twee en veertig"; breek; saak 43: finalString = finalString+"drie en veertig"; breek; saak 44: finalString = finalString+"vier en veertig"; breek; saak 45: finalString = finalString+"vyf en veertig"; breek; saak 46: finalString = finalString+"ses en veertig"; breek; saak 47: finalString = finalString+"sewe en veertig"; breek; saak 48: finalString = finalString+"agt en veertig"; breek; saak 49: finalString = finalString+"nege en veertig"; breek; saak 50: finalString = finalString+"vyftig"; breek; saak 51: finalString = finalString+"een en vyftig"; breek; saak 52: finalString = finalString+"twee en vyftig"; breek; saak 53: finalString = finalString+"drie en vyftig"; breek; saak 54: finalString = finalString+"vier en vyftig"; breek; saak 55: finalString = finalString+"vyf en vyftig"; breek; saak 56: finalString = finalString+"ses en vyftig"; breek; saak 57: finalString = finalString+"sewe en vyftig"; breek; saak 58: finalString = finalString+"agt en vyftig"; breek; saak 59: finalString = finalString+"nege en vyftig"; breek; }

// middag?

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

}

leemte lus ()

{// kry die tyd van die RTC -byte sekonde, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar; getDateDs1307 (& tweede, & minuut, & uur, & dayOfWeek, & dayOfMonth, & maand, & jaar);

// verander die tyd in 'n sinreeks

createTextTime (uur, minuut);

// stuur nou die teks na die DMD

drawText (finalString); }

Die skets het die gewone funksies om die tyd in te stel en op te haal van DS1307/3232 intydse klok-IC's, en soos gewoonlik met al ons horlosies, kan u die tydsinligting in die veranderlikes in die leemte-opstelling () invoer, en dan die opmerking van setDateDs1307 (), laai die skets op, lewer 'n opmerking van setDateDs1307, en laai die skets weer op. Herhaal die proses om die tyd weer in te stel as u geen hardeware-gebaseerde gebruikerskoppelvlak bygevoeg het nie.

Stap 3:

Sodra die tyd in die nietige lus () opgespoor is, word dit oorgedra na die funksie createTextTime (). Hierdie funksie skep die teksstring om te vertoon deur te begin met "Dit is" en bepaal dan watter woorde gevolg moet word, afhangende van die huidige tyd. Uiteindelik skakel die funksie drawText () die string wat die teks bevat om in 'n karakterveranderlike wat na die DMD oorgedra kan word.

Aanbeveel: