Obsah:

Arduino 3-v-1 zobrazenie času a počasia: 11 krokov
Arduino 3-v-1 zobrazenie času a počasia: 11 krokov

Video: Arduino 3-v-1 zobrazenie času a počasia: 11 krokov

Video: Arduino 3-v-1 zobrazenie času a počasia: 11 krokov
Video: CS50 2015 - Week 8, continued 2024, November
Anonim

Od Boomer48 Nasledovať viac od autora:

Použitie ATtiny85
Použitie ATtiny85
Použitie ATtiny85
Použitie ATtiny85
Nástroj na delenie koláčov a nástroj na prerezávanie polygónov Pi
Nástroj na delenie koláčov a nástroj na prerezávanie polygónov Pi
Nástroj na delenie koláčov a nástroj na prerezávanie polygónov Pi
Nástroj na delenie koláčov a nástroj na prerezávanie polygónov Pi
Digitálne ovládače pre manuálny zvukový zosilňovač
Digitálne ovládače pre manuálny zvukový zosilňovač
Digitálne ovládače pre manuálny zvukový zosilňovač
Digitálne ovládače pre manuálny zvukový zosilňovač

Mám rád mikrokontroléry PIC a rád programujem v montážnom jazyku. V skutočnosti som za posledných pár rokov na svojom webe zverejnil asi 40 projektov založených na tejto kombinácii. Nedávno som objednával niektoré diely od jedného z mojich obľúbených amerických predajcov a našiel som Arduino Nano s programovacím káblom, len za 1,20 dolára viac ako holý procesorový čip ATMEGA328. Tak som ich pár kúpil. Potom som si stiahol Arduino IDE a oprášil som si pamäť na programovanie „C ++“.

Tento projekt je kombináciou hodín, ktoré na meranie času používajú GPS, a RF prijímača, ktorý dekóduje správy o počasí zo spoločného senzora AcuRite. Výsledkom je zobrazenie času a teploty v malom rozsahu. Hodiny GPS a rutiny počasia sú nastavené ako samostatné súbory zahrnutia, takže je ľahké prejsť do hlavnej rutiny a nakonfigurovať ju tak, aby plnila iba funkciu hodín alebo iba funkciu počasia. Ak chcete iba jednu z funkcií, stačí odkomentovať príslušné „#define“v hornej časti hlavnej rutiny.

Ak sú použité obe funkcie, potom horný riadok LCD displeja zobrazuje miestny čas a dolný riadok LCD zobrazuje vlhkosť a teplotu v stupňoch Celzia a Fahrenheita. Ak sa používa iba funkcia hodín, horný riadok zobrazuje miestny čas a dolný riadok zobrazuje UTC. Ak sa používa iba funkcia počasia, horný riadok zobrazuje prvý prijatý snímač a dolný riadok zobrazuje akýkoľvek ďalší prijatý snímač. Túto možnosť som pridal, pretože mám dva snímače počasia.

Krok 1: Senzor počasia

Senzor počasia
Senzor počasia
Senzor počasia
Senzor počasia
Senzor počasia
Senzor počasia

Tu použitý senzor počasia AcuRite odosiela informácie o teplote a vlhkosti každých 16 sekúnd. Na zadnej strane je uvedené číslo modelu 000592TXR, ale spravidla je inzerovaný ako model 06002M. Tento senzor používa mnoho rôznych modelov meteorologických staníc, takže je ľahké ho nájsť a podarilo sa mi ich získať na eBay za menej ako 20 dolárov. AcuRite predáva podobne vyzerajúce snímače pre niektoré zo svojich meteorologických staníc, ale môžu, ale nemusia, dodržiavať rovnaký komunikačný protokol. Na webe je nejaký náznak, že snímač iba teploty 00606 používa rovnaký formát správy, ale s neplatným bajtom vlhkosti.

Ako je zrejmé z prvého tvaru vlny uvedeného vyššie, správy o počasí sa odosielajú v dávkach s odstupom 2 ms medzi nasledujúcimi správami. Druhý priebeh vlny zobrazený vyššie rozširuje časť jednej správy, aby sa zobrazili trvania bitov a vzory. Existujú štyri synchronizačné bity, ktoré sú vysoké približne 600us, a potom 600us nízke. Dátové bity sú reprezentované 400us vysokou, nasledovanou 200us nízkou (1) alebo 200us vysokou a nasledovanou 400us nízkou (0).

Formát správy pozostáva zo 7 bajtov údajov. Prvé dva bajty sú ID senzora a tieto sa nemenia (t. J. Nepoužíva pohyblivý kód). Posledný bajt je jednoduchý aditívny kontrolný súčet prvých šiestich bajtov. Tretí bajt je indikátor stavu batérie a v prípade dobrej batérie by mal byť vždy 44 hex. Štvrtý bajt je vlhkosť a je to nezmenšená hodnota medzi 0 a 99. Je dôležité mať na pamäti, že najdôležitejší bit bajtov 4, 5 a 6 je paritný bit a nie je súčasťou merania. hodnoty. Bajty 5 a 6 sú škálovaná teplota (Celzia), pričom spodné 4 bity bajtu 5 sú zreťazené so spodnými 7 bitmi bajtu 6, aby vytvorili 11-bitovú hodnotu. Teplota je vždy vyjadrená ako kladné číslo a záporná sa stáva iba vtedy, keď sa použije škálovanie. Mierka je (C / 10) - 100. Delenie 10 je potrebné, pretože teplotné rozlíšenie je v desatinách stupňa. Odčítanie je potrebné, pretože snímač sčíta 100, aby bola prenášaná hodnota kladná.

Krok 2: RF prijímač

RF prijímač
RF prijímač
RF prijímač
RF prijímač

RF modul, ktorý pre tento projekt používam, je RXB6. Je to super heterodynový prijímač, na rozdiel od menej žiaducich super regeneratívnych prijímačov. Keď sa pozriete na lacné RF moduly, zistíte, že dosky vysielača a prijímača sú často spojené dohromady. Väčšina týchto zväzkových prijímačov je super regeneratívnych typov, takže majú zvyčajne oveľa nižšie výkonové charakteristiky (vrátane dosahu) ako superheterodynové prijímače. Na tento projekt potrebujeme iba modul prijímača, pretože budeme dostávať signály z vysielača senzora počasia.

Krok 3: RF antény

RF antény
RF antény

RXB6 nie je dodávaný s anténou. Niektoré špirálové si môžete kúpiť veľmi lacno, ale je tiež ľahké si vyrobiť vlastnú anténu. Ak nechcete byť príliš vychytaní, v skutočnosti by sa prepojovací kábel na chlieb mohol navliecť na kolík antény modulu. V ideálnom prípade by mala drôtová anténa 1/4 vlnovej dĺžky, ktorá dosahuje asi 6,8 palca. Pôvodne som urobil prepojku a nemal som problém zdvihnúť vonkajší senzor, aj keď je moja dielňa elektroniky v suteréne.

Ďalšou možnosťou je vyrobiť si vlastnú skrutkovitú anténu. Na webe je na to množstvo plánov, ale urobil som ten, ktorý je znázornený na obrázku vyššie. Použil som drôt s plným jadrom zo zvyšku kusu ethernetového kábla a navinul som ho okolo hladkého drieku 5/32 palcového vrtáka. Nechajte izoláciu zapnutú, okrem hrotu, ktorý sa spájkuje s doskou RF. Budete potrebovať 20 otáčok. Môžete tiež použiť 7/32 palcový vrták a zabaliť 17 závitov. Ktorýkoľvek z nich bude pravdepodobne fungovať dobre pre rozsahy, ktoré pravdepodobne budete mať pre svoje senzory. Skutočným kľúčom je mať na začiatku dobrý RF prijímač. Senzory AcuRite majú tiež dosť silné vysielače.

Krok 4: RF komunikačný protokol

Existuje niekoľko rôznych modulačných techník na prenos údajov, ale tieto senzory používajú najjednoduchšie, čo je OOK (zapínanie-vypínanie) alebo ASK (amplitúdovo-posunové-kľúčovanie). Pretože v tomto prípade pracujeme s 0/1 dátovými bitmi, amplitúda je zapnutá alebo vypnutá. Takže pre naše účely sú OOK a ASK rovnaké, pretože OOK znamená, že nosič RF je buď zapnutý alebo vypnutý. Formát správy je všeobecne definovaný výrobcom prenosového zariadenia a môžu používať takmer akúkoľvek prenosovú rýchlosť, akýkoľvek štýl bitového formátovania a akúkoľvek dĺžku správy. Pásmo 433 MHz je plné prenosov napríklad pre inteligentné merače atď., Preto je potrebné softvér vyladiť tak, aby filtroval iba formát správ, ktorý chceme použiť.

Krok 5: Časové údaje

Časové údaje
Časové údaje

Na získanie presných časových údajov, ktoré sa automaticky reštartujú po výpadku napájania, používam lacnú jednotku GPS. Mám niekoľko jednotiek GPS (bez displejov), ktoré vydávajú štandardné vety NMEA, ale najmenšia a najlacnejšia z jednotiek, ktoré mám, sú NEO-6M. Modul NEO-6M je ľahko prepojiteľný s Arduino, pretože používa sériový port na úrovni TTL. Jediným skutočným rozdielom je, že štandard NMEA určuje sériovú prenosovú rýchlosť 4800, ale NEO-6M má predvolenú hodnotu 9600 baudov. Na zmenu prenosovej rýchlosti môžete spustiť bezplatný program „u-center“, ale ponechal som ho na predvolenom nastavení od výroby. K dispozícii je tiež bezplatný obslužný program GPSInfo (nainštalovaný spoločnosťou Globalsat), ktorý je veľmi užitočný na prezeranie informácií GPS na počítači. Jednotku GPS môžete pripojiť k štandardnému káblu USB na TTL a skontrolovať ju alebo nastaviť pomocou počítača. Majte na pamäti, že GPS čip na module v skutočnosti beží na 3,3 voltov (prostredníctvom integrovaného regulátora napätia), takže ak sa chcete pripojiť k jeho portu RXD, mali by ste posunúť úroveň nižšie z 5 voltov. Port TXD sa môže pripojiť priamo k Arduinu alebo k počítaču.

Krok 6: Časové zóny

Zobrazenie času GPS je jednoduchá vec, pokiaľ chcete zobrazovať iba čas UTC (Universal Time Coordinated). Vety NMEA sa skladajú zo znakov ASCII, ktoré je možné priamo odosielať na LCD displej. Časová časť je vo formáte HHMMSS. FF (hodiny, minúty, sekundy a zlomkové sekundy). Pre naše hodiny nie je zlomková časť užitočná, takže sa musíme zaoberať iba šiestimi znakmi. Problém je v tom, že potom musíte previesť na svoj miestny čas a na 12-hodinový formát AM/PM, ak to chcete. Niekedy sú však problémy tým, čo robí život zaujímavým, a práve o to v tejto časti softvéru vlastne ide.

Pokiaľ ide o časové pásma, mohli by ste si myslieť, že by ich bolo jednoducho 24, pričom 12 z nich by bolo východne od polohy UTC (+ zóny) a 12 z nich západne od polohy UTC (- zóny). V skutočnosti existuje niekoľko podivných, ktoré sú zlomkovými hodinami, a pár, ktorý presahuje 12 -hodinový „limit“. Ak náhodou žijete v jednej z týchto oblastí, ospravedlňujem sa, pretože môj softvér predstavuje iba 24 celých hodinových zón. Niektorí z nás tiež používajú časť letného času, ale v softvéri sa to automaticky neúčtuje. To by vyžadovalo vyhľadávaciu tabuľku budúcich dátumov, extra zložitosť softvéru a potrebu aktualizovať softvér, ak sa zmenia týždne v roku na prechod. Hardvér namiesto toho používa momentový kontaktný spínač, ktorý umožňuje jednoduché nastavenie časového pásma (offset UTC).

Krok 7: Schéma

Schematický
Schematický

Schéma je zobrazená vyššie a obsahuje pripojenia pre 4-bitové rozhranie 1602 LCD. Sériové údaje z RF prijímača sú na úrovni digitálnej logiky, takže sú pripojené priamo k jednému zo vstupných pinov Arduino. Kolík je v softvéri nakonfigurovaný tak, aby vykonával funkciu prerušenia pri zmene, aby sme mohli merať šírky impulzov. Výstup GPS TXD je priamo pripojený k vstupu Arduino RX.

Používajú sa dva prepínače. Ako bolo uvedené vyššie, momentový kontaktný spínač umožňuje nastavenie offsetu UTC. Spínač je možné kedykoľvek stlačiť a vstúpiť do nastaveného režimu. Na začiatku bude displej zobrazovať neplatný offset UTC „+77“. Pokyny na nastavenie offsetu UTC nájdete v časti „Softvér hodín“.

Druhý vypínač je jednoduchý vypínač. V polohe „vypnuté“sa čas zobrazí v 12-hodinovom formáte (AM/PM) a v polohe „zapnuté“sa čas zobrazí v 24-hodinovom formáte. Tento prepínač je možné kedykoľvek zmeniť na prepínanie medzi formátmi.

Ak je požadovaná iba funkcia hodín, potom modul RF prijímača nemusí byť pripojený. Ak je požadovaná iba funkcia počasia, GPS a dva prepínače nemusia byť prepojené.

Krok 8: Softvér LCD

Väčšinou používam jeden z dvoch typov rozhraní LCD. Jedno je štandardné 4-bitové rozhranie a druhé je 3-vodičové rozhranie, ktoré používa posuvný register. Toto rozhranie som navrhol, keď som pracoval s malými mikrokontrolérmi PIC, ktoré mali obmedzený počet I/O pinov. Na tento projekt som použil 4-bitové rozhranie, ale namiesto použitia všeobecnej knižnice LCD Arduino mám vlastný súbor zahrnutia LCD. To znižuje spotrebu pamäte a zložitosť kódu a tiež mi umožňuje vyladiť kód pre konkrétne projekty, ako je tento.

Krok 9: Hodinový softvér

Jednotka GPS vysiela štandardné vety NMEA-0183, ktoré sú reťazcami ASCII, ktoré obsahujú množstvo informácií. Pre túto aplikáciu som si vybral vetu GGA na získanie časových informácií, pretože to je veta, ktorú som použil pre predchádzajúci projekt GPS. Polia informácií vo vetách NMEA sú oddelené čiarkami, takže potom, čo je detegovaná hlavička vety GGA, softvér by normálne počítal čiarky a vyvolal príslušnú rutinu pre každé požadované pole informácií GPS. Tu sú potrebné iba časové informácie, a to v poli za prvou čiarkou, takže nie je potrebné počítať.

Šesť časových cifier (HHMMSS) sa uloží do vyrovnávacej pamäte a potom sa spracujú po prijatí všetkých. GPS môže na začiatku odosielať niektoré neúplné správy, takže rutina ukladania do vyrovnávacej pamäte overí, či je každý znak číselnou hodnotou ASCII. Ak je prijatý zlý znak, správa sa zahodí. To sa môže stať aj výnimočne pri normálnej prevádzke, najmä ak komunikácia so sériovým portom trochu poklesne. Videl som to iba raz a stalo sa len to, že čas sa na sekundu zastavil a potom preskočil dve sekundy namiesto jednej.

Ak je softvér nakonfigurovaný tak, aby zobrazoval iba čas, prvý riadok LCD displeja zobrazí miestny čas a druhý riadok UTC. V prípade UTC softvér iba odosiela znaky ASCII priamo do zobrazovacej rutiny, pričom sú vhodne vložené dvojbodky (:).

Aby bolo možné previesť UTC na miestny čas, musí byť použitý offset UTC (časové pásmo). Pretože je čas UTC z GPS vo formáte ASCII, softvér prevádza znaky hodiny ASCII na desatinné miesta a potom pridá posun UTC. Ofset UTC je uložený ako kladná hodnota BCD so znamienkovým bitom, takže je najskôr prevedený na celočíselnú hodnotu a potom je negovaný, ak je nastavený znakový bit. Hneď ako sa vypočíta hodnota miestneho času, použije sa vyhľadávacia tabuľka na jej prevod na BCD a potom sa BCD prevedie späť na zobrazenie vo formáte ASCII. Vyhľadávacia tabuľka musí zvládnuť 24-hodinový formát UTC a +/- 12 časových pásiem. Aby sa to dosiahlo, časy UTC od 0000 do 2300 zaberajú stredných 24 záznamov v tabuľke s 12 záznammi pred a 12 záznamov po, aby sa zohľadnili časové pásma. Jedna tabuľka je v 12-hodinovom formáte, takže som pridal aj vyhľadávaciu tabuľku pre časť displeja AM/PM. Druhá tabuľka je v 24-hodinovom formáte. Ako už bolo spomenuté, vypínač on/off umožňuje výber 12-hodinového alebo 24-hodinového formátu.

Časové pásmo je počas inicializácie načítané z EEPROM a krátko zobrazené. Ak to nebolo nastavené aspoň raz, zavolá sa rutina nastavenia. Rutinu nastavenia je tiež možné kedykoľvek vyvolať stlačením spínača okamžitých kontaktov. Rutina nastavenia inicializuje zobrazenie na „UTC OFFSET +77“. Krátkym stlačením spínača zmeníte hodnotu na „-00“. Ak je požadované kladné časové pásmo, ďalším krátkym stlačením sa hodnota zmení na „+00“. Dlhým stlačením (> 1 sekundu) sa režim nastavenia presunie na ďalší krok. V tomto mieste každé krátke stlačenie zvýši časovú hodnotu až na maximum 12. Po dosiahnutí požadovaného časového pásma stlačte a podržte spínač na viac ako 1 sekundu a potom ho uvoľnite. Softvér potom uloží hodnotu UTC do EEPROM a nakrátko zobrazí „OFFSET SAVED“. Ak sa pri vstupe pomýlite, ukončite ho a potom znova stlačte vypínač, aby ste ho resetovali.

NEO-6M nevyžaduje na zaistenie času dobrú fixáciu polohy, takže by mal odosielať správy hneď, ako získa jeden satelit. Do tej doby bude displej zobrazovať „ŽIADNE ÚDAJE“.

Krok 10: Software pre počasie

Mikrokontrolér PIC má schopnosť zapnúť/vypnúť časovač pomocou externého impulzu. Ten istý vstupný impulz môže byť tiež použitý ako externé prerušenie na signalizáciu čítania trvania impulzu. Arduino nemá túto presnú schopnosť, takže som použil funkciu prerušenia pri zmene. Obslužný program prerušenia uloží na jeden okraj impulzu správy RF aktuálny mikrosekundový čas. Na opačnom okraji sa vypočíta uplynulý čas, aby sa určila šírka impulzu.

Tento softvér má definíciu „DEBUG“, ktorá umožňuje zobrazenie formátu surových dát prijatých správ. Existuje tiež definícia na zadanie vstupného kolíka Arduino pre sériový tok z RF prijímača. Softvér je nastavený tak, aby na základe tejto definície vypočítal príslušné nastavenia registra prerušenia pri zmene. Výpočet funguje iba pre digitálne piny Arduino. Namiesto toho by sa mohol použiť analógový kolík, ale to by vyžadovalo tvrdé kódovanie hodnôt registra.

Obsluha prerušenia určí, či je zachytený počet dostatočne dlhý na to, aby bol štartovacím impulzom. Ako už bolo spomenuté, medzera medzi viacerými správami je 2 ms, takže to softvér hľadá. Vzhľadom na všetku prevádzku 433 MHz, počiatočné preverovanie v softvéri zaisťuje, aby nameraný čas bol najmenej 1,8 ms, ale nie väčší ako 2,4 ms. Po zistení začiatku softvér vyhľadá synchronizačné bity (600us) a spočíta, aby sa ubezpečil, že sú prijaté štyri z nich. Po úspešnom absolvovaní týchto testov softvér vyhľadá správne bitové časy 200us a 400us.

Prijaté bity sa sformujú do bajtov a každý bajt sa uloží. Po prijatí siedmich bajtov sa kontrolný súčet správy overí, než sa povolí ďalšie spracovanie. Ak majú byť na výstupe nespracované bajty (režim ladenia), potom sú bajty prevedené na znaky ASCII a odoslané na LCD. Ak sú požadované výstupy vlhkosti a teploty, vykonajú sa príslušné prevody.

Dva bajty údajov o stupňoch Celzia v správe RF sa spoja a vytvoria 11-bitovú hodnotu. Spodná časť je posunutá o jeden bit doľava, aby sa eliminoval paritný bit a zarovnal sa s bitmi v hornej časti. Dva bajty sú sformované do 16-bitovej premennej slova a potom je celá vec posunutá o jeden bit doprava, aby sa dosiahlo konečné zarovnanie bitov. Slovná premenná sa potom pri matematických výpočtoch prevedie na premennú s pohyblivou rádovou čiarkou.

Jednou z veľkých výhod použitia jazyka C ++ v jazyku Arduino oproti jazyku zostavy na PIC je, že zjednodušuje matematické výpočty. Ako už bolo spomenuté, konverzia na stupne Celsia je (C / 10) -100. Výsledok sa prevedie na reťazec a odošle sa na LCD displej. Výpočet Fahrenheita je (C * 1,8) + 32. Výsledok sa znova prevedie na reťazec a odošle na LCD displej. V oboch prípadoch reťazcový prevod obsahuje záporné znamienko (ak je to vhodné) a desatinnú čiarku. Vykoná sa kontrola desatinnej čiarky, aby sa zabezpečilo, že na displej bude odoslaný iba jeden znak za desatinnou čiarkou. Táto kontrola je potrebná, pretože reťazec môže mať dĺžku 3 až 5 znakov.

Mám dva snímače AcuRite, takže som pridal kontrolu softvéru, aby som zaistil, že údaje pre jeden neprepíšu údaje pre druhé, ak je softvér nastavený tak, aby vykonával iba funkciu počasia. Prvý snímač prijatý po zapnutí sa zobrazí na riadku 1 a druhý na riadku 2. Použitím režimu ladenia vidím, aké je ID pre každý snímač, takže môžem v kóde vykonať jednoduchú kontrolu, ak chcel spracovať údaje od jedného z nich.

Softvér monitoruje stav batérie (byte3) a v prípade vybitej batérie zobrazí správu. Táto správa prepíše všetky ostatné údaje pre tento senzor.

Krok 11: Displeje

Displeje
Displeje
Displeje
Displeje
Displeje
Displeje

Tu je niekoľko príkladov zobrazení pre rôzne funkcie. Mám niekoľko ďalších pokynov, ale väčšinu svojich projektov s mikrokontrolérmi PIC nájdete na mojej webovej stránke: www.boomerrules.wordpress.com

Odporúča: