Obsah:

Hodiny posúvania textu Arduino: 3 kroky
Hodiny posúvania textu Arduino: 3 kroky

Video: Hodiny posúvania textu Arduino: 3 kroky

Video: Hodiny posúvania textu Arduino: 3 kroky
Video: Android 12 - Features 2024, November
Anonim
Rolovacie textové hodiny Arduino
Rolovacie textové hodiny Arduino

Účelom tohto projektu je vytvoriť hodiny s posuvným textom, ktoré zobrazujú čas, ktorý sa hovorí (napríklad „je polnoc“).

Jedná sa o rýchly projekt - dáme vám dosť na to, aby ste sa mohli pustiť do hardvéru a náčrtu, a potom ho môžete posunúť ďalej, aby vyhovoval vašim potrebám.

Krok 1: Hardvér

Hardvér
Hardvér

Budete potrebovať tri hlavné položky -

  • doska kompatibilná s Arduino Uno
  • hodinový obvod alebo modul v reálnom čase pomocou integrovaného obvodu DS1307 alebo DS3231
  • a monochromatický LED displej v štýle P10

Možno budete chcieť externý napájací zdroj, ale k tomu sa dostaneme neskôr.

Prvou fázou je prispôsobiť hodiny reálneho času. Kliknite sem a získajte návod, ak s tým potrebujete pomôcť.

Teraz už dúfam, že premýšľate „ako si nastavíte čas?“.

Na túto otázku existujú dve odpovede. Ak používate DS3231, jednoducho ho vložte do náčrtu (pozri nižšie), pretože presnosť je veľmi dobrá, stačí, aby ste skicu nahrali s novým časom dvakrát ročne, aby ste pokryli letný čas.

V opačnom prípade pridajte jednoduché používateľské rozhranie-niekoľko tlačidiel to zvládne. Nakoniec stačí hardvér nasadiť na zadnú stranu DMD. Existuje dostatok priestoru na splnenie vašich vlastných potrieb, jednoduchým riešením by mohlo byť zarovnanie ovládacej dosky, aby ste mali ľahký prístup k zásuvke USB - a potom ju prilepte nejakým Sugru.

Pokiaľ ide o napájanie hodín - z Arduina môžete spustiť JEDEN LED displej a na vnútorné použitie beží v dobrom svetle. Ak chcete, aby DMD bežal na plný jas sietnice, musíte použiť samostatný napájací zdroj 5 V 4 A DC. Ak používate dve DMD - ide to na 8A a podobne. Jednoducho pripojte externé napájanie k jedným svorkám DMD (k týmto svorkám pripojte druhý alebo viac DMD).

Ak sa vám nechce prestrihnúť koniec napájacieho kábla, použite prerušovač zásuvky DC.

Krok 2: Skica Arduino

Budete musieť nainštalovať nasledujúce dve knižnice Arduino - TimerOne a DMD. Potom nahrajte náčrt:

// pre RTC #zahrňte „Wire.h“#define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC je 0x68

// pre LED displej

#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 riadok #definovať DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

Reťazec finalString; // slúži na podržanie poslednej vety na zobrazenie v DMD

neplatné ScanDMD () // požadované pre DMD

{dmd.scanDisplayBySPI (); }

neplatné nastavenie ()

{// pre DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (true);

// pre RTC

Wire.begin (); // spustenie bajtu zbernice I2C sekundu, minútu, hodinu, dayOfWeek, dayOfMonth, mesiac, rok; // zmeňte premenné a odkomentujte súbor setDateDs1307, aby ste nastavili čas // potom znova komentujte funkciu a nahrajte skicu znova ako druhú = 0; minúta = 13; hodina = 23; dayOfWeek = 4; dayOfMonth = 19; mesiac = 5; rok = 13; // setDateDs1307 (sekunda, minúta, hodina, dayOfWeek, dayOfMonth, mesiac, rok); }

// obvyklé funkcie RTC

// Konvertovanie normálnych desatinných čísel na binárne kódované desatinné bajty decToBcd (byte val) {return ((val/10*16) + (val%10)); }

// Previesť binárne kódované desatinné čísla na normálne desatinné čísla

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

void setDateDs1307 (bajt sekunda, // 0-59

minúta bajtu, // 0-59 bajtov hodina, // 1-23 bajtov dayOfWeek, // 1-7 bajtov dayOfMonth, // 1-28/29/byte mesiac, // 1-12 bajtov rok) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (druhý)); // 0 až bit 7 spustí hodiny Wire.write (decToBcd (minúta)); Wire.write (decToBcd (hodina)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mesiac)); Wire.write (decToBcd (rok)); Wire.write (00010000); // pošle 0x10 (hex) 00010000 (binárne) do riadiaceho registra - zapne štvorcovú vlnu Wire.endTransmission (); }

// Zistí dátum a čas z ds1307

neplatné getDateDs1307 (bajt *sekunda, bajt *minúta, bajt *hodina, bajt *dayOfWeek, bajt *dayOfMonth, bajt *mesiac, bajt *rok) {// Reset ukazovateľa registra Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Niektoré z nich vyžadujú masky, pretože určité bity sú kontrolné bity

*sekunda = bcdToDec (Wire.read () & 0x7f); *minúta = bcdToDec (Wire.read ()); *hodina = bcdToDec (Wire.read () & 0x3f); // Toto je potrebné zmeniť, ak 12 hodín ráno/hod. *DayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *mesiac = bcdToDec (Wire.read ()); *rok = bcdToDec (Wire.read ()); }

void drawText (String oldString)

{dmd.clearScreen (true); 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); dlhý štart = milis (); dlhý časovač = štart; dlhý časovač2 = štart; booleovský ret = nepravda; while (! ret) {if ((timer+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); časovač = milis (); }}}

void createTextTime (int hh, int mm)

// toto spracuje všetky časové údaje do textu ako jedna veta {finalString = ""; // vymazanie vety pre špeciálne prípady (nižšie) finalString = finalString+"It";

// teraz pridajte hodinu

if (hh == 1 || hh == 13) {finalString = finalString+"one"; } if (hh == 2 || hh == 14) {finalString = finalString+"two"; } if (hh == 3 || hh == 15) {finalString = finalString+"three"; } if (hh == 4 || hh == 16) {finalString = finalString+"four"; } if (hh == 5 || hh == 17) {finalString = finalString+"Five"; } if (hh == 6 || hh == 18) {finalString = finalString+"six"; } if (hh == 7 || hh == 19) {finalString = finalString+"seven"; } if (hh == 8 || hh == 20) {finalString = finalString+"osem"; } if (hh == 9 || hh == 21) {finalString = finalString+"deväť"; } if (hh == 10 || hh == 22) {finalString = finalString+"ten"; } if (hh == 11 || hh == 23) {finalString = finalString+"jedenásť"; }

// teraz pridajte minúty

prepínač (mm) {prípad 1: finalString = finalString+"oh one"; prestávka; prípad 2: finalString = finalString+"oh dva"; prestávka; prípad 3: finalString = finalString+"oh tri"; prestávka; prípad 4: finalString = finalString+"oh four"; prestávka; prípad 5: finalString = finalString+"oh päť"; prestávka; prípad 6: finalString = finalString+"oh šesť"; prestávka; prípad 7: finalString = finalString+"oh sedem"; prestávka; prípad 8: finalString = finalString+"oh osem"; prestávka; prípad 9: finalString = finalString+"oh deväť"; prestávka; prípad 10: finalString = finalString+"desať"; prestávka; prípad 11: finalString = finalString+"jedenásť"; prestávka; prípad 12: finalString = finalString+"dvanásť"; prestávka; prípad 13: finalString = finalString+"trinásť"; prestávka; prípad 14: finalString = finalString+"štrnásť"; prestávka; prípad 15: finalString = finalString+"pätnásť"; prestávka; prípad 16: finalString = finalString+"šestnásť"; prestávka; prípad 17: finalString = finalString+"sedemnásť"; prestávka; prípad 18: finalString = finalString+"osemnásť"; prestávka; prípad 19: finalString = finalString+"devätnásť"; prestávka; prípad 20: finalString = finalString+"dvadsať"; prestávka; prípad 21: finalString = finalString+"dvadsaťjeden"; prestávka; prípad 22: finalString = finalString+"dvadsaťdva"; prestávka; prípad 23: finalString = finalString+"dvadsať tri"; prestávka; prípad 24: finalString = finalString+"dvadsaťštyri"; prestávka; prípad 25: finalString = finalString+"dvadsaťpäť"; prestávka; prípad 26: finalString = finalString+"dvadsať šesť"; prestávka; prípad 27: finalString = finalString+"dvadsať sedem"; prestávka; prípad 28: finalString = finalString+"dvadsať osem"; prestávka; prípad 29: finalString = finalString+"dvadsať deväť"; prestávka; prípad 30: finalString = finalString+"tridsať"; prestávka; prípad 31: finalString = finalString+"tridsať jedna"; prestávka; prípad 32: finalString = finalString+"tridsať dva"; prestávka; prípad 33: finalString = finalString+"tridsať tri"; prestávka; prípad 34: finalString = finalString+"tridsaťštyri"; prestávka; prípad 35: finalString = finalString+"tridsať päť"; prestávka; prípad 36: finalString = finalString+"tridsať šesť"; prestávka; prípad 37: finalString = finalString+"tridsať sedem"; prestávka; prípad 38: finalString = finalString+"tridsať osem"; prestávka; prípad 39: finalString = finalString+"tridsať deväť"; prestávka; prípad 40: finalString = finalString+"štyridsať"; prestávka; prípad 41: finalString = finalString+"štyridsať jedna"; prestávka; prípad 42: finalString = finalString+"štyridsať dva"; prestávka; prípad 43: finalString = finalString+"štyridsať tri"; prestávka; prípad 44: finalString = finalString+"štyridsať štyri"; prestávka; prípad 45: finalString = finalString+"štyridsať päť"; prestávka; prípad 46: finalString = finalString+"štyridsať šesť"; prestávka; prípad 47: finalString = finalString+"štyridsať sedem"; prestávka; prípad 48: finalString = finalString+"štyridsať osem"; prestávka; prípad 49: finalString = finalString+"štyridsať deväť"; prestávka; prípad 50: finalString = finalString+"päťdesiat"; prestávka; prípad 51: finalString = finalString+"päťdesiat jedna"; prestávka; prípad 52: finalString = finalString+"päťdesiat dva"; prestávka; prípad 53: finalString = finalString+"päťdesiat tri"; prestávka; prípad 54: finalString = finalString+"päťdesiat štyri"; prestávka; prípad 55: finalString = finalString+"päťdesiat päť"; prestávka; prípad 56: finalString = finalString+"päťdesiatšesť"; prestávka; prípad 57: finalString = finalString+"päťdesiat sedem"; prestávka; prípad 58: finalString = finalString+"päťdesiat osem"; prestávka; prípad 59: finalString = finalString+"päťdesiat deväť"; prestávka; }

// poludnie?

if (hh == 12 && mm == 0) {finalString = finalString+"midday"; } // polnoc? if (hh == 00 && mm == 0) {finalString = finalString+"midnight"; }

}

prázdna slučka ()

{// získajte čas z bajtu RTC sekundu, minútu, hodinu, dayOfWeek, dayOfMonth, mesiac, rok; getDateDs1307 (& sekunda, & minúta, & hodina, & deňOdTýždňa, & deňOdMesiaca, & mesiac, & rok);

// previesť čas na vetný reťazec

createTextTime (hodina, minúta);

// teraz pošlite text do DMD

drawText (finalString); }

Skica má obvyklé funkcie na nastavenie a načítanie času z integrovaných obvodov hodín reálneho času DS1307/3232 a ako obvykle u všetkých našich hodín môžete zadať informácie o čase do premenných v neplatnom nastavení (), potom odkomentujte súbor setDateDs1307 (), nahrajte skicu, znova okomentujte súbor setDateDs1307 a potom skicu nahrajte ešte raz. Ak ste nepridali žiadne hardvérové používateľské rozhranie, zopakujte tento postup a znova nastavte čas.

Krok 3:

Akonáhle je čas získaný vo void loop (), je odovzdaný do funkcie createTextTime (). Táto funkcia vytvorí textový reťazec, ktorý sa má zobraziť, začínajúc na „Je“a potom v závislosti od aktuálneho času určí, ktoré slová je potrebné nasledovať. Nakoniec funkcia drawText () skonvertuje reťazec obsahujúci text na zobrazenie na znakovú premennú, ktorú je možné odoslať do DMD.

Odporúča: