Obsah:

Arduino Rolovací textové hodiny: 3 kroky
Arduino Rolovací textové hodiny: 3 kroky

Video: Arduino Rolovací textové hodiny: 3 kroky

Video: Arduino Rolovací textové hodiny: 3 kroky
Video: CS50 2015 - Week 7 2024, Červenec
Anonim
Rolovací textové hodiny Arduino
Rolovací textové hodiny Arduino

Účelem tohoto projektu je vytvořit hodiny s posuvným textem, které zobrazují čas, který je vysloven (například „je půlnoc“).

Jedná se o rychlý projekt - poskytneme vám dost na to, abyste se s hardwarem a náčrtem mohli začít zabývat, a poté ho můžete posunout dále, aby vyhovoval vašim potřebám.

Krok 1: Hardware

Hardware
Hardware

Budete potřebovat tři hlavní položky -

  • deska kompatibilní s Arduino Uno
  • hodinový obvod nebo modul v reálném čase využívající buď DS1307 nebo DS3231 IC
  • a monochromatický LED displej ve stylu P10

Možná budete chtít externí napájecí zdroj, ale k tomu se dostaneme později.

První fází je přizpůsobit hodiny reálného času. Kliknutím sem získáte výukový program, pokud s tím potřebujete pomoci.

Doufám, že teď přemýšlíte „jak nastavíte čas?

Na tuto otázku existují dvě odpovědi. Pokud používáte DS3231, stačí jej nastavit do náčrtu (viz níže), protože přesnost je velmi dobrá, stačí jen dvakrát ročně nahrát skicu s novým časem, abyste pokryli letní čas.

Jinak přidejte jednoduché uživatelské rozhraní-pár tlačítek to zvládne. Nakonec stačí hardware umístit na zadní stranu DMD. Existuje dostatek prostoru pro splnění vašich vlastních potřeb, jednoduchým řešením by mohlo být zarovnání ovládací desky, abyste měli snadný přístup k zásuvce USB - a poté ji přilepit pomocí Sugru.

Pokud jde o napájení hodin - z Arduina můžete spustit JEDEN LED displej a pro vnitřní použití běží s dobrým jasem. Pokud chcete, aby DMD běžel na plný jas sítnice, musíte použít samostatný 5V 4A DC napájecí zdroj. Pokud používáte dva DMD - jde to na 8A atd. Jednoduše připojte externí napájení k jednomu konektoru DMD (k těmto terminálům připojte druhý nebo více DMD).

Pokud si nepřejete přestřihnout konec napájecího kabelu, použijte odpojovač zásuvky DC.

Krok 2: Skica Arduino

Budete muset nainstalovat následující dvě knihovny Arduino - TimerOne a DMD. Poté nahrajte skicu:

// pro RTC #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC je 0x68

// pro 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 řádek #definovat DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

Řetězec finalString; // slouží k podržení poslední věty k zobrazení na DMD

neplatné ScanDMD () // nutné pro DMD

{dmd.scanDisplayBySPI (); }

neplatné nastavení ()

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

// pro RTC

Wire.begin (); // vypálit bajt sběrnice I2C sekundu, minutu, hodinu, dayOfWeek, dayOfMonth, měsíc, rok; // změňte proměnné a odkomentujte setDateDs1307, abyste nastavili čas // pak funkci znovu okomentujte a nahrajte skicu znovu jako druhou = 0; minuta = 13; hodina = 23; dayOfWeek = 4; dayOfMonth = 19; měsíc = 5; rok = 13; // setDateDs1307 (sekunda, minuta, hodina, dayOfWeek, dayOfMonth, měsíc, rok); }

// obvyklé funkce RTC

// Převod normálních desetinných čísel na binární kódovaný desetinný bajt decToBcd (byte val) {return ((val/10*16) + (val%10)); }

// Převod binárních kódovaných desetinných čísel na normální desetinná čísla

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

void setDateDs1307 (bajt sekunda, // 0-59

minuta bajtu, // 0-59 bajtů hodina, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/byte měsíc, // 1-12 byte rok) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (druhý)); // 0 až bit 7 spustí hodiny Wire.write (decToBcd (minuta)); Wire.write (decToBcd (hodina)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (měsíc)); Wire.write (decToBcd (rok)); Wire.write (00010000); // pošle 0x10 (hex) 00010000 (binární) do řídicího registru - zapne čtvercovou vlnu Wire.endTransmission (); }

// Získá datum a čas z ds1307

void getDateDs1307 (byte *sekunda, byte *minuta, byte *hodina, byte *dayOfWeek, byte *dayOfMonth, byte *měsíc, byte *rok) {// Reset ukazatele registru Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Některé z nich potřebují masky, protože určité bity jsou řídicí bity

*sekunda = bcdToDec (Wire.read () & 0x7f); *minuta = bcdToDec (Wire.read ()); *hodina = bcdToDec (Wire.read () & 0x3f); // Je třeba to změnit, pokud 12 hodin dopoledne/odpoledne *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *měsíc = 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); dlouhý start = milis (); dlouhý časovač = start; dlouhý časovač2 = start; boolean ret = false; while (! ret) {if ((timer+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); časovač = milis (); }}}

void createTextTime (int hh, int mm)

// tím se všechna časová data spojí do textu jako jedna věta {finalString = ""; // vymazání věty pro zvláštní případy (níže) finalString = finalString+"It";

// nyní přidejte 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+"eight"; } if (hh == 9 || hh == 21) {finalString = finalString+"nine"; } if (hh == 10 || hh == 22) {finalString = finalString+"ten"; } if (hh == 11 || hh == 23) {finalString = finalString+"jedenáct"; }

// nyní přidejte minuty

přepínač (mm) {případ 1: finalString = finalString+"oh one"; přestávka; případ 2: finalString = finalString+"oh dva"; přestávka; případ 3: finalString = finalString+"oh tři"; přestávka; případ 4: finalString = finalString+"oh four"; přestávka; případ 5: finalString = finalString+"oh pět"; přestávka; případ 6: finalString = finalString+"oh šest"; přestávka; případ 7: finalString = finalString+"oh sedm"; přestávka; případ 8: finalString = finalString+"oh osm"; přestávka; případ 9: finalString = finalString+"oh devět"; přestávka; případ 10: finalString = finalString+"deset"; přestávka; případ 11: finalString = finalString+"jedenáct"; přestávka; případ 12: finalString = finalString+"dvanáct"; přestávka; případ 13: finalString = finalString+"třináct"; přestávka; případ 14: finalString = finalString+"čtrnáct"; přestávka; případ 15: finalString = finalString+"patnáct"; přestávka; případ 16: finalString = finalString+"šestnáct"; přestávka; případ 17: finalString = finalString+"sedmnáct"; přestávka; případ 18: finalString = finalString+"osmnáct"; přestávka; případ 19: finalString = finalString+"devatenáct"; přestávka; případ 20: finalString = finalString+"dvacet"; přestávka; případ 21: finalString = finalString+"dvacet jedna"; přestávka; případ 22: finalString = finalString+"dvacet dva"; přestávka; případ 23: finalString = finalString+"dvacet tři"; přestávka; případ 24: finalString = finalString+"dvacet čtyři"; přestávka; případ 25: finalString = finalString+"dvacet pět"; přestávka; případ 26: finalString = finalString+"dvacet šest"; přestávka; případ 27: finalString = finalString+"dvacet sedm"; přestávka; případ 28: finalString = finalString+"dvacet osm"; přestávka; případ 29: finalString = finalString+"dvacet devět"; přestávka; případ 30: finalString = finalString+"třicet"; přestávka; případ 31: finalString = finalString+"třicet jedna"; přestávka; případ 32: finalString = finalString+"třicet dva"; přestávka; případ 33: finalString = finalString+"třicet tři"; přestávka; případ 34: finalString = finalString+"třicet čtyři"; přestávka; případ 35: finalString = finalString+"třicet pět"; přestávka; případ 36: finalString = finalString+"třicet šest"; přestávka; případ 37: finalString = finalString+"třicet sedm"; přestávka; případ 38: finalString = finalString+"třicet osm"; přestávka; případ 39: finalString = finalString+"třicet devět"; přestávka; případ 40: finalString = finalString+"čtyřicet"; přestávka; případ 41: finalString = finalString+"čtyřicet jedna"; přestávka; případ 42: finalString = finalString+"čtyřicet dva"; přestávka; případ 43: finalString = finalString+"čtyřicet tři"; přestávka; případ 44: finalString = finalString+"čtyřicet čtyři"; přestávka; případ 45: finalString = finalString+"čtyřicet pět"; přestávka; případ 46: finalString = finalString+"čtyřicet šest"; přestávka; případ 47: finalString = finalString+"čtyřicet sedm"; přestávka; případ 48: finalString = finalString+"čtyřicet osm"; přestávka; případ 49: finalString = finalString+"čtyřicet devět"; přestávka; případ 50: finalString = finalString+"padesát"; přestávka; případ 51: finalString = finalString+"padesát jedna"; přestávka; případ 52: finalString = finalString+"padesát dva"; přestávka; případ 53: finalString = finalString+"padesát tři"; přestávka; případ 54: finalString = finalString+"padesát čtyři"; přestávka; případ 55: finalString = finalString+"padesát pět"; přestávka; případ 56: finalString = finalString+"padesát šest"; přestávka; případ 57: finalString = finalString+"padesát sedm"; přestávka; případ 58: finalString = finalString+"padesát osm"; přestávka; případ 59: finalString = finalString+"padesát devět"; přestávka; }

// poledne?

if (hh == 12 && mm == 0) {finalString = finalString+"poledne"; } // půlnoc? if (hh == 00 && mm == 0) {finalString = finalString+"půlnoc"; }

}

prázdná smyčka ()

{// získejte čas z bajtu RTC sekundu, minutu, hodinu, dayOfWeek, dayOfMonth, měsíc, rok; getDateDs1307 (& sekunda, & minuta, & hodina, & denOfWeek, & denOdMěsíc, & měsíc, & rok);

// převede čas na větný řetězec

createTextTime (hodina, minuta);

// nyní odešlete text do DMD

drawText (finalString); }

Skica má obvyklé funkce pro nastavení a načítání času z integrovaných obvodů hodin reálného času DS1307/3232 a jako obvykle u všech našich hodin můžete zadat informace o čase do proměnných v neplatném nastavení (), poté odkomentovat setDateDs1307 (), nahrajte skicu, znovu okomentujte setDateDs1307 a poté skicu nahrajte ještě jednou. Pokud jste nepřidali žádné hardwarové uživatelské rozhraní, opakujte tento proces a znovu nastavte čas.

Krok 3:

Jakmile je čas načten do void loop (), je předán funkci createTextTime (). Tato funkce vytvoří textový řetězec, který se má zobrazit, počínaje „It“a poté podle aktuálního času určí, která slova je třeba sledovat. Nakonec funkce drawText () převede řetězec obsahující text k zobrazení na znakovou proměnnou, kterou lze předat do DMD.

Doporučuje: