Kazalo:
- Korak: Vremenski senzor
- 2. korak: RF sprejemnik
- Korak: RF antene
- 4. korak: RF komunikacijski protokol
- 5. korak: Podatki o času
- 6. korak: časovni pasovi
- 7. korak: Shema
- 8. korak: programska oprema LCD
- 9. korak: programska oprema za uro
- 10. korak: Vremenska programska oprema
- 11. korak: Zasloni
Video: Arduino prikaz časa in vremena 3 v 1: 11 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:05
Avtor Boomer48Sledite Več avtorja:
Všeč so mi mikrokrmilniki PIC in programiranje v zbirnem jeziku. Pravzaprav sem v zadnjih nekaj letih na svoji spletni strani objavil približno 40 projektov na podlagi te kombinacije. Pred kratkim sem naročil nekaj delov pri enem izmed mojih najljubših prodajalcev v ZDA in opazil sem Arduino Nano s programskim kablom za samo 1,20 USD več kot goli procesorski čip ATMEGA328. Zato sem jih kupil nekaj. Nato sem prenesel Arduino IDE in si izpraznil spomin na programiranje »C ++«.
Ta projekt je sestavljen iz ure, ki uporablja GPS za merjenje časa, in RF sprejemnika, ki dekodira vremenska sporočila iz običajnega senzorja AcuRite. Rezultat je kratek čas in prikaz temperature. Ura GPS in vremenska rutina sta nastavljeni kot ločeni datoteki za vključitev, zato je enostavno vstopiti v glavno rutino in jo konfigurirati tako, da deluje samo z uro ali samo z vremensko funkcijo. Če želite le eno od funkcij, razkomentirajte ustrezen »#define« na vrhu glavne rutine.
Če uporabljate obe funkciji, potem zgornja vrstica LCD -ja prikazuje lokalni čas, spodnja vrstica LCD -ja pa vlažnost in temperaturo v Celzijah in Fahrenheitu. Če uporabljate samo uro, potem zgornja vrstica prikazuje lokalni čas, spodnja pa UTC. Če uporabljate samo vremensko funkcijo, potem zgornja vrstica prikazuje prvi prejeti senzor, spodnja vrstica pa vse druge sprejete senzorje. To sposobnost sem dodal, ker imam dva vremenska senzorja.
Korak: Vremenski senzor
Tukaj uporabljeni vremenski senzor AcuRite pošilja podatke o temperaturi in vlažnosti vsakih 16 sekund. Na hrbtni strani prikazuje številko modela 000592TXR, vendar se običajno oglašuje kot model 06002M. Ta senzor uporablja veliko različnih modelov vremenskih postaj, zato ga je enostavno najti, zato sem ga lahko dobil na eBayu za manj kot 20 USD. AcuRite prodaja senzorje podobnega videza za nekatere svoje vremenske postaje, vendar se lahko držijo istega komunikacijskega protokola ali pa tudi ne. Na spletu je nekaj znakov, da temperaturni senzor 00606 uporablja isti format sporočila, vendar z neveljavnim bajtom vlažnosti.
Kot je razvidno iz prve valovne oblike, prikazane zgoraj, se vremenska sporočila pošiljajo v zaporedju z razmikom med zaporednimi sporočili 2 ms. Zgoraj prikazana druga valovna oblika razširi del enega sporočila, da si ogleda trajanje bitov in vzorce. Obstajajo štirje sinhronizacijski bitovi, ki so visoki približno 600us, sledi pa 600us nizki. Podatkovni bitovi so predstavljeni z višino 400us, sledi 200us nizko (1) ali 200us visoko, sledi 400us nizko (0).
Oblika sporočila je sestavljena iz 7 bajtov podatkov. Prva dva bajta sta ID senzorja in se ne spreminjata (tj. Ne uporablja tekoče kode). Zadnji bajt je preprosta aditivna kontrolna vsota prvih šestih bajtov. Tretji bajt je indikator napolnjenosti baterije in mora biti vedno 44 šestnajstiški, če je baterija dobra. Četrti bajt je vlažnost in je vrednost, ki ni skalirana med 0 in 99. Pomembno je upoštevati, da je najpomembnejši bit bajtov 4, 5 in 6 parni bit in ni del meritve. vrednote. Bajta 5 in 6 sta skalirana temperatura (Celzija), pri čemer so spodnji 4 biti bajta 5 združeni z spodnjih 7 bitov bajta 6, da tvorijo 11-bitno vrednost. Temperatura je vedno predstavljena kot pozitivno število in postane negativna šele, ko se uporabi skaliranje. Lestvica je (C / 10) - 100. Delitev z 10 je potrebna, ker je temperaturna ločljivost v desetinkah stopinje. Odštevanje je potrebno, ker senzor doda 100, da ohrani pozitivno vrednost oddane vrednosti.
2. korak: RF sprejemnik
RF modul, ki ga uporabljam za ta projekt, je RXB6. Je super heterodinski sprejemnik v nasprotju z manj zaželenimi super regenerativnimi sprejemniki. Če pogledate poceni RF module, boste ugotovili, da so oddajniške in sprejemne plošče pogosto povezane skupaj. Večina teh združenih sprejemnikov je super regenerativnih, zato imajo ponavadi veliko nižje lastnosti (vključno z dosegom) kot super heterodinski sprejemniki. Za ta projekt potrebujemo le sprejemniški modul, ker bomo prejemali signale od oddajnika vremenskega senzorja.
Korak: RF antene
RXB6 ni opremljen z anteno. Nekatere vijačne lahko kupite precej poceni, vendar je tudi enostavno narediti lastno anteno. Pravzaprav bi lahko kabel mostička za ploščo zdrsnil na antenski zatič modula, če se ne želite preveč domisliti. V idealnem primeru bi bila antena z ravno žico 1/4 valovne dolžine, kar doseže približno 6,8 palca. Sprva sem naredil skakalno žico in nisem imel težav pobrati zunanjega senzorja, čeprav je moja delavnica elektronike v moji kleti.
Druga možnost je, da sami izdelate spiralno anteno. Na spletu so za to različni načrti, toda tisti, ki je prikazan na zgornji sliki, sem naredil jaz. Uporabil sem nekaj trdne žice iz odpadnega kosa Ethernetnega kabla in jo navijal okoli gladkega stebla 5/32 -palčnega svedra. Izolacijo pustite vklopljeno, razen konice, ki je spajkana na RF ploščo. Potrebovali boste 20 zavojev. Uporabite lahko tudi 7/32 -palčni sveder in namesto tega zavijte 17 zavojev. Vsak od teh bo verjetno dobro deloval za območja, ki jih verjetno imate za svoje senzorje. Pravi ključ je imeti dober RF sprejemnik za začetek. Senzorji AcuRite imajo tudi precej močne oddajnike.
4. korak: RF komunikacijski protokol
Obstaja nekaj različnih modulacijskih tehnik za prenos podatkov, vendar ti senzorji uporabljajo najpreprostejšo, ki je OOK (tipka za vklop-izklop) ali ASK (amplituda-premik-tipkanje). Ker imamo v tem primeru obravnavo 0/1 podatkovnih bitov, je amplituda vklopljena ali polna. Torej sta za naše namene OOK in ASK enaki, ker OOK pomeni, da je RF -nosilec poln ali popolnoma izklopljen. Obliko sporočila na splošno določi proizvajalec oddajne naprave in lahko uporabijo skoraj vsako hitrost prenosa, kateri koli slog oblikovanja bitov in poljubno dolžino sporočila. Pas 433-MHz je poln prenosov za stvari, kot so pametni števci itd., Zato je treba programsko opremo nastaviti tako, da filtrira samo tisto obliko sporočila, ki jo želimo uporabiti.
5. korak: Podatki o času
Uporabljam poceni GPS enoto, da dobim natančne časovne podatke, ki se bodo samodejno znova zagnali po izpadu električne energije. Imam več enot GPS (brez prikazovalnikov), ki oddajajo standardne stavke NMEA, vendar je najmanjša in najcenejša enota, ki jo imam, NEO-6M. Modul NEO-6M je enostaven za vmesnik z Arduinom, ker uporablja serijska vrata na ravni TTL. Edina resnična razlika je v tem, da standard NMEA določa serijsko hitrost prenosa 4800, vendar je pri NEO-6M privzeto 9600 baudov. Če želite spremeniti hitrost prenosa, lahko zaženete brezplačen program "u-center", vendar sem ga pustil pri tovarniško privzetih nastavitvah. Obstaja tudi brezplačen pripomoček, imenovan GPSInfo (ki ga izdaja Globalsat), ki je zelo priročen za ogled informacij GPS v računalniku. Enoto GPS lahko priključite na standardni kabel USB -TTL, da jo preverite ali nastavite z osebnim računalnikom. Upoštevajte, da čip GPS na modulu dejansko deluje pri 3,3 volta (prek vgrajenega regulatorja napetosti), zato, če se želite povezati z njegovimi vrati RXD, morate raven premakniti navzdol s 5 voltov. Vrata TXD se lahko povežejo neposredno z Arduinom ali računalnikom.
6. korak: časovni pasovi
Prikaz časa GPS je enostaven, če želite prikazati le UTC (univerzalno časovno usklajeno). Stavki NMEA so sestavljeni iz znakov ASCII, ki jih je mogoče neposredno oddati na LCD. Časovni del je v formatu HHMMSS. FF (ure, minute, sekunde in delne sekunde). Za našo uro delni del ni uporaben, zato se moramo ukvarjati le s šestimi znaki. Težava je v tem, da se morate nato pretvoriti v lokalni čas in v 12-urno obliko AM/PM, če želite. Včasih pa so težave tisto, zaradi česar je življenje zanimivo, zato je v resnici tisti del programske opreme.
Kar zadeva časovne pasove, bi si lahko mislili, da bi jih bilo preprosto 24, od tega 12 vzhodno od lokacije UTC (+ cone) in 12 zahodno od lokacije UTC (- cone). Pravzaprav obstaja nekaj nenavadnih, ki so delne ure, in par, ki presegajo 12 -urno "omejitev". Če slučajno živite na enem od teh področij, se opravičujem, ker moja programska oprema upošteva le 24 -urne pasove. Nekateri med nami uporabljamo poletni čas tudi v delu leta, vendar se to programsko ne upošteva samodejno. To bi zahtevalo iskalno tabelo prihodnjih datumov, dodatno zapletenost programske opreme in potrebo po posodobitvi programske opreme, če bi se tedni v letu za prehod spremenili. Namesto tega strojna oprema uporablja stikalo za trenutni stik, ki omogoča enostavno nastavitev časovnega pasu (UTC odmik).
7. korak: Shema
Shema je prikazana zgoraj in vključuje povezave za 4-bitni vmesnik LCD 1602. Serijski podatki iz RF sprejemnika so na ravni digitalne logike, zato so neposredno povezani z enim od vhodnih zatičev podatkov Arduino. Pin je v programski opremi konfiguriran za izvajanje funkcije prekinitve pri spremembi, tako da lahko merimo širine impulzov. Izhod GPS TXD je neposredno povezan z vhodom Arduino RX.
Uporabljata se dve stikali. Kot smo že omenili, kratko stikalo za stik omogoča nastavitev zamika UTC. Stikalo lahko kadar koli pritisnete za vstop v nastavljeni način. Sprva bo na prikazovalniku prikazan neveljaven zamik UTC "+77". Navodila za nastavitev zamika UTC najdete v razdelku »Programska oprema za uro«.
Drugo stikalo je preprosto stikalo za vklop/izklop. V položaju »izklopljeno« bo čas prikazan v 12-urnem formatu (AM/PM), v položaju »vklopljeno« pa bo čas prikazan v 24-urnem formatu. To stikalo lahko kadar koli spremenite za preklapljanje med oblikami.
Če želite samo funkcijo ure, modula RF sprejemnika ni treba priključiti. Če želite samo vremensko funkcijo, GPS in obe stikali ni treba povezati.
8. korak: programska oprema LCD
Običajno uporabljam eno od dveh vrst vmesnikov LCD. Eden je standardni 4-bitni vmesnik, drugi pa 3-žični vmesnik, ki uporablja premični register. Ta vmesnik sem zasnoval, ko sem delal z majhnimi mikrokontrolerji PIC, ki so imeli omejeno število V/I zatičev. Za ta projekt sem uporabil 4-bitni vmesnik, vendar imam svojo datoteko za vključitev LCD-ja, namesto da bi uporabil generično knjižnico Arduino LCD. To zmanjšuje porabo pomnilnika in zapletenost kode, poleg tega pa mi omogoča prilagajanje kode za posebne projekte, kot je ta.
9. korak: programska oprema za uro
Enota GPS oddaja standardne stavke NMEA-0183, ki so nizovi ASCII, ki vsebujejo različne informacije. Za to aplikacijo sem izbral stavek GGA, da bi dobil informacije o času, ker je to stavek, ki sem ga uporabil za prejšnji projekt GPS. Podatkovna polja v stavkih NMEA so ločena z vejicami, zato bi programska oprema po zaznavi glave stavka GGA običajno štela vejice in poklicala ustrezno rutino za vsako želeno polje informacij GPS. Tu so potrebni le podatki o času, ki so v polju po prvi vejici, zato štetje ni potrebno.
Šest časovnih številk (HHMMSS) so medpomnjene in nato obdelane, potem ko so vse prejete. GPS lahko že zgodaj pošlje nekaj nepopolnih sporočil, zato varovalna rutina preveri, ali je vsak znak številka ASCII. Če je prejet slab znak, se sporočilo zavrže. To se lahko zgodi tudi v redkih primerih med normalnim delovanjem, še posebej, če komunikacija prek serijskih vrat nekoliko pade. To sem videl samo enkrat in zgodilo se je le to, da je čas za trenutek prekinil in nato namesto ene skočil dve sekundi.
Če je programska oprema konfigurirana samo za prikaz časa, bo prva vrstica LCD prikazala lokalni čas, druga vrstica pa UTC. Za UTC programska oprema samo pošlje znake ASCII neposredno v rutino prikaza, z dvopičjem (:) ustrezno vstavljenim.
Za pretvorbo UTC v lokalni čas je treba uporabiti zamik UTC (časovni pas). Ker je UTC -čas iz GPS -a v formatu ASCII, programska oprema pretvori znake ure ASCII v decimalko in nato doda zamik UTC. Odmik UTC je shranjen kot pozitivna vrednost BCD z znakovnim bitom, zato se najprej pretvori v celoštevilčno vrednost in nato zanika, če je nastavljen znakovni bit. Ko se izračuna lokalna časovna ura, se uporabi iskalna tabela za pretvorbo v BCD, nato pa se BCD pretvori nazaj v ASCII za prikaz. Iskalna tabela mora obravnavati 24-urni format UTC in +/- 12 časovnih pasov. Če želite to narediti, čas UTC od 0000 do 2300 zaseda srednjih 24 vnosov v tabeli z 12 vnosi pred in 12 vnosi po tem, da upoštevajo časovne pasove. Ena miza je v 12-urnem formatu, zato sem dodal tudi iskalno tabelo za AM/PM del zaslona. Druga tabela je v 24-urnem formatu. Kot smo že omenili, stikalo za vklop/izklop omogoča izbiro 12-urnega ali 24-urnega formata.
Časovni pas se med inicializacijo pridobi iz EEPROM -a in na kratko prikaže. Če ni bil nastavljen vsaj enkrat, se pokliče nastavitvena rutina. Nastavitveno rutino lahko kadar koli prikličete tudi s pritiskom na stikalo za trenutni stik. Nastavitvena rutina bo inicializirala prikaz na "UTC OFFSET +77". S kratkim pritiskom na stikalo se vrednost spremeni v "-00". Če je potreben pozitiven časovni pas, bo naslednji kratek pritisk spremenil vrednost v "+00". Dolg pritisk (> 1 sekunda) premakne način nastavitve na naslednji korak. Na tej točki bo vsak kratek pritisk povečal časovno vrednost do največ 12. Ko dosežete želeni časovni pas, pritisnite in držite stikalo za več kot 1 sekundo in ga nato spustite. Programska oprema bo nato shranila vrednost UTC v EEPROM in na kratko prikazala “OFFSET SAVED”. Če med vnosom naredite napako, preprosto zapustite in nato znova pritisnite stikalo, da ga ponastavite.
NEO-6M ne potrebuje dobrega popravka položaja za prikaz časa, zato mora oddajati sporočila takoj, ko dobi en satelit. Do takrat se na zaslonu izpiše “NO DATA”.
10. korak: Vremenska programska oprema
Mikrokrmilnik PIC ima možnost vklopa/izklopa časovnika z uporabo zunanjega impulza. Isti vhodni impulz se lahko uporablja tudi kot zunanji prekinitev za signalizacijo branja trajanja impulza. Arduino nima tako natančnih zmožnosti, zato sem uporabil funkcijo prekinitve pri spremembi. Na enem robu impulza RF sporočila se z upravljalnikom prekinitev shrani trenutni mikrosekundni čas. Na nasprotnem robu se izračuna pretečeni čas za določitev širine impulza.
Programska oprema ima definicijo »DEBUG«, ki omogoča prikaz formata neobdelanih podatkov prejetih sporočil. Obstaja tudi definicija, ki določa vhodni pin Arduino za serijski tok iz RF sprejemnika. Programska oprema je nastavljena za izračun ustreznih nastavitev registra prekinitev ob spremembah na podlagi te definicije. Izračun deluje samo za digitalne zatiče Arduino. Namesto tega bi lahko uporabili analogni pin, vendar bi to zahtevalo trdo kodiranje vrednosti registra.
Upravljavec prekinitev ugotovi, ali je zajeto število dovolj dolgo, da je zagonski impulz. Kot smo že omenili, je razlika med več sporočili 2 ms, zato programska oprema išče to. Zaradi vsega 433-MHz prometa začetni pregled v programski opremi zagotavlja, da je izmerjeni čas najmanj 1,8 ms, vendar ne več kot 2,4 ms. Po zaznavi zagona programska oprema poišče bite za sinhronizacijo (600us) in šteje, da se prepriča, da so sprejeti štirje od njih. Ko so ti testi opravljeni, programska oprema išče ustrezne bitne čase 200us in 400us.
Prejeti bitovi se oblikujejo v bajte in vsak bajt se shrani. Ko je prejetih sedem bajtov, se kontrolna vsota sporočila preveri, preden je dovoljena nadaljnja obdelava. Če želite izpisati surove bajte (način odpravljanja napak), se bajti pretvorijo v znake ASCII in pošljejo na LCD. Če želite izhod vlažnosti in temperature, se izvedejo ustrezne pretvorbe.
Dva bajta podatkov o stopinjah Celzija v RF sporočilu se združita skupaj, da tvorita 11-bitno vrednost. Spodnji del se pomakne za en bit v levo, da se odpravi bit paritete in se poravna z bitmi v zgornjem delu. Dva bajta se oblikujeta v 16-bitno besedno spremenljivko, nato pa se celotna stvar premakne za en bit, da dobimo končno poravnavo bitov. Besedna spremenljivka se nato za matematične izračune pretvori v spremenljivko s plavajočo vejico.
Ena velika prednost uporabe C ++ v Arduinu v primerjavi z montažnim jezikom na PIC je, da poenostavlja matematične izračune. Kot smo že omenili, je pretvorba v stopinjah Celzija (C / 10) -100. Rezultat se pretvori v niz in pošlje na LCD -zaslon za prikaz. Fahrenheitov izračun je (C * 1,8) + 32. Rezultat se spet pretvori v niz in pošlje na LCD -zaslon za prikaz. V obeh primerih pretvorba niza vključuje negativni znak (če je primerno) in decimalno vejico. Za decimalno vejico se preveri, da se na zaslon pošlje le en znak za decimalno vejico. To preverjanje je potrebno, ker lahko niz obsega od 3 do 5 znakov.
Imam dva senzorja AcuRite, zato sem v programsko opremo dodal preverjanje, da se podatki za enega ne prepišejo za drugega, če je programska oprema nastavljena samo na vremensko funkcijo. Prvi senzor, prejet po vklopu, se prikaže v vrstici 1, drugi pa v vrstici 2. Z načinom za odpravljanje napak lahko vidim, kakšen je ID za vsak senzor, tako da lahko preprosto preverim kodo, če le želel obdelati podatke enega od njih.
Programska oprema spremlja stanje baterije (byte3) in prikaže sporočilo, če kaže na nizko raven baterije. To sporočilo prepiše vse druge podatke za ta senzor.
11. korak: Zasloni
Tu je nekaj primerov prikaza za različne funkcije. Imam še nekaj drugih navodil, vendar je večina mojih projektov mikrokrmilnikov PIC na moji spletni strani: www.boomerrules.wordpress.com
Priporočena:
Enostaven prikaz vremena z uporabo Raspberry PI in Cyntech WeatherHAT: 4 koraki
Enostaven prikaz vremena z uporabo Raspberry PI in Cyntech WeatherHAT: * Yahoo je leta 2019 spremenil svoj API in to je prenehalo delovati. Nisem se zavedal spremembe. Septembra 2020 je bil ta projekt posodobljen za uporabo API -ja OPENWEATHERMAP Glejte posodobljeni razdelek spodaj, ostali podatki so še vedno dobri
Spletni pripomoček za prikaz vremena z uporabo ESP8266: 4 koraki
Spletni pripomoček za prikaz vremena z uporabo ESP8266: Pred nekaj tedni smo se naučili, kako zgraditi spletni sistem za prikaz vremena, ki je pridobival vremenske informacije za določeno mesto in jih prikazoval na modulu OLED. Za ta projekt smo uporabili ploščo Arduino Nano 33 IoT, ki je nova
Internetna ura: Prikaz datuma in časa z OLED -om z uporabo ESP8266 NodeMCU s protokolom NTP: 6 korakov
Internetna ura: Prikaz datuma in časa z OLED -om z uporabo ESP8266 NodeMCU s protokolom NTP: Pozdravljeni, fantje, v tem navodilu bomo zgradili internetno uro, ki bo dobila čas iz interneta, zato ta projekt ne potrebuje nobenega RTC -ja, za izvedbo bo potreben le delujoča internetna povezava In za ta projekt potrebujete esp8266, ki bo imel
Prikaz vlaka in vremena v Združenem kraljestvu: 5 korakov
Prikaz vlaka in vremena v Združenem kraljestvu: Ta navodila so namenjena odhodom vlakov v Združenem kraljestvu z baterijskim napajanjem in prikazu vremena. Z zbirko podatkov National Rail OpenLDBWS je v realnem času dobil informacije o odhodu vlaka za določeno lokalno železniško postajo in jih prikazal. Uporablja odprto vreme
Kako narediti mini prikaz stanja vremena: 4 koraki
Kako narediti mini prikaz stanja vremena: O projektu Mikrokontroler je lahko zabaven in hkrati zabaven, dodajte nekaj internetne povezave za pravi internet stvari! Dovolite mi, da vam pokažem, kako mi je uspelo ustvariti mini prikaz stanja vremena z matričnim zaslonom 8x8 in