Turinys:

„Arduino“slinkties teksto laikrodis: 3 žingsniai
„Arduino“slinkties teksto laikrodis: 3 žingsniai

Video: „Arduino“slinkties teksto laikrodis: 3 žingsniai

Video: „Arduino“slinkties teksto laikrodis: 3 žingsniai
Video: ✅Arduino SIM800 тест схемы подключения 2024, Lapkritis
Anonim
„Arduino“slinkties teksto laikrodis
„Arduino“slinkties teksto laikrodis

Šio projekto tikslas yra sukurti slankiojantį teksto laikrodį, kuris rodytų laiką, kai jis sakomas (pavyzdžiui, „yra vidurnaktis“).

Tai greitas projektas - mes jums duosime pakankamai, kad galėtumėte pradėti dirbti su technine įranga ir eskizu, o tada galėsite jį tęsti, kad atitiktų jūsų poreikius.

1 žingsnis: Aparatūra

Techninė įranga
Techninė įranga

Jums reikės trijų pagrindinių elementų -

  • su „Arduino Uno“suderinama plokštė
  • realaus laiko laikrodžio grandinė arba modulis, naudojant DS1307 arba DS3231 IC
  • ir vienspalvis P10 stiliaus LED ekranas

Galbūt norėsite išorinio maitinimo šaltinio, bet mes pasieksime tai vėliau.

Pirmasis etapas yra pritaikyti jūsų realaus laiko laikrodį. Spustelėkite čia, kad gautumėte pamoką, jei jums reikia pagalbos.

Tikiuosi, kad dabar galvojate „kaip nustatyti laiką?“.

Yra du atsakymai į šį klausimą. Jei naudojate DS3231, tiesiog nustatykite jį eskize (žr. Toliau), nes tikslumas yra labai geras, jums reikia tik įkelti eskizą nauju laiku tik du kartus per metus, kad būtų sumažintas vasaros laikas.

Priešingu atveju pridėkite paprastą vartotojo sąsają-tai gali padaryti keli mygtukai. Galiausiai jums tereikia įdėti aparatūrą į DMD galinę dalį. Yra daug galimybių patenkinti jūsų poreikius, paprastas sprendimas gali būti suderinti valdymo plokštę, kad galėtumėte lengvai pasiekti USB lizdą - ir tada priklijuokite jį prie kai kurių „Sugru“.

Kalbant apie laikrodžio maitinimą - galite paleisti VIENĄ LED ekraną iš „Arduino“ir jis veikia pakankamai ryškiai, kad būtų galima naudoti patalpose. Jei norite, kad DMD veiktų visu ryškumu, degindamas tinklainę, turite naudoti atskirą 5V 4A DC maitinimo šaltinį. Jei naudojate du DMD - tai yra 8A ir pan. Tiesiog prijunkite išorinį maitinimą prie vieno DMD terminalo (prie šių gnybtų prijunkite antrą ar daugiau DMD).

Jei nenorite nukirpti maitinimo kabelio galo, naudokite nuolatinės srovės lizdo pertrauką.

2 žingsnis: „Arduino“eskizas

Jums reikės įdiegti šias dvi „Arduino“bibliotekas - „TimerOne“ir DMD. Tada įkelkite eskizą:

// RTC #įtraukite „Wire.h“#define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC yra 0x68

// skirtas LED ekranui

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // galite turėti daugiau nei vieną DMD eilutė #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

Styga finalString; // naudojamas paskutiniam sakiniui laikyti, kad būtų rodomas DMD

void ScanDMD () // reikalingas DMD

{dmd.scanDisplayBySPI (); }

negaliojanti sąranka ()

{// DMD Timer1.initialize (5000); Laikmatis1.attachInterrupt (ScanDMD); dmd.clearScreen (tiesa);

// RTC

Wire.begin (); // suaktyvinti I2C magistralės baitą antra, minutė, valanda, diena, savaitė, diena, mėnuo, mėnuo, metai; // pakeiskite kintamuosius ir atmeskite setDateDs1307, kad nustatytumėte laiką // tada iš naujo pakomentuokite funkciją ir vėl įkelkite eskizą second = 0; minutė = 13; valanda = 23; dayOfWeek = 4; dayOfMonth = 19; mėnuo = 5; metai = 13; // setDateDs1307 (antra, minutė, valanda, diena, savaitė, diena, mėnuo, mėnuo, metai); }

// įprastos RTC funkcijos

// Įprastus dešimtainius skaičius paversti dvejetainiu koduotu dešimtainiu baitu decToBcd (baitų val) {return ((val/10*16) + (val%10)); }

// Konvertuoti dvejetainį koduotą dešimtainį skaičių į normalius dešimtainius skaičius

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

void setDateDs1307 (baitas antras, // 0-59

baitų minutė, // 0–59 baitų valanda, // 1-23 baitų diena „Savaitė“, // 1–7 baitų diena „Mėnuo“, // 1-28/29/baitų mėnuo, // 1–12 baitų metai) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (antras)); // nuo 0 iki bitų 7 pradeda laikrodį Wire.write (decToBcd (minutė)); Wire.write (decToBcd (valanda)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mėnuo)); Wire.write (decToBcd (metai)); Wire.write (00010000); // siunčia 0x10 (šešioliktainį) 00010000 (dvejetainį) į registrą - įjungia kvadratinę bangą Wire.endTransmission (); }

// Gauna datą ir laiką iš ds1307

void getDateDs1307 (baitas *sekundė, baitas *minutė, baitas *valanda, baitas *dayOfWeek, baitas *dayOfMonth, baitas *mėnuo, baitas *metai) {// Iš naujo nustatyti registro rodyklę Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Kai kuriems iš jų reikia kaukių, nes tam tikri bitai yra valdymo bitai

*antras = bcdToDec (Wire.read () & 0x7f); *minutė = bcdToDec (Wire.read ()); *valanda = bcdToDec (Wire.read () & 0x3f); // Reikia tai pakeisti, jei 12 val. Am/pm *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *mėnuo = bcdToDec (Wire.read ()); *metai = bcdToDec (Wire.read ()); }

void drawText (eilutė sena eilutė)

{dmd.clearScreen (tiesa); 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); ilga pradžia = milis (); ilgas laikmatis = pradžia; ilgas laikmatis2 = pradžia; loginis retas = klaidingas; while (! ret) {if ((laikmatis+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); laikmatis = milis (); }}}

void createTextTime (int hh, int mm)

// tai visą laiką sutelkia duomenis į tekstą kaip vieną sakinį {finalString = ""; // ištrinkite sakinį ypatingais atvejais (žemiau) finalString = finalString+"It's";

// dabar pridėkite valandą

if (hh == 1 || hh == 13) {finalString = finalString+"vienas"; } if (hh == 2 || hh == 14) {finalString = finalString+"du"; } if (hh == 3 || hh == 15) {finalString = finalString+"trys"; } if (hh == 4 || hh == 16) {finalString = finalString+"keturi"; } if (hh == 5 || hh == 17) {finalString = finalString+"penki"; } if (hh == 6 || hh == 18) {finalString = finalString+"six"; } if (hh == 7 || hh == 19) {finalString = finalString+"septyni"; } if (hh == 8 || hh == 20) {finalString = finalString+"aštuoni"; } if (hh == 9 || hh == 21) {finalString = finalString+"devyni"; } if (hh == 10 || hh == 22) {finalString = finalString+"dešimt"; } if (hh == 11 || hh == 23) {finalString = finalString+"vienuolika"; }

// dabar pridėkite minutes

jungiklis (mm) {1 atvejis: finalString = finalString+"oh one"; pertrauka; 2 atvejis: finalString = finalString+"oi du"; pertrauka; 3 atvejis: finalString = finalString+"oi trys"; pertrauka; 4 atvejis: finalString = finalString+"oi keturi"; pertrauka; 5 atvejis: finalString = finalString+"oh five"; pertrauka; 6 atvejis: finalString = finalString+"oh six"; pertrauka; 7 atvejis: finalString = finalString+"oh seven"; pertrauka; 8 atvejis: finalString = finalString+"o aštuoni"; pertrauka; 9 atvejis: finalString = finalString+"oi devyni"; pertrauka; 10 atvejis: finalString = finalString+"dešimt"; pertrauka; 11 atvejis: finalString = finalString+"vienuolika"; pertrauka; 12 atvejis: finalString = finalString+"dvylika"; pertrauka; 13 atvejis: finalString = finalString+"trylika"; pertrauka; 14 atvejis: finalString = finalString+"keturiolika"; pertrauka; 15 atvejis: finalString = finalString+"penkiolika"; pertrauka; 16 atvejis: finalString = finalString+"šešiolika"; pertrauka; 17 atvejis: finalString = finalString+"septyniolika"; pertrauka; 18 atvejis: finalString = finalString+"aštuoniolika"; pertrauka; 19 atvejis: finalString = finalString+"devyniolika"; pertrauka; 20 atvejis: finalString = finalString+"dvidešimt"; pertrauka; 21 atvejis: finalString = finalString+"dvidešimt vienas"; pertrauka; 22 atvejis: finalString = finalString+"dvidešimt du"; pertrauka; 23 atvejis: finalString = finalString+"dvidešimt trys"; pertrauka; 24 atvejis: finalString = finalString+"dvidešimt keturi"; pertrauka; 25 atvejis: finalString = finalString+"dvidešimt penki"; pertrauka; 26 atvejis: finalString = finalString+"dvidešimt šeši"; pertrauka; 27 atvejis: finalString = finalString+"dvidešimt septyni"; pertrauka; 28 atvejis: finalString = finalString+"dvidešimt aštuoni"; pertrauka; 29 atvejis: finalString = finalString+"dvidešimt devyni"; pertrauka; 30 atvejis: finalString = finalString+"trisdešimt"; pertrauka; 31 atvejis: finalString = finalString+"trisdešimt vienas"; pertrauka; 32 atvejis: finalString = finalString+"trisdešimt du"; pertrauka; 33 atvejis: finalString = finalString+"trisdešimt trys"; pertrauka; 34 atvejis: finalString = finalString+"trisdešimt keturi"; pertrauka; 35 atvejis: finalString = finalString+"trisdešimt penki"; pertrauka; 36 atvejis: finalString = finalString+"trisdešimt šeši"; pertrauka; 37 atvejis: finalString = finalString+"trisdešimt septyni"; pertrauka; 38 atvejis: finalString = finalString+"trisdešimt aštuoni"; pertrauka; 39 atvejis: finalString = finalString+"trisdešimt devyni"; pertrauka; 40 atvejis: finalString = finalString+"keturiasdešimt"; pertrauka; 41 atvejis: finalString = finalString+"keturiasdešimt vienas"; pertrauka; 42 atvejis: finalString = finalString+"keturiasdešimt du"; pertrauka; 43 atvejis: finalString = finalString+"keturiasdešimt trys"; pertrauka; 44 atvejis: finalString = finalString+"keturiasdešimt keturi"; pertrauka; 45 atvejis: finalString = finalString+"keturiasdešimt penki"; pertrauka; 46 atvejis: finalString = finalString+"keturiasdešimt šeši"; pertrauka; 47 atvejis: finalString = finalString+"keturiasdešimt septyni"; pertrauka; 48 atvejis: finalString = finalString+"keturiasdešimt aštuoni"; pertrauka; 49 atvejis: finalString = finalString+"keturiasdešimt devyni"; pertrauka; 50 atvejis: finalString = finalString+"penkiasdešimt"; pertrauka; 51 atvejis: finalString = finalString+"penkiasdešimt vienas"; pertrauka; 52 atvejis: finalString = finalString+"penkiasdešimt du"; pertrauka; 53 atvejis: finalString = finalString+"penkiasdešimt trys"; pertrauka; 54 atvejis: finalString = finalString+"penkiasdešimt keturi"; pertrauka; 55 atvejis: finalString = finalString+"penkiasdešimt penki"; pertrauka; 56 atvejis: finalString = finalString+"penkiasdešimt šeši"; pertrauka; 57 atvejis: finalString = finalString+"penkiasdešimt septyni"; pertrauka; 58 atvejis: finalString = finalString+"penkiasdešimt aštuoni"; pertrauka; 59 atvejis: finalString = finalString+"penkiasdešimt devyni"; pertrauka; }

// vidurdienis?

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

}

tuštumos kilpa ()

{// gauti laiką iš RTC baitų antra, minutė, valanda, dayOfWeek, dayOfMonth, mėnuo, metai; getDateDs1307 (& sekundė, & minutė, valanda, & savaitės savaitė, & diena mėnesiui, mėnuo ir metai);

// laiką paversti sakinio seka

createTextTime (valanda, minutė);

// dabar siųskite tekstą į DMD

drawText (finalString); }

Eskizas turi įprastas funkcijas, skirtas nustatyti ir gauti laiką iš DS1307/3232 realaus laiko laikrodžio IC, ir, kaip įprasta, naudojant visus mūsų laikrodžius, galite įvesti laiko informaciją į kintamuosius tuščioje sąrankoje (), tada atšaukti komentarą setDateDs1307 (), įkelkite eskizą, iš naujo pakomentuokite setDateDs1307, tada dar kartą įkelkite eskizą. Pakartokite šį procesą, kad iš naujo nustatytumėte laiką, jei nepridėjote jokios aparatinės įrangos vartotojo sąsajos.

3 žingsnis:

Kai laikas gaunamas iš „void loop“(), jis perduodamas funkcijai createTextTime (). Ši funkcija sukuria rodomą teksto eilutę, pradedant „Tai“, ir tada nustato, kuriuos žodžius sekti, atsižvelgiant į dabartinį laiką. Galiausiai funkcija drawText () paverčia tekstą rodančią eilutę į simbolių kintamąjį, kurį galima perduoti DMD.

Rekomenduojamas: