Lahka obletnica na Arduinu. Lahka knjiga za obletnico Shadowplay na platformi Arduino Uno Pripravljena knjiga za obletnico o Arduinu

Tako se je naša ekipa soočila z nalogo na treh frontah: ustvarili smo že majhen projekt strojne opreme, ki temelji na platformi Arduino. Warto ugotavlja, da smo do tega trenutka vedeli veliko o teoriji v načrtovanju vezij. In to pomeni, da ni treba delati s spajkalnikom (praktično), niti, kar je še pomembneje, delati z Arduinom.

Neverjetno, postavili smo jo, posvečeno projektu Shadowplay Clock. To stensko obletnico, ki jo je ustvarila ekipa oblikovalcev Videnskega, si lahko ogledujete uro za uro tako, da se s prstom dotaknete njenega središča. Luči svetijo v takšnem vrstnem redu, da senca prsta v sredini kaže uro. Enake stvari bi bilo možno ustvariti tudi sam (ali celo podobne), a v glavah svojega doma. Članek je bil objavljen, kot lahko opazimo, brez natančnega opisa projekta. Očitno je bilo, da moramo sami odrasti, kako izdelati to napravo in jo spraviti v življenje. Pojdimo naprej in nadaljujmo s tem.

Materiali

Za ustvarjanje obletnice potrebujete:
  • pripravljeno iz vlaknene plošče
  • LED trak za 60 diod
  • Arduino Uno
  • modul ure realnega časa RTC DS1307
  • gumb
  • maketa na krovu
  • Registracija 74HC595 (x2)
  • 8-bitni registrski register 74HC573N (x8)
  • dekoder 4-16 K155ID3
  • Inverter z odprtim odtokom IN74HC05AN (x10)
  • bivalni blok

Začnimo

No, dodal bom robotski algoritem:
  1. Ko se napaja, se LED dioda vklopi v določeni kombinaciji. V originalni Shadowplay so bile vse LED diode ugasnjene, vendar se nam je zdelo, da bi bilo bolje, da bi to kombinacijo zagnali kot ohranjevalnik zaslona.
  2. Ko pritisnete gumb (torej smo tudi izhajali iz originala in v sredino vstavili majhen gumb), se odčita ura iz RTC modula.
  3. Obračunska ura se pretvori v dvojno šifro (masko) in vnese v register.
  4. Potrebna dioda se prižge v maski.

Strojni del

Ko smo se odločili za idejo projekta, smo najprej poskušali pripraviti različne možnosti za njegovo izvedbo. Glavna ideja je bila, kako nasloviti 60 LED. Prosim, to je odgovor na prehrano in način izvajanja skoraj vseh shem.

Prva stvar, ki mi je prišla na misel, je bila možnost povezave z wiki dekriptorji. Zloženo vezje je bila kaskada štirih dešifratorjev 4 - 16 in enega dekoderja 2 - 4, in oba z vhodi, ki omogočajo dekodiranje. Takšna kaskada je omogočila naslavljanje za 64 izhodov, kar je pustilo 60 LED diod za priklop.

Vendar je potem postalo nujno, da bo s to shemo težko uporabiti (nasloviti) več kot eno LED (in morali bi zagotoviti vsaj dobre in slabe puščice). Tu se je pokazala glavna napaka v tej shemi - dekoder ne more hkrati obravnavati želenega izhoda.

To nas je pripeljalo do tega, da verjamemo v idejo kaskade dekriptorjev. Poleg tega imamo zdaj še eno ugodnost pred prihajajočo shemo - podporo za enourno delovanje različnega števila LED.

Da bi zadovoljili vse to, smo pomislili, da bi lahko s kožno svetlobo rešili svojo postavo. Za kaj se je dobro prijaviti, kjer koža poleg jemanja izcedka nakazuje pojav ene od svetlečih diod. Odločili smo se za uporabo registrov za 8 mest, zaradi česar so bolj obsežni in praktični. Očitno v našem vezju potrebujemo 8 takih registrov, da zagotovimo napajanje 60 LED.

Potem smo razmišljali o tem, kako ustvariti vir svetlobe z Arduinom prek registrov. Za normalno delovanje mora register popolnoma odstraniti vseh 8 bitov. Arduino Uno seveda potrebuje dovolj prenosnih izhodov za več ur naenkrat, sicer bi bil tak pristop racionalen. Poleg tega ima vezje skupno 8 registrov, kar pomeni, da jih je treba ustrezno nasloviti. V ta namen smo vezju dodali dekoder in dva kaskadno povezana 8-bitna trajna registra. En bistveni register shrani 8-bitno masko postaje, ki bo uvožena v enega od 8 primarnih registrov, katerih številka je shranjena v drugem bistvenem registru. Očitno je dekoder povezan z drugim registrom ključev. V ta namen popolnoma obrusite dekoder 3 x 8.

Za pridobitev inverzije iz zahtevanega števila izhodov smo izbrali dve inverterski mikrovezji KR1533LN1. To je seveda zapletlo shemo.

Druga skrb je bila delovna napetost LED, ki je enaka 12 voltom in 5 voltom logičnih čipov. Predlagana rešitev je temeljila na stacionarnem razsmerniku z zaprtim odtokom. Takšno mikrovezje igra vlogo ključa, ki zapre (pri logični 1) ali odpre (pri logični 0) enega od kontaktov LED na maso in s tem vklopi ali izklopi LED. Vezje prenaša 12 voltov na robota, podobno delovni napetosti svetlečih diod, tako da se 5 voltov za logične čipe doda vezju z dodajanjem stabilizatorja KR142EN5A z dvema kondenzatorjema.

Različni vhodi pojočih mikrovezij temeljijo na konstantni vrednosti na vhodu, zato so bili pripeljani na tla ali za življenje. Ta razdelek ima naslednje vnose:

  • Inverzni vhod zavrže MR v obeh bistvenih registrih prek priključnega napajalnega registra na izhod stabilizatorja pri 5 voltih.
  • Inverzni vhod ločenega odseka na izhod OE v obeh obstoječih priključnih registrih neposredno na maso.
  • Inverzni vhod ločenega dela priključkov dekoderja E0 na maso

Krmilno vezje deluje z uporabo vhodov (E1, SH, ST, DS). Pomen in pomen kožnega signala sta podrobneje obravnavana spodaj:

Vhod E1 se uporablja za izboljšanje dekoderja. V našem primeru sta na začetku na dekoderju dva krmilna vhoda E1, E0 in sta inverzna. Če je en izhod dovolj, lahko drugega (E0) pripeljete do tal. Tabor dekoderja "za čiščenje" deluje, priklopne postaje E1 ne dajejo visoke ravni signala. Da bi naredili trik, smo ta vhod povezali z inverterjem. Brez tega lahko dekoder prikaže nepravilne registrske signale, na primer v času posodabljanja podatkov v ločenem registru. Kot je bilo že rečeno, je lahko vezje opremljeno z dekoderjem 3 x 8, ki ima lahko en neinvertiran vhod, kar vam omogoča enostavno reševanje vseh zgoraj opisanih težav brez zapletenih žic in spajkalnika.

Ko se na E1 uporabi enonivojski signal, dekoder dekodira naslov registra, ki se nahaja v ustreznem bistvenem registru, in pošlje signal na zahtevani izhod. Po tem se dekoder ponovno izklopi z dovajanjem E1 signala nizke ravni. Tako obračanje dekoderja ustvari signal na zahtevanem izhodu, katerega rob in padec služita kot taktni impulz za register za zajem podatkov, ki so shranjeni na vodilu.

Naslednji trije vhodi so dodeljeni za nadzor obstoječih registrov. Začnite z najpreprostejšim načinom prijave v svoje podatke DS. Ta vnos je, kot izhaja iz imena, namen prenosa podatkov. Ker so vsi registri v vezju povezani kaskadno, predstavlja DS izhod enega izmed njih. Vnos drugega pomembnega registra iz izhoda preostalega bita prvega registra. Posledično obstaja en veljaven register za 16 števk, iz katerega je izbranih več kot 12 števk.

Vhod SH je vhod taktnega impulza. Na ta vhod je doveden meander, ki označuje zbiranje in shranjevanje podatkov iz posameznega registra, to kontaktno vezje pa je povezano s SHCP povezavami obeh registrov.

Preostali simbol ST bo služil za vnos podatkov v registrske izhode. Na ta vhod pa se dovaja impulz le, če so podatki v obstoječem registru še shranjeni in jih je potrebno zapisati na izhodu registrov. Šele po podanem signalu podatki v sredini registra do prve vrstice prožilcev porabijo drugo vrsto prožilcev in postanejo na voljo na vodilu. ST je kontakt, povezan s STcp povezavami obeh registrov.

Ločevanja dveh vej registrov MR in OE ni bilo treba pojasnjevati. Prvi vnos (MR) označuje prenos podatkov v sredino registra. To vezje ne zahteva takšne zmogljivosti; zato se najbolj odziven signal dovaja prek vhodnega signala.

Drugi registrski vhod (OE) označuje povezavo druge vrste sprožilcev na sredini istega registra iz vodila, tako da gre za ločen vhod. Tudi ta funkcija ni potrebna, zato jo je treba pripeljati na zemljo.

Drug neopisni kontakt se uporablja za odstranitev signala z gumba na sredini gumba, vezje gumba je tipično in je vhod in ključ, odvisno od položaja katerega se v Arduino dovaja nizek ali visok signal. Ko pritisnete gumb, časovnik deluje v načinu ohranjevalnika zaslona ali v načinu prikaza ur.
Priključek na Arduino ni nič posebnega, le da je SH priključek idealno povezan z digitalnim SCK priključkom. Druge oblike vezja je mogoče povezati s katerim koli od razpoložljivih digitalnih vhodov. Naše okno za povezavo je videti takole:

  • Arduino pin13 (SCK) – izvedba SH vezij
  • Arduino pin 11 – izhod ST vezja Arduino 8 – izhod DS vezja Arduino 5 – izhod E1 vezja Arduino 3 – izhod gumba Arduino pin GND – ozemljitev vezja (priključena tudi na ozemljitev življenja blok)
    Po zasnovi krogov so se začela dela na podlagi za obletnico.

    Naboji so izdelani iz vlaknene plošče: premera približno 36 cm – zadnji del obletnice; Ta prstan meri 36 cm (zunanji premer) \ 26 cm (notranji premer) - sprednji del. V originalni igri Shadowplay je premer količka 72 cm, mi pa 36 cm, na kol je prilepljen svetlobni trak, ki je nato razrezan na 60 delov (dioda + upor). Ob koli je bila izvrtana odprtina. Skozi njih so puščice, povezane z LED diodami, povezane s ploščo, ki se nahaja na vratih vložka.

    Pravzaprav so svetleče diode povzročile glavobol. Le prilepili so jih na vrh količka, nastavkov pa niso zrahljali. Posledica je bila, da temna svetloba ni ustvarila dovolj svetlosti. In moral je porabiti skoraj eno uro, da je dvignil stopinje za 50 - 60, tako da je pod kožo položil pletene kartonske blazinice. Torej, 60 malih kartonastih dresov. V zvezi s tem: ne ponavljajte našega trpkega sporočila - vnaprej se založite z blazinicami.

    Bili smo v mirovanju in ni bilo časa za jedkanje druge plošče. Pohvalili so ga za svojo odločitev - ustvariti projekt na mizi. Tisti, ki z lahkoto sestavijo takšno vezje na prototipni plošči, so se tega naučili veliko pozneje. No, negativni dokazi so še vedno dokazi.

    Priložim mizo in glamurozen videz zadaj.



    No, no, žal nam je.

    Prvotni načrt je bil narediti natančno kopijo Shadowplay. Vendar metoda, s katero se uporabnikov prst zazna v središču naprave, v statistiki ni opisana. Po smrti smo prišli do zaključka, da je možno, za katero se lahko uporabi fotorezistor. Se tej ideji niso mogle upreti, zato. Fotorezistor ima morda napačno aplikacijo. Naprave lahko uporabljate v glavah različnih stopenj lahkotnosti, kar pomeni, da prsta ne boste vedno zaznali s 100-odstotno natančnostjo. Prednost je imel gumb, ki smo ga postavili v sredino konstrukcije. Poleg zanesljivosti je še ena prednost. Nepomemben zaradi svoje majhnosti je senčnik idealen za vlogo rojstnodnevnega dečka. Na ta način lahko programirate napravo za trajno delovanje v načinu delovanja in brez uporabe prsta.

    Ko je celotno vezje spajkano (dolge neprespane noči s spajkalnikom in pinceto), inverterska vezja so povezana z LED diodami, je prišel čas, da najprej poskusite vklopiti napravo. In, o čudež, res so zagorele! Ale ne vse. Takoj se je pojavila misel, da je bil nepravilno spajkan. Vendar je bil razlog, kot je bilo jasno, drugje. Ker ob prvem zagonu nismo povezali vseh krmilnih vhodov logičnih mikrovezij, ampak samo najnujnejše, je nato na nepovezanih vhodih prišlo do nejasnosti v napetostnih nivojih. Pred tem je bilo vezje sestavljeno na testni plošči z velikim kupom žic in ni bilo jedkano. Vodite balinanje bistveno hitreje kot elektromagnetne motnje. Tudi z najmanjšim znižanjem napetosti preko vhodov na nepovezanih vhodih se lahko aktivira logični element. Kot rezultat, kateri koli predmet, ki je v neposredni bližini plačila, klikne EMI in, očitno, nepreneseno vedenje logike in s tem LED.

    Posledično je problem dovolj majhen, da zahteva preprosto rešitev. Dovolj je bilo inicializirati vhode vseh logičnih elementov v vezje. Tobto. Popolnoma sem povezal vezje, tako da ni bilo nepotrebnih vhodov (sami vhodi in izhodi ne prispevajo k tej težavi, saj logika delovanja mikrovezij ni v njih) in vse je padlo na svoje mesto.

    Programski del

    No, strojne opreme je konec (praktično). Čas je za pisanje programov z uporabo Arduina. Za začetek morate konfigurirati modul RTC in ga namestiti pozneje. Mikrovezje temelji na visoko natančnem modulu DS1307, povezovalni vmesnik je I2C. Interni koledar ima nova zavarovalna kritja do leta 2100 z napovedjo prestopnih let. Ko je baterija napolnjena, lahko modul deluje avtonomno do ene minute. Spodaj je diagram povezovanja RTC z Arduinom, ki ga najdete na tej spletni strani. Takoj je bilo zbranih veliko informacij o modulu RTC.

    Konec koncev je bilo nemogoče napisati kodo, ki bi prebrala uro iz RTC, jo pretvorila v masko in poslala na tablo.

    Koda

    #vključi #vključi char REG; tmElements_t te; int c, ponastavitev = 1; void setup() ( pinMode(13, OUTPUT); pinMode(11, OUTPUT); pinMode(8, OUTPUT); pinMode(5, OUTPUT); pinMode(3, INPUT); Serial.begin(57600); // Danska blok vam omogoča nastavitev ure na RTC, vikorist enkrat //te.Hour = 18; //te.Minute = 50; //te.Second = 0; //te.Day = 20; // dan //te.Month = 4 // mesec //te.Year = CalendarYrToTm(2016); //RTC.write(te); ) void loop() ( if(digitalRead(3)) // vpraša, ali je gumb je pritisnjen (RTC.read( te );SetShadowTime(te.Hour,te.Minute,te.Second,2); // odprite in nastavite uro na obletnico delay(900); reset=1; (); reset = 1;) // Ponastavi LED za ( int j = 0;j<8 ; j++) SetUpLightByMask(j,0); } //=======================================================================Вспомогательные функции void SetUpLightByMask(int RegNum, char LightMask) // функция подсветки светодиодов согласно полученной маске в заданном регистре { digitalWrite(5, LOW); digitalWrite(11, LOW); shiftOut(8, 13, MSBFIRST, LightMask); shiftOut(8, 13, LSBFIRST, RegNum); digitalWrite(11, HIGH); digitalWrite(5, HIGH); } void digitalClockDisplay() { //Функция вывода времени из RTC в консоль, полезна при настройке RTC RTC.read(te); Serial.print(te.Hour); Serial.print(" : "); Serial.print(te.Minute); Serial.print(" :"); Serial.print(te.Second); Serial.print(" "); Serial.print(te.Day); Serial.print(" "); Serial.print(te.Month); Serial.print(" "); Serial.print(tmYearToCalendar(te.Year)); Serial.println(); } //Функция рассчёта теневых стрелок на часах, в качестве параметров принимает часы, минуты, секунды и в качестве последнего параметра комбинацию стрелок: //0 - только часы,1 - часы и минуты, 2 - часы минуты и секунды void SetShadowTime(int Hours, int Minutes, int Seconds, int param){ int h,hshift,m,s; for(int j = 0; j<8 ; j++) REG[j] = 0; if(Hours >= 12) Ure - = 12; h = ure + 6; if(h >= 12) h -= 12; hshift = (int) Minute/12; REG[(int)(((h*5)+hshift)/8)] = REG[(int)(((h*5)+hshift)/8)] | 1<<(((h*5)+hshift)%8); if(param == 1) {m = Minutes + 30; if(m ><<(m%8); } if(param == 2) {m = Minutes + 30; if(m >= 60) m - = 60; REG[(int)(m/8)] = REG[(int)(m/8)] | 1<<(m%8); s = Seconds + 30; if(s >= 60) s - = 60; REG[(int)(s/8)] = REG[(int)(s/8)] | 1<<(s%8); } for(int j = 0; j<8 ; j++) SetUpLightByMask(j,REG[j]); } void wait1() //один из вариантов функций заставки {for(int a = 0; a < 8; a++) {c=0; for(int b = 0; b < 8; b++) {c = c << 1; c = c | 1; SetUpLightByMask(a, c); delay(10); } } for(int a = 0; a < 8; a++) {c=255; for(int b = 0; b < 8; b++) {c = c << 1; SetUpLightByMask(a, c); delay(10); } } }

    Zlaganje

    Napravo lahko uporabite za praktično kuhanje. Nemogoče je bilo zbrati vsa skladišča naenkrat in ga zagnati. Na zadnjo stran police smo pritrdili razvojno ploščo in ostale rezervne dele (Arduino, RTC). Na vrhu količka je z LED diodami pritrjen obroč, ki je pomemben del izvedbe. Da bi spoštovali oblikovalčevo pozornost do nepopolnosti v dizajnu, je bil prstan pobarvan z ročno napisanim "a la mikrovezje". І nareshti - priključen v vtičnico. Rezultat je spodaj:

    Prosim, zahvalite se mi za kakovost fotografije.

    To je majhen primer, katere kombinacije je mogoče zagnati kot "varčevalnik":

    In os je na srečo obletnica delavskega tabora:

    Tukaj je nekaj pospeškov puščic, ki kažejo, da se tako Khvilinna kot Wartova zrušita.

    In tako, zaznavanje hrane, kot želite peti. Kako prikazati obletnico, sekundarno roko in drugo roko? Bulo chimalo superechok na to temo. Prikazani so bili različni problemi: od različne osvetlitve puščic do zaporednega vklopa puščic (dobro takoj, slabo po kratkem času itd.). Ko pa smo se čudili izvirniku, smo ugotovili, da oblikovalci Vidensky načeloma niso sprejeli teh živil. Na tej pikici bi se dalo zatisniti v oči. Zagotovo bo v bližnji prihodnosti odvzeto.

  • star eno leto
  • Arduino
Dodajte oznake


Takšen datum obletnice bo videti zelo izvirno na steni, jasno imajo svetleče puščice, ki predstavljajo indikator puščice, LED indikator v sredini in čudovito RGB osvetlitev ozadja. Težko je imenovati tako lastno vino, razen če porabljena ura in trud ne bosta pokvarjena.

Materiali za ohišje:
- Črne akrilne plošče 300x300x3 mm 3 kosi
- Prozor akrilna osvetlitev ozadja 300x300x3 mm 1 kos
- Visoko poliranje akrilnih plošč
- Lepilo
- Distančne puše 15 mm z navojem m3 20 kom
- Gwinti m3 s podložkami 20 kom
- Okvir za slike 300x300 mm 1 kos

Elektronski materiali:
- Zuvny register CD74HC595 8pcs
- LED gonilnik TLC5940 1 kos
- Ura realnega časa (RTC) DS1307 1 kos
- Linearni regulator LM317 1 kos
- Bipolarni tranzistor BD139 8 kosov
- elektrolitski kondenzator 1 uF 2 kos
- Kondenzator 0,1 uF 1 kos
- Upori 120 Ohm 60 kosov
- Upori 10 kOhm 9 kosov
- Upor 2 kom 1 kos
- Upori 1 kom 9pcs
- Upor 330 Ohm 1 kos
- LED 480 kosov
- 4-mestni LED digitalni indikator (z ogljikovimi anodami) 1 kos.
- En RGB LED trak (z ogljikovo anodo) 1 kos (pod številčnico)
- Arduino Mega ADK modul (Rev3) 1 kos
- Živa baterija 12 V 1 kos

Croc najprej. Pripravljeno telo.
Za storž so akrilne plošče izrezane in izvrtane vzdolž stola. Nato se sprednja črna plošča telesa prilepi na pripadajoči del (režo) in na ploščo pod svetlečo diodo.

Croc je drugačen. Delo na telesu je končano.
Za večjo obstojnost avtorica eno akrilno ploščo prilepi na hrbtno stran okvirja slike, tako da se s sprednje strani odstrani in je ne potrebujemo več.
Privijte 15 mm puše na ploščo, kot je prikazano na sliki. Zdaj je možno prilepiti puše iz okvirja na čelno ploščo. Nato se lepljene puše privijejo na svoje mesto, da se prilegajo prihodnosti.

Krok tretji. Vstavljanje LED diod.
Pred nami vstavimo LED diode v prvo vrsto odprtin (na vrstico 1 je 60 LED). Katodi sta prispajkani ena na drugo v bližini plošče z dodatno bakreno luknjo 0,8 mm, anodi pa sta potisnjeni ven. Ta postopek se ponovi za 7 drugih vrstic. Zdaj, če so bile anode zmešane na sto odstotkov, se bodo tudi smradi med seboj spojili. Tako je nastala matrika z 8 vrsticami in 60 stolpci.

Lonček iz četrtin. Spajkanje kablov na matrico.
V ta namen so nameščeni 8-žilni kabelski konektorji, eden od njih je spajkan na katode na matrici. Na vse take konektorje je bilo spajkanih do 60 nizov anod. Avtor je ob uporabi 8-žilnih konektorjev na koncu odtrgal kabel s 64 žicami, kar pomeni, da so se 4 izgubile in so bile ovite z električnim trakom. Avtor tudi priporoča uporabo sedmih 8-žilnih konektorjev in enega 4-žilnega konektorja, da dobite točno 60.

Krok pet. Pritrditev indikatorja.
V akrilni plošči blizu diska naredite odprtino in za lažjo uporabo zalepite indikator s spajkanimi žicami.

Krok ima šestdeset. Plačilo.
Iz traku za mizo večje velikosti morate izrezati 2 trakova, tako da se bosta prilegala okvirju slike. Nato samostojno pripravijo kup konektorjev, kot je razvidno iz spodnje fotografije.

Krok somiy. Čas zlaganja.
Nato boste morali namestiti vse dele v telo v skladu s spodnjim diagramom. Avtor je vgradil baterijo 1000mA/leto, ki se polni, da lahko delajo brez zunanjega kabla. Na Arduino namestite programsko kodo, ki je priložena na dnu statistike. Tako sta nameščeni knjižnici za modul prave ure in gonilnik LED TLC5940, ki sta tudi priloženi članku. Shema z ločenimi zgradbami: (zavzeto: 302)

Obletnica svetlečih diod in utripajoče igle na mikrokontrolerju Arduino
Ta edinstveni izdelek s svojimi svetlečimi diodami in pulzirajočo puščico peresa je lahko proizvedel popolna mikrovezja krmilnika TLC5940 PWM. Glavna naloga je razširiti število kontaktov z uporabo PWM modulacije. Letošnja posebnost je tudi transformacija analognega voltmetra v digitalno napravo. V ta namen je bila na standardnem tiskalniku izrezana nova lestvica in prilepljena na staro. Torej, 5. veja ni oživljena, preprosto z raztezanjem pete veje zdravnik pokaže puščico, ki je dosegla konec lestvice (izven lestvice). Glavna izvedba je implementirana na mikrokrmilniku Arduino Uno.

Da jubilejna luč ne bi svetila premočno v temnem prostoru, je bilo implementirano vezje za samodejno prilagajanje svetlosti glede na stopnjo osvetlitve (fotorezistor Vikorist).

Lekcija 1: Potrebne komponente



Kaj je potrebno:

  • Modul analognega voltmetra za DC 5V;
  • Arduino UNO mikrokrmilnik ali drug soroden Arduino;
  • Arduino vezje (proto plošča);
  • Modul ure realnega časa DS1307 (RTC);
  • Modul s krmilnikom PWM TLC5940;
  • Osvetljene svetleče diode – 12 kosov;
  • Komponente za sestavljanje vezij za samodejno uravnavanje svetlosti (LDR).

Tudi za izdelavo ostalih komponent projekta je potreben dostop do 3D tiskalnika in laserskega rezalnika. Če imate dostop, bodo navodila za naslednje korake poslana stolu za pripravo.

Krok 2: Številčnica




Številčnica je sestavljena iz treh delov (kroglic), izrezanih na lasersko rezanem stroju iz 3 mm MDF plošče, ki so med seboj pritrjeni z vijaki. Plošča brez rež (desno spodaj na sliki) je nameščena pod drugo ploščo za pozicioniranje LED (desno spodaj). Nato so okoli LED diode nameščene na vhodne reže, sprednja plošča pa je nameščena na žival (na vrh otroka). Ob robu številčnice je izvrtana luknja, skozi katero so vsi trije deli med seboj pritrjeni z vijaki.

  • Za preverjanje delovanja LED je bila na tej stopnji uporabljena gumbasta baterija CR2032;
  • Za pritrditev svetlečih diod so bili narejeni majhni koščki lepljivega šiva, ki so bili prilepljeni na zadnjo stran svetlečih diod;
  • Vse noge LED so bile že upognjene na enak način;
  • Ponovno odprite luknje na obeh straneh, ki so bile uporabljene za pritrditev vijakov. Izkazalo se je, da je to veliko močnejše.

Tehnične podrobnosti za številčnico so na voljo za:

Croc 3: Oblikovanje vezij



Na tej stopnji je prišlo do prekinitve električnega tokokroga. S kakšnim namenom so zmagali razni pajdaši in sokrivci? Naj nas ta proces ne zanese preveč; spodnji dve datoteki predstavljata že pripravljeno električno vezje za Wikoristan v tem projektu.

Lekcija 4: Povezave vezja Arduino





  1. Najprej moramo odspajkati vse kontakte na vezju in sekcijskih ploščah;
  2. Nadalje, za tiste, ki uporabljajo 5V in GND v številnih ploščah in perifernih napravah, sta bila za zanesljivost dva volta 5V in GND spajkana na vezje;
  3. Nadaljnje namestitve krmilnika TLC5940 PWM bodo opremljene s kontakti, ki jih je treba preizkusiti;
  4. Po tem so prikazane povezave krmilnika TLC5940, vključno s povezovalnim diagramom;
  5. Da bi lahko zamenjali baterijo, je bil na robu vezja nameščen RTC modul. Če ga spajkate na sredino plošče, dodeljeni kontakti ne bodo vidni;
  6. Shema povezave modula RTC je prikazana v skladu s shemo povezave;
  7. Izbrana je shema samodejnega nadzora svetlosti (LDR), lahko se seznanite z navodili
  8. Žice za voltmeter lahko priključite tako, da žice povežete z linijo 6 in GND.
  9. Na primer, spajkanih je bilo 13 žic za svetleče diode (v praksi se je izkazalo, da bi bilo to lažje narediti, preden nadaljujete na 3. korak).

Krok 5: Programska koda

Spodnja programska koda je zbrana iz različnih materialov za komponente letopisa, ki jih najdete na internetu. V celoti bo zapadlo in ob tej uri bo v celoti zapadlo, preden so bili dodani komentarji poročanja. Preden se dotaknete mikrokontrolerja, se prepričajte o naslednjih točkah:

  • Pred utripanjem vdelane programske opreme Arduino morate komentirati vrstico, ki določa uro:
    rtc.adjust(DatumUra(__DATE__, __TIME__))
    Po utripanju vdelane programske opreme krmilnika v tej vrstici (ura je nastavljena), jo morate znova komentirati in znova utripati krmilnik. To modulu RTC omogoča uporabo baterije za zapomnitev ure, kar je bistveno za življenje.
  • Mimogrede, če uporabljate "Tlc.set()", morate uporabiti "Tlc.update"

Lekcija 6: Zunanji obroč

Zunanji obroč za obletnico je bil izdelan na 3D tiskalniku Replicator Z18. Pritrjen je na datum obletnice za dodatnimi rubci na sprednji strani datuma obletnice. Spodaj je datoteka iz 3D modela prstana na 3D tiskalniku.

Croc 7: Zložljiva leta


Mikrokrmilnik Arduino z ohišjem za elektroniko, ki je pritrjen na zadnjo stran police s pomočjo samoreznih vijakov in matic kot distančnikov. Nato priključite vse LED diode, analogni voltmeter in LDR na žice, ki so bile predhodno spajkane na vezje. Vse LED diode so med seboj povezane z enim zatičem in povezane z zatičem VCC na krmilniku TLC5940 (samo prispajkajte žico na žico).

Za zdaj vse ni zelo dobro izolirano od kratkih zamud, vendar se bo delo na tem nadaljevalo v prihodnjih različicah.

Če želite ustvariti samogenerirani elektronski letopis na svetleči diodi na Arduinu s pravim urnim modulom, bosta na voljo fotografija priprave in opis poročila.

Wikoristan materiali:

  • - ena linija na mikrovezjih ws2811 (RGB, 12V) 5 metrov - 700 rubljev;
  • - Arduino nano - 200 rubljev;
  • - svetlobni senzor - 28 rubljev;
  • - Modul prave ure RTC DS1307 AT24C32 - 37 rubljev;
  • - preoblikovanje življenja LM2596 – 41 rubljev;
  • - rešilni blok 12 V 1A;
  • - Temperaturni senzor DALLAS DS18B20 - 48 rubljev;
  • - Kos plošče, dva gumba, pikado.
  • - Karton je trd.
  • - papir Whatman (2 kosa).
  • - dvostranski lepilni trak (3M).
  • - Zvichay trak.
  • - listi polietilena (vzeti iz suhe embalaže).

1. Namestitev pisave v MS Office, kot tudi drugi simbol 8 za celotno velikost A4 okvirja. Naletel sem na Visio. Notranji šivi so meje za označevanje šivalnega šiva. Zunanje meje so obrisi števil.

2. Uporaba enega šiva med kosi na kartonu

3. Za naslednjo šablono se naredi oznaka na podležnem polietilenu debeline 15 mm in nadalje označi po oznaki.

Za izrezovanje vikorista smo uporabili samostojno izdelano delovno mizo iz treh kosov lesa, lista iverne plošče in navpično raztegnjenega nichrome žarka. Napaja ga regulacijski blok življenja.

4. Glede na oznake na kartonskih trakovih zlepimo trakove istega šiva in jih povežemo s spajkanjem vzdolž traku.

Glavna shema je postavljena v okvirno škatlo, saj je takšen kovček krhek.

V torbici je dodan kabel, v katerem je:

  • +12V – za življenjsko dobo diodnega voda;
  • +5V – za življenjsko dobo modula svetlosti;
  • 0 – podzemna žica (minus);
  • izpis podatkov iz Arduina na eno stran;
  • izhodni signal iz svetlobnega senzorja v arduino;

Diagram povezave Arduino.

Predelava življenja, Arduino nano in modul obletnice prave ure.

Plačilo za prevoz na delo s korekcijskimi gumbi.

Algoritem napada robota:
Letni dnevnik prikazuje uro, datum in temperaturo v prostoru: prvih 15 sekund – uro, nato 3 sekunde – datum, nadaljnje 3 sekunde – temperaturo, nato uro. V 45 sekundah ponovim datum 3 sekunde, temperaturo 3 sekunde in ponovim uro.
Če je uporabljena svetloba, je svetlost slike visoka, če je temna, pa se zmanjša na minimum.

Dobesedno ni načinov, kako narediti elektronsko knjigo za obletnico z lastnimi rokami: sheme so široko zastopane v literaturi in na internetu. Večina trenutnih izvedb se zgleduje po mikrokontrolerjih. Viconnya takšnih projektov je določena Vimaga, veliko praktično navichy jedro pri Galuzi Elektroni: vminnya porjavi specializirani programmim nepozabnega, stagnira v domačem boju drucovani Plačano v kloridnem premogu, dobro za dobrega vojaka. Prav tako se je treba izogibati uporabi orodja in odpadnih materialov.

Vendar pa obstaja preprost in cenovno ugoden način za zbiranje elektronske kartice za obletnico z lastnimi rokami doma: uporabite platformo Arduino. Je kompleks programske in strojne opreme, posebej zasnovan za učenje osnov programiranja in elektronike. S pomočjo Arduina, če ste oseba, brez posebne napredne priprave, lahko ustvarite elektronsko napravo z lastnimi rokami: diagrami vezij, inženirski programi in spajkalnik niso potrebni!

Povezava vseh elektronskih komponent je izvedena na posebni kontaktni (“spajkalni”) prototipni plošči, kar izključuje nevarnost odtrganja varovalk, ureznin in drugih poškodb – to lahko storimo hkrati s konstruktorjem Arduino. . Pravilna metoda predstavitve načelnih diagramov vam bo pomagala, da ne boste imeli usmiljenja, ko bo naprava zložena.

Krok 1. Seznam komponent

Za preprost snemalnik na svetlobnih LED matricah boste potrebovali nekaj poceni komponent:

  • Platforma Arduino. Primerni so najenostavnejši modeli - ali Micro;
  • kontaktna plošča;plošča za kruh;
  • rezervni deli za mizo;
  • Modul za obletnico v realnem času Adafruit DS3231;
  • LED matrični modul 32x8 MAX7219;
  • dva gumba.

Potrebovali boste tudi osebni računalnik in kabel USB-mini-USB za uporabo programske opreme za nadzor uganke. Os in vse ostalo - spajkalnik, klešče za odstranjevanje izolacije, montažni noži in drugo profesionalno orodje niso potrebni: vse operacije se izvajajo ročno. Najbolje je, da v takih situacijah uporabite pinceto, sicer pa lahko tudi brez nje.


Krok 2. Zložljiva elektronska vezja

Vezje elektronskega zapisovalnika z indikacijo na svetlečih diodah iz priključkov Arduino za neusklajene radijske ojačevalnike bo izpadlo. Za zlaganje potrebujete le nekaj vodnikov. Poveži tabelo:

Arduino modul → LED matrika 32x8 MAX7219

Arduino modul → obletnica prave ure Adafruit DS3231

Arduino modul → gumbi

D2 – gumb 1

D3 – gumb 2

Drugi izhod gumba je priključen na GND.

Pomembno si je zapomniti in spoštovati, kako so kontaktne odprtine na plošči za izdelavo zaprte druga proti drugi. Naslednji diagram prikazuje način notranje povezave kontaktnih odprtin:


Dve vrstici (1 in 4) na obeh straneh sta zaprti vodoravno - povzročita, da se smrad pojavi kot +5V življenjska linija in GND ozemljitev. Vsi notranji kontakti (2 in 3) so zaprti navpično. V tem primeru je montažna plošča vertikalno in horizontalno razdeljena na dva neodvisna simetrična dela. To omogoča na primer sestavljanje dveh različnih naprav na eno ploščo.

Shema elektronskega zapisovalnika datuma z LED indikacijo, kot tudi razporeditev elementov na tiskanem vezju je prikazana na sliki:

Previdno preverite vrsto vseh povezav v shemi. Prepričajte se tudi, da so vodniki pravilno pritrjeni v kontaktnih odprtinah tiskanega vezja.


Krok 3. Vdelana programska oprema Arduino

Ko sta namestitev in preverjanje vezij končani, lahko začnete uvažati osnovni program (ali "firmware") v pomnilnik Arduino.


V ta namen je potrebno vzpostaviti uradno središče procesa brez mačk. Potrebovali boste tudi izhodno kodo za projekt, ki jo lahko prenesete spodaj v arhivu z vsemi knjižnicami in skico, če pa potrebujete samo skico, jo lahko kopirate takole:

//vključi knjižnice: #include "LedControl.h" #include // Knjižnica pisav #include // Ura DS1307 #include "RTClib.h" // Ura DS1307 #include // Knjižnica gumbov Alexander Brevig // Setup LED Matrix // pin 12 je povezan z DataIn med predvajanjem // pin 11 je povezan s CLK med predvajanjem // pin 10 je povezan z LOAD med predvajanjem LedControl lc = LedControl(6 , 5, 4, 4); //nastavi 3 zatiče kot 12, 11 & 10 in ti nastavi 4 zaslone (največ je 8 zaslonov) //globalne spremenljivke byte intensity = 7; // Privzeta intenzivnost/svetlost (0-15) byte clock_mode = 0; // Privzeti način ure. Privzeto = 0 (osnovni_način) bool random_mode = 0; // Določite naključni način - Spremenite ustvarjanje vrste vsakih nekaj ur. Privzeto = 0 (izklopljeno) byte old_mode = clock_mode; // Shrani prejšnji način ure, tako da, če gremo na datum ali karkoli drugega, vemo, na kateri način se vrniti pozneje. bool ampm = 0; // Določite 12- ali 24-urni čas. 0 = 24 let. 1 = 12-urni bajt change_mode_time = 0; // Zadrži uro, ko se bo način ure naslednjič spremenil, če je v naključnem načinu. dolga zakasnitev brez predznaka = 500; // Med posodobitvami prikaza vedno malo počakamo int rtc; // Vsebuje izhod ure realnega časa char days = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); // niz dni - izbori v načinih slide, basic_mode in jamble (DS1307 izda 1-7 dni na dan na teden) char daysfull = ("nedelja", "ponedeljek", "torek", "sreda", "četrtek", "petek", "sobota"); char pripona = ("st", "nd", "rd", "th"); //matrika datumskih pripon, izbori v diapozitivih, osnovnem_načinu in načinih mešanja. e, g, 1st 2nd ... //definiraj konstante #define NUM_DISPLAY_MODES 3 // Načini prikaza števil (z ničlo kot prvi način) #define NUM_SETTINGS_MODES 4 // Načini nastavitev številk = 6 (z ničlo kot prvi način) # definirajte SLIDE_DELAY 20 // Čas v milisekundah za učinek diapozitiva na znak v načinu diapozitiva. Naj bo to višje za počasnejši učinek #define cls clear_display // Počisti zaslon RTC_DS1307 ds1307; // Ustvari objekt RTC Button buttonA = Button(2, BUTTON_PULLUP); // Gumb za nastavitev A (z uporabo knjižnice gumbov) Button buttonB = Button(3, BUTTON_PULLUP); // Gumb za nastavitev B (uporabi knjižnico gumbov) void setup() ( digitalWrite(2, HIGH); // vklopi vlečni upor za gumb na nožici 2 digitalWrite(3, HIGH); // vklopi vlečni upor za gumb na pinu 3 digitalWrite(4, HIGH);// vklop povlečnega upora za gumb na nožici 4 Serial.begin(9600);LedControl int devices = lc.getDeviceCount();< devices; address++) { /*The MAX72XX is in power-saving mode on startup*/ lc.shutdown(3-address, false); /* Set the brightness to a medium values */ lc.setIntensity(3-address, intensity); /* and clear the display */ lc.clearDisplay(3-address); } //Setup DS1307 RTC #ifdef AVR Wire.begin(); #else Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino #endif ds1307.begin(); //start RTC Clock if (! ds1307.isrunning()) { Serial.println("RTC is NOT running!"); ds1307.adjust(DateTime(__DATE__, __TIME__)); // sets the RTC to the date & time this sketch was compiled } //Show software version & hello message printver(); //enable red led digitalWrite(13, HIGH); } void loop() { //run the clock with whatever mode is set by clock_mode - the default is set at top of code. switch (clock_mode){ case 0: basic_mode(); break; case 1: small_mode(); break; case 2: slide(); break; case 3: word_clock(); break; case 4: setup_menu(); break; } } //plot a point on the display void plot (byte x, byte y, byte val) { //select which matrix depending on the x coord byte address; if (x >= 0 && x<= 7) { address = 3; } if (x >= 8 && x<= 15) { address = 2; x = x - 8; } if (x >= 16 && x<= 23) { address = 1; x = x - 16; } if (x >= 24 && x<= 31) { address = 0; x = x - 24; } if (val == 1) { lc.setLed(address, y, x, true); } else { lc.setLed(address, y, x, false); } } //clear screen void clear_display() { for (byte address = 0; address < 4; address++) { lc.clearDisplay(address); } } //fade screen down void fade_down() { //fade from global intensity to 1 for (byte i = intensity; i >0; i--) (za (bajtni naslov = 0; naslov< 4; address++) { lc.setIntensity(address, i); } delay(30); //change this to change fade down speed } clear_display(); //clear display completely (off) //reset intentsity to global val for (byte address = 0; address < 4; address++) { lc.setIntensity(address, intensity); } } //power up led test & display software version number void printver() { byte i = 0; char ver_a = "MADE"; char ver_b = "IN"; char ver_c = "RUSSIA"; //test all leds. for (byte x = 0; x <= 32; x++) { for (byte y = 0; y <= 7; y++) { plot(x, y, 1); } } delay(300); fade_down(); while (ver_a[i]) { puttinychar((i * 4), 1, ver_a[i]); delay(35); i++; } delay(500); fade_down(); i = 0; while (ver_b[i]) { puttinychar((i * 4), 1, ver_b[i]); delay(35); i++; } delay(500); fade_down(); i = 0; while (ver_c[i]) { puttinychar((i * 4), 1, ver_c[i]); delay(35); i++; } delay(500); fade_down(); } // puttinychar // Copy a 3x5 character glyph from the myfont data structure to display memory, with its upper left at the given coordinate // This is unoptimized and simply uses plot() to draw each dot. void puttinychar(byte x, byte y, char c) { byte dots; if (c >= "A" && c<= "Z" || (c >= "a" && c<= "z")) { c &= 0x1F; // A-Z maps to 1-26 } else if (c >= "0" && c<= "9") { c = (c - "0") + 32; } else if (c == " ") { c = 0; // space } else if (c == ".") { c = 27; // full stop } else if (c == ":") { c = 28; // colon } else if (c == "\"") { c = 29; // single quote mark } else if (c == "!") { c = 30; // single quote mark } else if (c == "?") { c = 31; // single quote mark } for (byte col = 0; col < 3; col++) { dots = pgm_read_byte_near(&mytinyfont[c]); for (char row = 0; row < 5; row++) { if (dots & (16 >> vrstica)) izris (x + stolpec, y + vrstica, 1); else plot(x + col, y + row, 0); ) ) ) void putnormalchar(byte x, byte y, char c) (byte pike; // if (c >= "A" && c<= "Z" || (c >= "a" && c<= "z")) { // c &= 0x1F; // A-Z maps to 1-26 // } if (c >= "A" && c<= "Z") { c &= 0x1F; // A-Z maps to 1-26 } else if (c >= "a" && c<= "z") { c = (c - "a") + 41; // A-Z maps to 41-67 } else if (c >= "0" && c<= "9") { c = (c - "0") + 31; } else if (c == " ") { c = 0; // space } else if (c == ".") { c = 27; // full stop } else if (c == "\"") { c = 28; // single quote mark } else if (c == ":") { c = 29; // clock_mode selector arrow } else if (c == ">") ( c = 30; // puščica izbirnika clock_mode ) sicer če (c >= -80 && c<= -67) { c *= -1; } for (char col = 0; col < 5; col++) { dots = pgm_read_byte_near(&myfont[c]); for (char row = 0; row < 7; row++) { //check coords are on screen before trying to plot //if ((x >= 0) && (x<= 31) && (y >= 0) && (y<= 7)){ if (dots & (64 >> vrstica)) ( // samo 7 vrstic. izris (x + stolpec, y + vrstica, 1); ) else ( izris (x + stolpec, y + vrstica, 0); ) //) ) ) ) // / /prikaži čas v majhnih znakih 3x5 s prikazom sekund void small_mode() ( char textchar; // 16 znakov na zaslonu bajt mins = 100; //min bajt sek = rtc; // bajt sekund old_secs = sek; / / hrani staro vrednost sekund - sekunde posodobljene o prikaz - uporabite preverjanje, ali so se sekunde spremenile cls(); /preverjanje pritiska gumba if (buttonA.uniquePress()) ( switch_mode(); return; ) if (buttonB.uniquePress ()) ( display_date(); return; ) / rtc; if (secs != old_secs) ( //secs char buffer; itoa(secs, buffer, 10); //fix - drugače, če ima num začetno ničlo, npr. "03" secs, itoa to pokrije do znakov s presledkom "3". if (sek< 10) { buffer = buffer; buffer = "0"; } puttinychar(20, 1, ":"); //seconds colon puttinychar(24, 1, buffer); //seconds puttinychar(28, 1, buffer); //seconds old_secs = secs; } //if minute changes change time if (mins != rtc) { //reset these for comparison next time mins = rtc; byte hours = rtc; if (hours > < 1) { hours = hours + ampm * 12; } //byte dow = rtc; // the DS1307 outputs 0 - 6 where 0 = Sunday0 - 6 where 0 = Sunday. //byte date = rtc; //set characters char buffer; itoa(hours, buffer, 10); //fix - as otherwise if num has leading zero, e.g. "03" hours, itoa coverts this to chars with space "3 ". if (hours < 10) { buffer = buffer; //if we are in 12 hour mode blank the leading zero. if (ampm) { buffer = " "; } else { buffer = "0"; } } //set hours chars textchar = buffer; textchar = buffer; textchar = ":"; itoa (mins, buffer, 10); if (mins < 10) { buffer = buffer; buffer = "0"; } //set mins characters textchar = buffer; textchar = buffer; //do seconds textchar = ":"; buffer; secs = rtc; itoa(secs, buffer, 10); //fix - as otherwise if num has leading zero, e.g. "03" secs, itoa coverts this to chars with space "3 ". if (secs < 10) { buffer = buffer; buffer = "0"; } //set seconds textchar = buffer; textchar = buffer; byte x = 0; byte y = 0; //print each char for (byte x = 0; x < 6 ; x++) { puttinychar(x * 4, 1, textchar[x]); } } delay(50); } fade_down(); } // basic_mode() // show the time in 5x7 characters void basic_mode() { cls(); char buffer; //for int to char conversion to turn rtc values into chars we can print on screen byte offset = 0; //used to offset the x postition of the digits and centre the display when we are in 12 hour mode and the clock shows only 3 digits. e.g. 3:21 byte x, y; //used to draw a clear box over the left hand "1" of the display when we roll from 12:59 ->1:00 zjutraj v 12-urnem načinu. //izvedi pretvorbo 12/24 ur, če je ampm nastavljen na 1 bajt ur = rtc; če (ure > 12) ( ure = ure - ampm * 12; ) če (ure< 1) { hours = hours + ampm * 12; } //do offset conversion if (ampm && hours < 10) { offset = 2; } //set the next minute we show the date at //set_next_date(); // initially set mins to value 100 - so it wll never equal rtc on the first loop of the clock, meaning we draw the clock display when we enter the function byte secs = 100; byte mins = 100; int count = 0; //run clock main loop as long as run_mode returns true while (run_mode()) { //get the time from the clock chip get_time(); //check for button press if (buttonA.uniquePress()) { switch_mode(); return; } if (buttonB.uniquePress()) { display_date(); return; } //check whether it"s time to automatically display the date //check_show_date(); //draw the flashing: as on if the secs have changed. if (secs != rtc) { //update secs with new value secs = rtc; //draw: plot (15 - offset, 2, 1); //top point plot (15 - offset, 5, 1); //bottom point count = 400; } //if count has run out, turn off the: if (count == 0) { plot (15 - offset, 2, 0); //top point plot (15 - offset, 5, 0); //bottom point } else { count--; } //re draw the display if button pressed or if mins != rtc i.e. if the time has changed from what we had stored in mins, (also trigggered on first entering function when mins is 100) if (mins != rtc) { //update mins and hours with the new values mins = rtc; hours = rtc; //adjust hours of ampm set to 12 hour mode if (hours >12) (ure = ure - ampm * 12;) če (ure< 1) { hours = hours + ampm * 12; } itoa(hours, buffer, 10); //if hours < 10 the num e.g. "3" hours, itoa coverts this to chars with space "3 " which we dont want if (hours < 10) { buffer = buffer; buffer = "0"; } //print hours //if we in 12 hour mode and hours < 10, then don"t print the leading zero, and set the offset so we centre the display with 3 digits. if (ampm && hours < 10) { offset = 2; //if the time is 1:00am clear the entire display as the offset changes at this time and we need to blank out the old 12:59 if ((hours == 1 && mins == 0)) { cls(); } } else { //else no offset and print hours tens digit offset = 0; //if the time is 10:00am clear the entire display as the offset changes at this time and we need to blank out the old 9:59 if (hours == 10 && mins == 0) { cls(); } putnormalchar(1, 0, buffer); } //print hours ones digit putnormalchar(7 - offset, 0, buffer); //print mins //add leading zero if mins < 10 itoa (mins, buffer, 10); if (mins < 10) { buffer = buffer; buffer = "0"; } //print mins tens and ones digits putnormalchar(19 - offset, 0, buffer); putnormalchar(25 - offset, 0, buffer); } } fade_down(); } //like basic_mode but with slide effect void slide() { byte digits_old = {99, 99, 99, 99}; //old values we store time in. Set to somthing that will never match the time initially so all digits get drawn wnen the mode starts byte digits_new; //new digits time will slide to reveal byte digits_x_pos = {25, 19, 7, 1}; //x pos for which to draw each digit at char old_char; //used when we use itoa to transpose the current digit (type byte) into a char to pass to the animation function char new_char; //used when we use itoa to transpose the new digit (type byte) into a char to pass to the animation function //old_chars - stores the 5 day and date suffix chars on the display. e.g. "mon" and "st". We feed these into the slide animation as the current char when these chars are updated. //We sent them as A initially, which are used when the clocl enters the mode and no last chars are stored. //char old_chars = "AAAAA"; //plot the clock colon on the display cls(); putnormalchar(13, 0, ":"); byte old_secs = rtc; //store seconds in old_secs. We compare secs and old secs. WHen they are different we redraw the display //run clock main loop as long as run_mode returns true while (run_mode()) { get_time(); //check for button press if (buttonA.uniquePress()) { switch_mode(); return; } if (buttonB.uniquePress()) { display_date(); return; } //if secs have changed then update the display if (rtc != old_secs) { old_secs = rtc; //do 12/24 hour conversion if ampm set to 1 byte hours = rtc; if (hours >12) (ure = ure - ampm * 12;) če (ure< 1) { hours = hours + ampm * 12; } //split all date and time into individual digits - stick in digits_new array //rtc = secs //array pos and digit stored //digits_new = (rtc%10); //0 - secs ones //digits_new = ((rtc/10)%10); //1 - secs tens //rtc = mins digits_new = (rtc % 10); //2 - mins ones digits_new = ((rtc / 10) % 10); //3 - mins tens //rtc = hours digits_new = (hours % 10); //4 - hour ones digits_new = ((hours / 10) % 10); //5 - hour tens //rtc = date //digits_new = (rtc%10); //6 - date ones //digits_new = ((rtc/10)%10); //7 - date tens //draw initial screen of all chars. After this we just draw the changes. //compare digits 0 to 3 (mins and hours) for (byte i = 0; i <= 3; i++) { //see if digit has changed... if (digits_old[i] != digits_new[i]) { //run 9 step animation sequence for each in turn for (byte seq = 0; seq <= 8 ; seq++) { //convert digit to string itoa(digits_old[i], old_char, 10); itoa(digits_new[i], new_char, 10); //if set to 12 hour mode and we"re on digit 2 (hours tens mode) then check to see if this is a zero. If it is, blank it instead so we get 2.00pm not 02.00pm if (ampm && i == 3) { if (digits_new == 0) { new_char = " "; } if (digits_old == 0) { old_char = " "; } } //draw the animation frame for each digit slideanim(digits_x_pos[i], 0, seq, old_char, new_char); delay(SLIDE_DELAY); } } } /* //compare date digit 6 (ones) and (7) tens - if either of these change we need to update the date line. We compare date tens as say from Jan 31 ->01. februarja enice ne veljajo, če ((digits_old != digits_new) || (digits_old != digits_new)) ( //spremenite prikazani dan. Spodnja zanka poteka po vrsti skozi vsakega od 3 znakov, npr. " (byte day_char = 0;dan_znak<=2 ; day_char++){ //run the anim sequence for each char for (byte seq = 0; seq <=8 ; seq++){ //the day (0 - 6) Read this number into the days char array. the seconds number in the array 0-2 gets the 3 chars of the day name, e.g. m o n slideanim(6*day_char,8,seq,old_chars,days); //6 x day_char gives us the x pos for the char delay(SLIDE_DELAY); } //save the old day chars into the old_chars array at array pos 0-2. We use this next time we change the day and feed it to the animation as the current char. The updated char is fed in as the new char. old_chars = days; } //change the date tens digit (if needed) and ones digit. (the date ones digit wil alwaus change, but putting this in the "if" loop makes it a bit neater code wise.) for (byte i = 7; i >= 6; i--)( if (digits_old[i] != digits_new[i]) ( for (byte seq = 0; seq)<=8 ; seq++){ itoa(digits_old[i],old_char,10); itoa(digits_new[i],new_char,10); slideanim(digits_x_pos[i],8,seq,old_char,new_char); delay(SLIDE_DELAY); } } } //print the day suffix "nd" "rd" "th" etc. First work out date 2 letter suffix - eg st, nd, rd, th byte s = 3; //the pos to read our suffix array from. byte date = rtc; if(date == 1 || date == 21 || date == 31) { s = 0; } else if (date == 2 || date == 22) { s = 1; } else if (date == 3 || date == 23) { s = 2; } for (byte suffix_char = 0; suffix_char <=1 ; suffix_char++){ for (byte seq = 0; seq <=8 ; seq++){ slideanim((suffix_char*6)+36,8,seq,old_chars,suffix[s]); // we pass in the old_char array char as the current char and the suffix array as the new char delay(SLIDE_DELAY); } //save the suffic char in the old chars array at array pos 3 and 5. We use these chars next time we change the suffix and feed it to the animation as the current char. The updated char is fed in as the new char. old_chars = suffix[s]; } }//end do date line */ //save digita array tol old for comparison next loop for (byte i = 0; i <= 3; i++) { digits_old[i] = digits_new[i]; } }//secs/oldsecs }//while loop fade_down(); } //called by slide //this draws the animation of one char sliding on and the other sliding off. There are 8 steps in the animation, we call the function to draw one of the steps from 0-7 //inputs are are char x and y, animation frame sequence (0-7) and the current and new chars being drawn. void slideanim(byte x, byte y, byte sequence, char current_c, char new_c) { // To slide one char off and another on we need 9 steps or frames in sequence... // seq# 0123456 <-rows of the display // | ||||||| // seq0 0123456 START - all rows of the display 0-6 show the current characters rows 0-6 // seq1 012345 current char moves down one row on the display. We only see it"s rows 0-5. There are at display positions 1-6 There is a blank row inserted at the top // seq2 6 01234 current char moves down 2 rows. we now only see rows 0-4 at display rows 2-6 on the display. Row 1 of the display is blank. Row 0 shows row 6 of the new char // seq3 56 0123 // seq4 456 012 half old / half new char // seq5 3456 01 // seq6 23456 0 // seq7 123456 // seq8 0123456 END - all rows show the new char //from above we can see... //currentchar runs 0-6 then 0-5 then 0-4 all the way to 0. starting Y position increases by 1 row each time. //new char runs 6 then 5-6 then 4-6 then 3-6. starting Y position increases by 1 row each time. //if sequence number is below 7, we need to draw the current char if (sequence < 7) { byte dots; // if (current_c >= "A" && || (trenutni_c >= "a" && trenutni_c<= "z")) { // current_c &= 0x1F; // A-Z maps to 1-26 // } if (current_c >= "A" && trenutni_c<= "Z") { current_c &= 0x1F; // A-Z maps to 1-26 } else if (current_c >= "a" && trenutni_c<= "z") { current_c = (current_c - "a") + 41; // A-Z maps to 41-67 } else if (current_c >= "0" && trenutni_c<= "9") { current_c = (current_c - "0") + 31; } else if (current_c == " ") { current_c = 0; // space } else if (current_c == ".") { current_c = 27; // full stop } else if (current_c == "\"") { current_c = 28; // single quote mark } else if (current_c == ":") { current_c = 29; //colon } else if (current_c == ">") ( current_c = 30; // puščica izbirnika clock_mode ) bajt curr_char_row_max = 7 - zaporedje; //največje število vrstic za risanje je 6 - zaporedna številka bajt start_y = zaporedje; Vzemite ta preoblečni izris // izris je eden od večina zaporedij (delitev zaporedne številke) za (byte curr_char_row = 0; curr_char_row<= curr_char_row_max; curr_char_row++) { for (byte col = 0; col < 5; col++) { dots = pgm_read_byte_near(&myfont); if (dots & (64 >> curr_char_row)) plot (x + col, y + start_y, 1); //izris vodi na else plot(x + col, y + start_y, 0); //drugače izris se izklopi ) start_y++;//dodaj enega k y vam narišemo naslednjo vrstico enega navzdol ) ) //narišemo prazno vrstico med znaki, če je zaporedje med 1 in 7. Če tega ne storimo, dobimo ostanke preostalega položaja trenutnih znakov na zaslonu, če je (zaporedje >= 1 && zaporedje<= 8) { for (byte col = 0; col < 5; col++) { plot(x + col, y + (sequence - 1), 0); //the y position to draw the line is equivalent to the sequence number - 1 } } //if sequence is above 2, we also need to start drawing the new char if (sequence >= 2) ( //izdelaj char byte pike; //if (new_c >= "A" && new_c<= "Z" || (new_c >= "a" && novo_c<= "z")) { // new_c &= 0x1F; // A-Z maps to 1-26 //} if (new_c >= "A" && novo_c<= "Z") { new_c &= 0x1F; // A-Z maps to 1-26 } else if (new_c >= "a" && novo_c<= "z") { new_c = (new_c - "a") + 41; // A-Z maps to 41-67 } else if (new_c >= "0" && novo_c<= "9") { new_c = (new_c - "0") + 31; } else if (new_c == " ") { new_c = 0; // space } else if (new_c == ".") { new_c = 27; // full stop } else if (new_c == "\"") { new_c = 28; // single quote mark } else if (new_c == ":") { new_c = 29; // clock_mode selector arrow } else if (new_c == ">") ( new_c = 30; // puščica izbirnika clock_mode ) byte newcharrowmin = 6 - (zaporedje - 2); Pritisnite to minimalno vrstico na nov en char byte start_y = 0; ) do 6 za (byte newcharrow = newcharrowmin; newcarrow<= 6; newcharrow++) { for (byte col = 0; col < 5; col++) { dots = pgm_read_byte_near(&myfont); if (dots & (64 >> newcharrow)) plot (x + col, y + start_y, 1); //izris vodi na else plot(x + col, y + start_y, 0); //drugače se izris izklopi ) start_y ++; ", "dva", "tri", "štiri", "pet", "šest", "sedem", "osem", "devet", "deset", "enajst", "dvanajst", "trinajst", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"); //možno 3 vrstice za prikaz char str_a;char str_b;char str_c;//byte hours_y, mins_y; - ampm * 12; ) če (ure< 1) { hours = hours + ampm * 12; } get_time(); //get the time from the clock chip byte old_mins = 100; //store mins in old_mins. We compare mins and old mins & when they are different we redraw the display. Set this to 100 initially so display is drawn when mode starts. byte mins; //run clock main loop as long as run_mode returns true while (run_mode()) { //check for button press if (buttonA.uniquePress()) { switch_mode(); return; } if (buttonB.uniquePress()) { display_date(); } get_time(); //get the time from the clock chip mins = rtc; //get mins //if mins is different from old_mins - redraw display if (mins != old_mins) { //update old_mins with current mins value old_mins = mins; //reset these for comparison next time mins = rtc; hours = rtc; //make hours into 12 hour format if (hours >12) ( ure = ure - 12; ) if (ure == 0) ( ure = 12; ) //razdelitev minut je pomembna za dve števki int minsdigit = rtc % 10; bajt minsdigitten = (rtc / 10) % 10; //če min<= 10 , then top line has to read "minsdigti past" and bottom line reads hours if (mins < 10) { strcpy (str_a, numbers); strcpy (str_b, "PAST"); strcpy (str_c, numbers); } //if mins = 10, cant use minsdigit as above, so soecial case to print 10 past /n hour. if (mins == 10) { strcpy (str_a, numbers); strcpy (str_b, " PAST"); strcpy (str_c, numbers); } //if time is not on the hour - i.e. both mins digits are not zero, //then make first line read "hours" and 2 & 3rd lines read "minstens" "mins" e.g. "three /n twenty /n one" else if (minsdigitten != 0 && minsdigit != 0) { strcpy (str_a, numbers); //if mins is in the teens, use teens from the numbers array for the 2nd line, e.g. "fifteen" //if (mins >= 11 && min<= 19) { if (mins <= 19) { strcpy (str_b, numbers); } else { strcpy (str_b, numberstens); strcpy (str_c, numbers); } } // if mins digit is zero, don"t print it. read read "hours" "minstens" e.g. "three /n twenty" else if (minsdigitten != 0 && minsdigit == 0) { strcpy (str_a, numbers); strcpy (str_b, numberstens); strcpy (str_c, ""); } //if both mins are zero, i.e. it is on the hour, the top line reads "hours" and bottom line reads "o"clock" else if (minsdigitten == 0 && minsdigit == 0) { strcpy (str_a, numbers); strcpy (str_b, "O"CLOCK"); strcpy (str_c, ""); } }//end worknig out time //run in a loop //print line a "twelve" byte len = 0; while (str_a) { len++; }; //get length of message byte offset_top = (31 - ((len - 1) * 4)) / 2; // //plot hours line byte i = 0; while (str_a[i]) { puttinychar((i * 4) + offset_top, 1, str_a[i]); i++; } //hold display but check for button presses int counter = 1000; while (counter >0)( //preverjanje pritiska na gumb if (buttonA.uniquePress()) ( switch_mode(); return; ) if (buttonB.uniquePress()) ( display_date(); ) delay(1); counter--; ) fade_down (); //izpis vrstice b len = 0; medtem ko (str_b) (len++;); //pridobi dolžino sporočila offset_top = (31 - ((len - 1) * 4)) / 2; i = 0; medtem ko (str_b[i]) ( puttinychar((i * 4) + offset_top, 1, str_b[i]); i++; ) //zadrži prikaz, vendar preveri števec pritiskov gumbov = 1000; while (counter > 0)( if (buttonA.uniquePress()) ( switch_mode(); return; ) if (buttonB.uniquePress()) ( display_date(); ) delay(1); counter--; ) fade_down() ; //natisni vrstico c, če obstaja. len = 0; medtem ko (str_c) (len++;); //pridobi dolžino sporočila offset_top = (31 - ((len - 1) * 4)) / 2; i = 0; medtem ko (str_c[i]) ( puttinychar((i * 4) + offset_top, 1, str_c[i]); i++; ) števec = 1000; medtem ko (števec > 0)( //preveri pritisk gumba if (buttonA.uniquePress()) ( switch_mode(); return; ) if (buttonB.uniquePress()) ( display_date(); ) delay(1); counter- -;) fade_down(); //zaslon naj bo prazen, vendar pred ponovnim zagonom preverite pritiske gumbov. števec = 1000; medtem ko (števec > 0)( //preveri pritisk gumba if (buttonA.uniquePress()) ( switch_mode(); return; ) if (buttonB.uniquePress()) ( display_date(); ) delay(1); counter- -; ) ) fade_down(); ) /// pomikanje sporočila - trenutno ni v uporabi - prepočasi. void scroll() ( char message = ("Hello There"); cls(); byte p = 6; //trenutni položaj v nizu byte chara = (0, 1, 2, 3, 4, 5); //chars vid niz int x = (0, 6, 12, 18, 24, 30); // xpos za vsak bajt znakov y = 0; 0") (/ / nariši vseh 6 znakov za (bajt c = 0; c< 6; c++) { putnormalchar(x[c],y,message[ chara[c] ]); //draw a line of pixels turned off after each char,otherwise the gaps between the chars have pixels left in them from the previous char for (byte yy = 0 ; yy < 8; yy ++) { plot(x[c] + 5, yy, 0); } //take one off each chars position x[c] = x[c] - 1; } //reset a char if it"s gone off screen for (byte i = 0; i <= 5; i++) { if (x[i] < -5) { x[i] = 31; chara[i] = p; p++; } } } } //display_date - print the day of week, date and month with a flashing cursor effect void display_date() { cls(); //read the date from the DS1307 byte dow = rtc; // day of week 0 = Sunday byte date = rtc; byte month = rtc - 1; //array of month names to print on the display. Some are shortened as we only have 8 characters across to play with char monthnames = { "January", "February", "March", "April", "May", "June", "July", "August", "Sept", "October", "November", "December" }; //print the day name //get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset byte len = 0; while(daysfull) { len++; }; byte offset = (31 - ((len-1)*4)) / 2; //our offset to centre up the text //print the name int i = 0; while(daysfull[i]) { puttinychar((i*4) + offset , 1, daysfull[i]); i++; } delay(1000); fade_down(); cls(); // print date numerals char buffer; itoa(date,buffer,10); offset = 10; //offset to centre text if 3 chars - e.g. 3rd // first work out date 2 letter suffix - eg st, nd, rd, th etc // char suffix={"st", "nd", "rd", "th" }; is defined at top of code byte s = 3; if(date == 1 || date == 21 || date == 31) { s = 0; } else if (date == 2 || date == 22) { s = 1; } else if (date == 3 || date == 23) { s = 2; } //print the 1st date number puttinychar(0+offset, 1, buffer); //if date is under 10 - then we only have 1 digit so set positions of sufix etc one character nearer byte suffixposx = 4; //if date over 9 then print second number and set xpos of suffix to be 1 char further away if (date >9)( suffixposx = 8; puttinychar(4+offset, 1, buffer); offset = 8; //offset to the center text if 4 chars ) //izpiši 2 znaka pripone puttinychar(suffixposx+offset, 1, suffix[s) ]); puttinychar(priponaposx+4+odmik, 1, pripona[s]); zamuda (1000); fade_down(); //natisnite ime meseca //dobite dolžino besedila v slikovnih pikah, tako da ga lahko centriramo na zaslonu, razdelimo na preostale slikovne pike b2 in vikorystoyushchy, da je odmik len ​​= 0; medtem ko (imena mesecev) ( len++; ); odmik = (31 - ((len-1) * 4)) / 2; //naš odmik do sredine besedila i = 0; medtem ko(imena mesecev[i]) ( puttinychar((i*4) +odmik, 1, imena mesecev[i]); i++; ) zamuda(1000); fade_down(); ) //prikaži meni za spreminjanje načina obletnice void switch_mode() ( //zapomni si način, v katerem smo. To vrednost uporabimo, če gremo v način nastavitev, tako da se lahko vrnemo iz načina nastavitev (6) v kateri koli način, v katerem smo bili old_mode = clock_mode; char* modes = ("Basic", "Small", "Slide", "Words", "Setup"); byte next_clock_mode; byte firstrun = 1; zanke za vrnitev v način X) for (int count = 0; štetje< 35 ; count++) { //if user hits button, change the clock_mode if (buttonA.uniquePress() || firstrun == 1) { count = 0; cls(); if (firstrun == 0) { clock_mode++; } if (clock_mode >NUM_DISPLAY_MODES + 1) ( clock_mode = 0; ) //natisni puščico in ime trenutnega clock_mode v prvi vrstici in natisni naslednje ime clock_mode v drugi vrstici char str_top; //strcpy (str_top, "-"); strcpy(str_top, načini); naslednji_način_ure = način_ure + 1; if (next_clock_mode > NUM_DISPLAY_MODES + 1) ( next_clock_mode = 0; ) byte i = 0; medtem ko (str_top[i]) ( putnormalchar(i * 6, 0, str_top[i]); i++; ) firstrun = 0; ) Zakasnitev (50); ) ) //zaženi glavno zanko ure, dokler run_mode vrne pravi bajt run_mode() ( //če je vklopljen naključni način ... čas = ure. potem vrni false = tj. izhod iz načina. if (change_mode_time == rtc) /else return 1 - še naprej teči v tem načinu return 1; ) //nastavite naslednjo uro, ura bo spremenila način, ko je vklopljen naključni način void set_next_random() 1 - 4 leta get_time(); spremeni_mode_čas = rtc + naključno (1, 5); , 4); ) //nastavi clock_mode = random(0, NUM_DISPLAY_MODES + 1); "Rndom", "24 ur", "Set", "Brght", "Exit"); if (ampm == 0) (set_modes = ("12 ur"); ) byte setting_mode = 0; bajt naslednji_nastavitveni način; prvi zagon bajta = 1; //zanka čaka na gumb (časovna omejitev po 35 zankah za vrnitev v način X) for(int count=0; count< 35 ; count++) { //if user hits button, change the clock_mode if(buttonA.uniquePress() || firstrun == 1){ count = 0; cls(); if (firstrun == 0) { setting_mode++; } if (setting_mode >NUM_SETTINGS_MODES) ( setting_mode = 0; ) //natisni puščico in ime trenutnega clock_mode v prvi vrstici in natisni naslednje ime clock_mode v drugi vrstici char str_top; strcpy(str_top, set_modes); naslednji_način_nastavitve = način_nastavitve + 1; if (next_setting_mode > NUM_SETTINGS_MODES) ( next_setting_mode = 0; ) byte i = 0; while(str_top[i]) ( putnormalchar(i*6, 0, str_top[i]); i++; ) firstrun = 0; ) Zakasnitev (50); ) //izberite stikalo načina(setting_mode)( case 0: set_random(); break; case 1: set_ampm(); break; case 2: set_time(); break; case 3: set_intensity(); break; case 4: // izhod iz preloma menija; ) //preklop naključnega načina - slikajte drug način ure vsakih nekaj ur set_random())( cls(); char text_a = "Off"; char text_b = "On"; byte i = 0; / / če je naključni način vklopljen, ga izklopi if (random_mode)( //izklopi naključni način random_mode = 0; //natisni sporočilo na zaslonu while(text_a[i]) ( i++; ) ) else ( //izklopi naključni način on . random_mode = 1; //nastavitev urnega načina bo spremenila set_next_random(); //natisnite sporočilo na zaslonu while(text_b[i]) ( putnormalchar((i* 6), 0, text_b[i]); i++ ; ) ) delay(1500); ali 24 let v načinu - obrnite bit (največ 0 na 1 ali 1 na 0 za način ampm) ampm = (ampm ^ 1), cls(); byte i = 0; char text = "Bright"; buttonA.uniquePress()) ( levelbar (0.6,(intensity*2)+2.2); //prikaži raven intenzivnosti kot vrstico medtem ko (buttonB.isPressed()) ( if(intensity = = 15) ( intenzivnost = 0; cls (); ) else ( intenzivnost++; ) //izpis nove vrednosti i = 0; while(besedilo[i]) ( puttinychar((i*4)+4, 0, besedilo[i]); i++; ) //prikaži stopnjo intenzivnosti kot vrstico ravni vrstice (0,6,(intenzivnost*2)+ 2.2);< 4; address++) { lc.setIntensity(address, intensity); } delay(150); } } } // display a horizontal bar on the screen at offset xposr by ypos with height and width of xbar, ybar void levelbar (byte xpos, byte ypos, byte xbar, byte ybar) { for (byte x = 0; x < xbar; x++) { for (byte y = 0; y <= ybar; y++) { plot(x+xpos, y+ypos, 1); } } } //set time and date routine void set_time() { cls(); //fill settings with current clock values read from clock get_time(); byte set_min = rtc; byte set_hr = rtc; byte set_date = rtc; byte set_mnth = rtc; int set_yr = rtc; //Set function - we pass in: which "set" message to show at top, current value, reset value, and rollover limit. set_date = set_value(2, set_date, 1, 31); set_mnth = set_value(3, set_mnth, 1, 12); set_yr = set_value(4, set_yr, 2013, 2099); set_hr = set_value(1, set_hr, 0, 23); set_min = set_value(0, set_min, 0, 59); ds1307.adjust(DateTime(set_yr, set_mnth, set_date, set_hr, set_min)); cls(); } //used to set min, hr, date, month, year values. pass //message = which "set" message to print, //current value = current value of property we are setting //reset_value = what to reset value to if to rolls over. E.g. mins roll from 60 to 0, months from 12 to 1 //rollover limit = when value rolls over int set_value(byte message, int current_value, int reset_value, int rollover_limit){ cls(); char messages = { "Set Mins", "Set Hour", "Set Day", "Set Mnth", "Set Year"}; //Print "set xyz" top line byte i = 0; while(messages[i]) { puttinychar(i*4 , 1, messages[i]); i++; } delay(2000); cls(); //print digits bottom line char buffer = " "; itoa(current_value,buffer,10); puttinychar(0 , 1, buffer); puttinychar(4 , 1, buffer); puttinychar(8 , 1, buffer); puttinychar(12, 1, buffer); delay(300); //wait for button input while (!buttonA.uniquePress()) { while (buttonB.isPressed()){ if(current_value < rollover_limit) { current_value++; } else { current_value = reset_value; } //print the new value itoa(current_value, buffer ,10); puttinychar(0 , 1, buffer); puttinychar(4 , 1, buffer); puttinychar(8 , 1, buffer); puttinychar(12, 1, buffer); delay(150); } } return current_value; } void get_time() { //get time DateTime now = ds1307.now(); //save time to array rtc = now.year(); rtc = now.month(); rtc = now.day(); rtc = now.dayOfWeek(); //returns 0-6 where 0 = Sunday rtc = now.hour(); rtc = now.minute(); rtc = now.second(); //flash arduino led on pin 13 every second //if ((rtc % 2) == 0) { // digitalWrite(13, HIGH); //} //else { // digitalWrite(13, LOW); //} //print the time to the serial port - useful for debuging RTC issues /* Serial.print(rtc); Serial.print(":"); Serial.print(rtc); Serial.print(":"); Serial.println(rtc); */ }

Zdaj, da dokončate delo na napravi, morate opraviti več preprostih operacij:


Prevajanje programske kode in njeno shranjevanje v pomnilnik mikrokontrolerja bo trajalo približno eno uro, torej največ eno uro. Uspešen zaključek operacije bo obveščen na konzoli Arduino IDE. Po tem morate samo znova vklopiti Arduino za dodatnim gumbom Reset na napravi - preprost enoletnik na LED matricah je pripravljen!

Pripravljen letnik na Arduinu

Nastavitev letopisa poteka z dvema gumboma. Naprava podpira 12- in 24-letni zapis ur, prikaz datuma in dneva v letu, prikaz ure s sekundami ali brez. Možno je tudi spremeniti svetlost LED.


Seveda boste v prihodnosti želeli dodati več funkcij (na primer termometer) ali namestiti napravo v plastično ohišje - dobre rezultate lahko dosežete z uporabo dodatne izdelave na strojih za lasersko rezanje. Zdaj lahko ponosno rečete, da ste z lastnimi rokami zbrali dragoceno elektronsko obletnico!

Ste si zaslužili kipec? Deli s prijatelji!