Talaan ng mga Nilalaman:

Arduino Scrolling Text Clock: 3 Hakbang
Arduino Scrolling Text Clock: 3 Hakbang

Video: Arduino Scrolling Text Clock: 3 Hakbang

Video: Arduino Scrolling Text Clock: 3 Hakbang
Video: 7 projects Build LED LCD Alarm Clock using DS1307 with Arduino | Lesson 105 2024, Hulyo
Anonim
Arduino Scrolling Text Clock
Arduino Scrolling Text Clock

Ang layunin ng proyektong ito ay upang bumuo ng isang pag-scroll na orasan ng teksto na nagpapakita ng oras sa pagsasalita (halimbawa, "hatinggabi").

Ito ay isang mabilis na proyekto - bibigyan ka namin ng sapat upang makapunta sa hardware at sketch, at pagkatapos ay maaari mo itong gawin nang higit pa upang umangkop sa iyong mga pangangailangan.

Hakbang 1: Hardware

Hardware
Hardware

Kakailanganin mo ng tatlong pangunahing mga item -

  • isang board na Arduino Uno-compatible
  • isang real-time na circuit ng orasan o module na gumagamit ng alinman sa isang DS1307 o DS3231 IC
  • at isang monochrome P10-style LED display

Maaaring gusto mo ng isang panlabas na supply ng kuryente, ngunit maaabot namin iyon sa paglaon.

Ang unang yugto ay upang magkasya ang iyong real-time na orasan. Mag-click dito para sa tutorial kung kailangan mo ng tulong doon.

Sa ngayon inaasahan kong iniisip mo "paano mo itakda ang oras?".

Mayroong dalawang sagot sa katanungang iyon. Kung gumagamit ka ng DS3231 itakda lamang ito sa sketch (tingnan sa ibaba) dahil ang katumpakan ay napakahusay, kailangan mo lamang i-upload ang sketch sa bagong oras dalawang beses sa isang taon upang masakop ang pagtipid ng daylight.

Kung hindi man magdagdag ng isang simpleng interface ng gumagamit - magagawa ito ng isang pares ng mga pindutan. Sa wakas kailangan mo lamang ilagay ang hardware sa likod ng DMD. Mayroong maraming saklaw upang matugunan ang iyong sariling mga pangangailangan, isang simpleng solusyon ay maaaring ihanay ang control board upang madali mong ma-access ang USB socket - at pagkatapos ay idikit ito sa ilang Sugru.

Tungkol sa pag-o-powering ng orasan - maaari kang magpatakbo ng ONE LED display mula sa Arduino, at tumatakbo ito sa isang mahusay na ningning para sa panloob na paggamit. Kung nais mong tumakbo nang buo ang DMD, liwanag ng retina-burn na kailangan mong gumamit ng isang hiwalay na 5V 4A DC power supply. Kung gumagamit ka ng dalawang DMD - pupunta iyon sa 8A, at iba pa. Ikonekta lamang ang panlabas na lakas sa mga terminal ng isang DMD (ikonekta ang pangalawa o higit pang mga DMD sa mga terminal na ito).

Kung hindi mo ginugusto ang pagpuputol ng dulo ng iyong power supply cable, gumamit ng isang DC socket breakout.

Hakbang 2: Ang Arduino Sketch

Kakailanganin mong i-install ang sumusunod na dalawang Arduino library - TimerOne at DMD. Pagkatapos i-upload ang sketch:

// para sa RTC # isama ang "Wire.h" # tukuyin ang DS1307_I2C_ADDRESS 0x68 // ang DS1307 RTC ay 0x68

// para sa LED display

# isama ang "SPI.h" # isama ang "DMD.h" # isama ang "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // maaari kang magkaroon ng higit sa isang DMD sa isang row #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // ginamit upang hawakan ang panghuling pangungusap upang maipakita sa DMD

walang bisa ang ScanDMD () // kinakailangan para sa DMD

{dmd.scanDisplayBySPI (); }

walang bisa ang pag-setup ()

{// para sa DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (totoo);

// para sa RTC

Wire.begin (); // fire up I2C bus byte segundo, minuto, oras, dayOfWeek, dayOfMonth, buwan, taon; // baguhin ang mga variable at alisin ang loob sa setDateDs1307 upang maitakda ang oras // pagkatapos ay muling puna ang pagpapaandar at i-upload muli ang sketch pangalawang = 0; minuto = 13; oras = 23; dayOfWeek = 4; dayOfMonth = 19; buwan = 5; taon = 13; // setDateDs1307 (pangalawa, minuto, oras, dayOfWeek, dayOfMonth, buwan, taon); }

// karaniwang mga pagpapaandar ng RTC

// convert normal decimal number to binary coded decimal byte decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); }

// convert binary coded decimal to normal decimal number

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

void setDateDs1307 (byte pangalawa, // 0-59

byte minuto, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28 / 29 / byte month, // 1-12 byte year) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (pangalawa)); // 0 to bit 7 nagsisimula ang orasan Wire.write (decToBcd (minuto)); Wire.write (decToBcd (oras)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (buwan)); Wire.write (decToBcd (taon)); Wire.write (00010000); // nagpapadala ng 0x10 (hex) 00010000 (binary) upang makontrol ang rehistro - binubuksan ang square wave Wire.endTransmission (); }

// Nakukuha ang petsa at oras mula sa ds1307

void getDateDs1307 (byte * segundo, byte * minuto, byte * hour, byte * dayOfWeek, byte * dayOfMonth, byte * month, byte * year) {// Reset the register pointer Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Ilan sa mga ito ay nangangailangan ng mga maskara dahil ang ilang mga bit ay mga control bit

* segundo = bcdToDec (Wire.read () & 0x7f); * minuto = bcdToDec (Wire.read ()); * oras = bcdToDec (Wire.read () & 0x3f); // Need to change this if 12 hour am / pm * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * buwan = bcdToDec (Wire.read ()); * taon = bcdToDec (Wire.read ()); }

void drawText (String oldString)

{dmd.clearScreen (totoo); 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); mahabang pagsisimula = millis (); mahabang timer = simula; mahabang timer2 = simula; boolean ret = false; habang (! ret) {kung ((timer + 20) <millis ()) {ret = dmd.stepMarquee (-1, 0); timer = millis (); }}}

walang bisa ang createTextTime (int hh, int mm)

// mashes up ang lahat ng data ng oras sa teksto bilang isang pangungusap {finalString = ""; // wipe ang pangungusap para sa mga espesyal na kaso (sa ibaba) finalString = finalString + "Ito";

// ngayon idagdag ang oras

kung (hh == 1 || hh == 13) {finalString = finalString + "one"; } kung (hh == 2 || hh == 14) {finalString = finalString + "two"; } kung (hh == 3 || hh == 15) {finalString = finalString + "three"; } kung (hh == 4 || hh == 16) {finalString = finalString + "apat"; } kung (hh == 5 || hh == 17) {finalString = finalString + "five"; } kung (hh == 6 || hh == 18) {finalString = finalString + "anim"; } kung (hh == 7 || hh == 19) {finalString = finalString + "pitong"; } kung (hh == 8 || hh == 20) {finalString = finalString + "walo"; } kung (hh == 9 || hh == 21) {finalString = finalString + "siyam"; } kung (hh == 10 || hh == 22) {finalString = finalString + "ten"; } kung (hh == 11 || hh == 23) {finalString = finalString + "labing-isang"; }

// ngayon idagdag ang mga minuto

switch (mm) {case 1: finalString = finalString + "oh one"; pahinga; case 2: finalString = finalString + "oh two"; pahinga; kaso 3: finalString = finalString + "oh three"; pahinga; kaso 4: finalString = finalString + "oh apat"; pahinga; kaso 5: finalString = finalString + "oh five"; pahinga; kaso 6: finalString = finalString + "oh anim"; pahinga; kaso 7: finalString = finalString + "oh pitong"; pahinga; kaso 8: finalString = finalString + "oh walo"; pahinga; kaso 9: finalString = finalString + "oh siyam"; pahinga; case 10: finalString = finalString + "ten"; pahinga; kaso 11: finalString = finalString + "labing-isang"; pahinga; kaso 12: finalString = finalString + "dose"; pahinga; kaso 13: finalString = finalString + "trese"; pahinga; kaso 14: finalString = finalString + "labing-apat"; pahinga; kaso 15: finalString = finalString + "fifteen"; pahinga; kaso 16: finalString = finalString + "labing-anim"; pahinga; kaso 17: finalString = finalString + "labing pitong"; pahinga; kaso 18: finalString = finalString + "labing walong"; pahinga; kaso 19: finalString = finalString + "labinsiyam"; pahinga; kaso 20: finalString = finalString + "twenty"; pahinga; case 21: finalString = finalString + "twenty one"; pahinga; kaso 22: finalString = finalString + "dalawampu't dalawa"; pahinga; case 23: finalString = finalString + "twenty three"; pahinga; kaso 24: finalString = finalString + "dalawampu't apat"; pahinga; kaso 25: finalString = finalString + "twenty five"; pahinga; kaso 26: finalString = finalString + "dalawampu't anim"; pahinga; kaso 27: finalString = finalString + "dalawampu't pito"; pahinga; kaso 28: finalString = finalString + "dalawampu't walo"; pahinga; kaso 29: finalString = finalString + "dalawampu't siyam"; pahinga; kaso 30: finalString = finalString + "tatlumpung"; pahinga; kaso 31: finalString = finalString + "tatlumpu't isa"; pahinga; kaso 32: finalString = finalString + "tatlumpu't dalawa"; pahinga; kaso 33: finalString = finalString + "tatlumpu't tatlo"; pahinga; kaso 34: finalString = finalString + "tatlumpu't apat"; pahinga; kaso 35: finalString = finalString + "tatlumpu't limang"; pahinga; kaso 36: finalString = finalString + "tatlumpu't anim"; pahinga; kaso 37: finalString = finalString + "tatlumpung pito"; pahinga; kaso 38: finalString = finalString + "tatlumpu't walo"; pahinga; kaso 39: finalString = finalString + "tatlumpu't siyam"; pahinga; kaso 40: finalString = finalString + "kwarenta"; pahinga; kaso 41: finalString = finalString + "apatnapu't isa"; pahinga; kaso 42: finalString = finalString + "apatnapu't dalawa"; pahinga; kaso 43: finalString = finalString + "apatnapu't tatlo"; pahinga; kaso 44: finalString = finalString + "apatnapu't apat"; pahinga; kaso 45: finalString = finalString + "apatnapu't lima"; pahinga; kaso 46: finalString = finalString + "apatnapu't anim"; pahinga; kaso 47: finalString = finalString + "apatnapu't pito"; pahinga; kaso 48: finalString = finalString + "apatnapu't walo"; pahinga; kaso 49: finalString = finalString + "apatnapu't siyam"; pahinga; kaso 50: finalString = finalString + "limampu"; pahinga; kaso 51: finalString = finalString + "limampu't isa"; pahinga; kaso 52: finalString = finalString + "limampu't dalawa"; pahinga; kaso 53: finalString = finalString + "limampu't tatlo"; pahinga; kaso 54: finalString = finalString + "limampu't apat"; pahinga; kaso 55: finalString = finalString + "limampu't limang"; pahinga; kaso 56: finalString = finalString + "limampu't anim"; pahinga; kaso 57: finalString = finalString + "limampu't pito"; pahinga; kaso 58: finalString = finalString + "limampu't walo"; pahinga; kaso 59: finalString = finalString + "limampu't siyam"; pahinga; }

// tanghali?

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

}

walang bisa loop ()

{// kunin ang oras mula sa RTC byte segundo, minuto, oras, dayOfWeek, dayOfMonth, buwan, taon; getDateDs1307 (& pangalawa, & minuto, & oras, & dayOfWeek, & dayOfMonth, & month, & year);

// i-convert ang oras sa isang string ng pangungusap

createTextTime (oras, minuto);

// ngayon ipadala ang teksto sa DMD

drawText (finalString); }

Ang sketch ay may mga karaniwang pag-andar upang itakda at kunin ang oras mula sa DS1307 / 3232 real-time na mga IC na orasan, at tulad ng dati sa lahat ng aming mga orasan maaari mong ipasok ang impormasyon sa oras sa mga variable sa walang bisa na pag-set up (), pagkatapos ay hindi mag-set ng setDateDs1307 (), i-upload ang sketch, muling puna ng setDateDs1307, pagkatapos ay i-upload muli ang sketch. Ulitin ang prosesong iyon upang muling maitakda ang oras kung hindi ka nagdagdag ng anumang interface ng gumagamit na nakabatay sa hardware.

Hakbang 3:

Kapag nakuha ang oras sa void loop (), ipinapasa ito sa pagpapaandar na createTextTime (). Lumilikha ang pagpapaandar na ito ng string ng teksto upang ipakita sa pamamagitan ng pagsisimula sa "Ito", at pagkatapos ay tumutukoy kung aling mga salita ang susundan depende sa kasalukuyang oras. Sa wakas ang function drawText () ay nagko-convert ng string na humahawak sa teksto upang ipakita sa isang variable ng character na maaaring maipasa sa DMD.

Inirerekumendang: