Obsah:

Arduino 3-v-1 Zobrazení času a počasí: 11 kroků
Arduino 3-v-1 Zobrazení času a počasí: 11 kroků

Video: Arduino 3-v-1 Zobrazení času a počasí: 11 kroků

Video: Arduino 3-v-1 Zobrazení času a počasí: 11 kroků
Video: Control 10 output pins or relay using 10 push button switch with 1 Arduino input pin ANPB-V2 2024, Listopad
Anonim

Od Boomer48Sledovat více od autora:

Pomocí ATtiny85
Pomocí ATtiny85
Pomocí ATtiny85
Pomocí ATtiny85
Pi Powered Pie Partitioning and Polygon Pruning Tool
Pi Powered Pie Partitioning and Polygon Pruning Tool
Pi Powered Pie Partitioning and Polygon Pruning Tool
Pi Powered Pie Partitioning and Polygon Pruning Tool
Digitální ovládání pro manuální audio zesilovač
Digitální ovládání pro manuální audio zesilovač
Digitální ovládání pro manuální audio zesilovač
Digitální ovládání pro manuální audio zesilovač

Mám rád mikrokontroléry PIC a rád programuji v assembleru. Ve skutečnosti jsem za posledních pár let zveřejnil na svém webu asi 40 projektů založených na této kombinaci. Nedávno jsem objednával některé díly od jednoho z mých oblíbených amerických prodejců a spatřil jsem Arduino Nano s programovacím kabelem za pouhých 1,20 $ více než holý procesorový čip ATMEGA328. Tak jsem jich pár koupil. Pak jsem si stáhl Arduino IDE a oprášil jsem si paměť na programování ‘C ++’.

Tento projekt je spojením hodin využívajících GPS pro časování a RF přijímače, který dekóduje zprávy o počasí ze společného snímače AcuRite. Výsledkem je zobrazení času a teploty v malém měřítku. Hodiny GPS a rutiny počasí jsou nastaveny jako samostatné soubory pro zahrnutí, takže je snadné přejít do hlavní rutiny a nakonfigurovat ji tak, aby plnila pouze funkci hodin nebo pouze funkci počasí. Pokud chcete pouze jednu z funkcí, stačí odkomentovat příslušné „#define“v horní části hlavní rutiny.

Pokud jsou použity obě funkce, pak horní řádek LCD zobrazuje místní čas a spodní řádek LCD zobrazuje vlhkost a teplotu ve stupních Celsia i Fahrenheita. Pokud je použita pouze funkce hodin, pak horní řádek zobrazuje místní čas a spodní řádek zobrazuje UTC. Pokud je použita pouze funkce počasí, horní řádek zobrazí první přijatý snímač a spodní řádek zobrazí jakýkoli jiný přijatý snímač. Tuto možnost jsem přidal, protože mám dva senzory počasí.

Krok 1: Senzor počasí

Senzor počasí
Senzor počasí
Senzor počasí
Senzor počasí
Senzor počasí
Senzor počasí

Zde použitý senzor počasí AcuRite odesílá informace o teplotě a vlhkosti každých 16 sekund. Na zadní straně je uvedeno číslo modelu 000592TXR, ale obvykle je inzerován jako model 06002M. Tento senzor používá mnoho různých modelů meteorologických stanic, takže je snadné jej najít a podařilo se mi je získat na eBay za méně než 20 dolarů. AcuRite prodává podobně vypadající senzory pro některé z jejich meteorologických stanic, ale mohou nebo nemusí dodržovat stejný komunikační protokol. Na webu existuje určitá indikace, že snímač pouze teploty 00606 používá stejný formát zprávy, ale s neplatným bajtem vlhkosti.

Jak je vidět na první křivce zobrazené výše, zprávy o počasí jsou rozesílány v dávkách s odstupem 2 ms mezi po sobě následujícími zprávami. Druhá křivka ukázaná výše rozšiřuje část jedné zprávy, aby viděla trvání bitů a vzory. Existují čtyři synchronizační bity, které jsou vysoké přibližně 600us a následně 600us nízké. Datové bity jsou reprezentovány 400us high, následovaný 200us low (1) nebo 200us high následovaný 400us low (0).

Formát zprávy se skládá ze 7 bajtů dat. První dva bajty jsou ID senzoru a ty se nemění (tj. Nepoužívá pohyblivý kód). Poslední bajt je jednoduchý aditivní kontrolní součet prvních šesti bajtů. Třetí bajt je indikátor stavu baterie a měl by být vždy 44 hex, pokud je baterie dobrá. Čtvrtý bajt je vlhkost a je to nezměněná hodnota mezi 0 a 99. Je důležité mít na paměti, že nejvýznamnější bit bytů 4, 5 a 6 je paritní bit a není součástí měření hodnoty. Bajty 5 a 6 jsou škálovaná teplota (Celsia), přičemž spodní 4 bity bajtu 5 jsou spojeny se spodními 7 bity bajtu 6 za vzniku 11bitové hodnoty. Teplota je vždy znázorněna jako kladné číslo a záporná se stává pouze při použití škálování. Měřítko je (C / 10) - 100. Dělení 10 je nutné, protože teplotní rozlišení je v desetinách stupně. Odečtení je nutné, protože čidlo přidá 100, aby byla přenášená hodnota kladná.

Krok 2: RF přijímač

RF přijímač
RF přijímač
RF přijímač
RF přijímač

RF modul, který pro tento projekt používám, je RXB6. Je to super heterodynový přijímač na rozdíl od méně žádaných super regeneračních přijímačů. Když se podíváte na levné RF moduly, zjistíte, že desky vysílače a přijímače jsou často spojeny dohromady. Většina těchto sdružených přijímačů je super regenerativních typů, takže mívají mnohem nižší výkonové charakteristiky (včetně dosahu) než superheterodynové přijímače. Pro tento projekt potřebujeme pouze modul přijímače, protože budeme přijímat signály z vysílače snímače počasí.

Krok 3: RF antény

RF antény
RF antény

RXB6 není dodáván s anténou. Některé šroubovicové můžete koupit docela levně, ale je také snadné vytvořit si vlastní anténu. Ve skutečnosti by se propojovací kabel propojovací lišty mohl navléknout na kolík antény modulu, pokud si nepřejete být příliš fantazijní. V ideálním případě by měla přímá drátová anténa 1/4 vlnovou délku, která dosahuje asi 6,8 palce. Zpočátku jsem udělal propojovací drát a neměl jsem problém zvednout vnější senzor, i když je moje elektronická dílna v suterénu.

Další možností je vyrobit si vlastní šroubovicovou anténu. Na webu je k tomu celá řada plánů, ale vytvořil jsem ten, který je zobrazen na obrázku výše. Použil jsem drát z plného jádra ze zbytku ethernetového kabelu a namotal ho na hladkou stopku vrtáku 5/32 palce. Nechejte izolaci zapnutou, s výjimkou špičky, která se pájí k desce RF. Budete potřebovat 20 otáček. Můžete také použít vrták 7/32 palce a místo toho zabalit 17 otáček. Kterýkoli z nich bude pravděpodobně fungovat dobře pro rozsahy, které pravděpodobně budete mít pro vaše senzory. Skutečným klíčem je mít na začátku dobrý RF přijímač. Senzory AcuRite mají také velmi silné vysílače.

Krok 4: RF komunikační protokol

Existuje několik různých modulačních technik pro přenos dat, ale tyto senzory používají nejjednodušší, což je OOK (klíčování zapnuto / vypnuto) nebo ASK (klíčování posunu amplitudy). Protože se v tomto příkladu zabýváme 0/1 datovými bity, amplituda je zapnutá nebo vypnutá. Takže pro naše účely jsou OOK a ASK stejné, protože OOK znamená, že RF nosič je buď zapnutý, nebo úplně vypnutý. Formát zprávy je obecně definován výrobcem vysílacího zařízení a mohou používat téměř jakoukoli přenosovou rychlost, jakýkoli styl formátování bitů a libovolnou délku zprávy. Pásmo 433 MHz je plné přenosů například u chytrých měřičů atd., Takže je třeba software vyladit tak, aby filtroval pouze formát zpráv, který chceme použít.

Krok 5: Časová data

Časová data
Časová data

Používám levnou jednotku GPS, abych získal přesné časové údaje, které se automaticky restartují po výpadku napájení. Mám několik jednotek GPS (bez displejů), které produkují standardní věty NMEA, ale nejmenší a nejlevnější z jednotek, které mám, je NEO-6M. Modul NEO-6M lze snadno připojit k Arduinu, protože používá sériový port na úrovni TTL. Jediným skutečným rozdílem je, že standard NMEA uvádí sériovou přenosovou rychlost 4800, ale NEO-6M má výchozí hodnotu 9600 baudů. Můžete spustit bezplatný program „u-center“pro změnu přenosové rychlosti, ale nechal jsem to na továrním nastavení. K dispozici je také bezplatný obslužný program s názvem GPSInfo (vytvořený společností Globalsat), který je velmi užitečný pro prohlížení informací GPS na počítači. Jednotku GPS můžete připojit ke standardnímu kabelu USB na TTL a zkontrolovat ji nebo nastavit pomocí počítače. Mějte na paměti, že čip GPS na modulu ve skutečnosti běží na 3,3 voltů (prostřednictvím integrovaného regulátoru napětí), takže pokud se chcete připojit k jeho portu RXD, měli byste posunutí úrovně z 5 voltů dolů. Port TXD se může připojit přímo k Arduinu nebo PC.

Krok 6: Časová pásma

Zobrazení času GPS je snadná věc, pokud chcete zobrazit pouze UTC (Universal Time Coordinated). Věty NMEA se skládají ze znaků ASCII, které lze přímo odesílat na LCD. Časová část je ve formátu HHMMSS. FF (hodiny, minuty, sekundy a zlomkové sekundy). Pro naše hodiny není zlomková část užitečná, takže vše, s čím se musíme vypořádat, je šest znaků. Problém je v tom, že pak potřebujete převést na místní čas a na 12hodinový formát AM/PM, pokud to chcete. Někdy jsou ale problémy tím, co dělá život zajímavým, a o to v té části softwaru vlastně jde.

Pokud jde o časová pásma, můžete si myslet, že by jich prostě bylo 24, z toho 12 na východ od místa UTC (+ zóny) a 12 z nich na západ od umístění UTC (- zóny). Ve skutečnosti existuje několik podivných, které jsou zlomkové hodiny, a pár, který překračuje 12hodinový „limit“. Pokud náhodou žijete v jedné z těchto oblastí, omlouvám se, protože můj software tvoří pouze 24 celých hodinových zón. Někteří z nás také používají část letního času, ale v softwaru se to automaticky nepočítá. To by vyžadovalo vyhledávací tabulku budoucích dat, extra složitost softwaru a nutnost aktualizovat software, pokud by se změnily týdny v roce přechodu. Místo toho hardware používá přepínač momentálního kontaktu, který umožňuje snadné nastavení časového pásma (offset UTC).

Krok 7: Schéma

Schéma
Schéma

Schéma je zobrazeno výše a zahrnuje připojení pro 4bitové rozhraní 1602 LCD. Sériová data z RF přijímače jsou na úrovni digitální logiky, takže jsou připojena přímo k jednomu ze vstupních pinů Arduino. Kolík je v softwaru nakonfigurován tak, aby vykonával funkci přerušení při změně, abychom mohli měřit šířky impulzů. Výstup GPS TXD je přímo připojen ke vstupu Arduino RX.

Jsou použity dva přepínače. Jak již bylo zmíněno dříve, momentový kontaktní spínač umožňuje nastavení offsetu UTC. Přepínač lze kdykoli stisknout pro vstup do nastaveného režimu. Zpočátku se na displeji zobrazí neplatný offset UTC „+77“. Pokyny k nastavení offsetu UTC naleznete v části „Software hodin“.

Druhý spínač je jednoduchý vypínač. V poloze „vypnuto“bude čas zobrazen ve 12hodinovém formátu (dopoledne/odpoledne) a v poloze „zapnuto“bude čas zobrazen ve 24hodinovém formátu. Tento přepínač lze kdykoli změnit a přepínat mezi formáty.

Pokud je požadována pouze funkce hodin, pak modul přijímače RF nemusí být připojen. Pokud je požadována pouze funkce počasí, nemusí být GPS a dva přepínače propojeny.

Krok 8: Software LCD

Obvykle používám jeden ze dvou typů rozhraní LCD. Jedním z nich je standardní 4bitové rozhraní a druhým je 3vodičové rozhraní, které používá posuvný registr. Toto rozhraní jsem navrhl, když jsem pracoval s malými mikrokontroléry PIC, které měly omezený počet I/O pinů. Pro tento projekt jsem použil 4bitové rozhraní, ale místo generické knihovny Arduino LCD mám vlastní soubor pro zahrnutí LCD. To snižuje spotřebu paměti a složitost kódu a také mi umožňuje vyladit kód pro konkrétní projekty, jako je tento.

Krok 9: Software hodin

Jednotka GPS vydává standardní věty NMEA-0183, což jsou řetězce ASCII, které obsahují různé informace. Pro tuto aplikaci jsem zvolil větu GGA, abych získal informace o čase, protože to je věta, kterou jsem použil pro předchozí projekt GPS. Pole informací ve větách NMEA jsou oddělena čárkami, takže poté, co je detekováno záhlaví věty GGA, software normálně počítá čárky a volá příslušnou rutinu pro každé požadované pole informací GPS. Zde je potřeba pouze časová informace, a to je v poli po první čárce, takže není třeba počítat.

Šest časových číslic (HHMMSS) je uloženo do vyrovnávací paměti a poté zpracováno poté, co jsou všechny přijaty. GPS může na začátku vydávat některé neúplné zprávy, takže rutina ukládání do vyrovnávací paměti ověří, že každý znak je číselná hodnota ASCII. Pokud je přijat špatný znak, zpráva je zahozena. K tomu může také dojít výjimečně během normálního provozu, zejména pokud komunikace se sériovým portem trochu poklesne. Viděl jsem to jen jednou a stalo se jen to, že se čas na vteřinu zastavil a poté přeskočil dvě sekundy místo jedné.

Pokud je software nakonfigurován tak, aby zobrazoval pouze čas, pak první řádek LCD zobrazí místní čas a druhý řádek zobrazí UTC. U UTC software pouze posílá znaky ASCII přímo do rutiny zobrazení, přičemž jsou vhodně vloženy dvojtečky (:).

Aby bylo možné převést UTC na místní čas, musí být použit posun UTC (časové pásmo). Protože čas UTC z GPS je ve formátu ASCII, software převede znaky hodin ASCII na desítkové a poté přidá offset UTC. Offset UTC je uložen jako kladná hodnota BCD se znaménkovým bitem, takže je nejprve převeden na celočíselnou hodnotu a poté negován, pokud je nastaven znaménkový bit. Jakmile se vypočítá hodnota hodin místního času, použije se vyhledávací tabulka k převodu na BCD a poté se BCD převede zpět do ASCII pro zobrazení. Vyhledávací tabulka musí zvládnout 24hodinový formát UTC a také +/- 12 časových pásem. Aby to bylo možné provést, časy UTC od 0000 do 2300 zabírají prostředních 24 záznamů v tabulce s 12 záznamy před a 12 vstupy po zaúčtování časových pásem. Jedna tabulka je ve 12hodinovém formátu, takže jsem také přidal vyhledávací tabulku pro část AM/PM na displeji. Druhá tabulka je ve 24hodinovém formátu. Jak již bylo zmíněno dříve, přepínač zapnutí/vypnutí umožňuje výběr 12hodinového nebo 24hodinového formátu.

Časové pásmo je během inicializace načteno z EEPROM a krátce zobrazeno. Pokud to nebylo nastaveno alespoň jednou, je vyvolána rutina nastavení. Rutinu nastavení lze také kdykoli vyvolat stisknutím spínače okamžitých kontaktů. Rutina nastavení inicializuje zobrazení na „UTC OFFSET +77“. Krátkým stisknutím spínače změníte hodnotu na „-00“. Pokud je požadováno kladné časové pásmo, pak dalším krátkým stisknutím změníte hodnotu na „+00“. Dlouhým stisknutím (> 1 sekundu) přesunete režim nastavení na další krok. V tomto okamžiku každé krátké stisknutí zvýší hodnotu času až na maximum 12. Po dosažení požadovaného časového pásma stiskněte a podržte spínač déle než 1 sekundu a poté jej uvolněte. Software poté uloží hodnotu UTC do EEPROM a krátce zobrazí „OFFSET SAVED“. Pokud uděláte chybu při vstupu, jednoduše ji ukončete a poté znovu stiskněte spínač, abyste ji resetovali.

NEO-6M nevyžaduje dobrou fixaci polohy, aby generoval čas, takže by měl vydávat zprávy, jakmile získá jeden satelit. Do té doby bude na displeji zobrazeno „ŽÁDNÁ DATA“.

Krok 10: Počasí software

Mikrokontrolér PIC má schopnost zapnout/vypnout časovač pomocí externího impulsu. Stejný vstupní impuls lze také použít jako externí přerušení pro signalizaci čtení doby trvání impulsu. Arduino nemá tuto přesnou schopnost, takže jsem použil funkci přerušení při změně. Na jednom okraji pulsu zprávy RF je aktuální mikrosekundový čas uložen obsluhou přerušení. Na protilehlé hraně se vypočítá uplynulý čas, aby se určila šířka impulsu.

Software má definici „DEBUG“, která umožňuje zobrazení formátu nezpracovaných dat přijatých zpráv. Existuje také definice pro zadání vstupního kolíku Arduino pro sériový proud z RF přijímače. Software je nastaven tak, aby na základě této definice vypočítal příslušná nastavení registru přerušení při změně. Výpočet funguje pouze pro digitální piny Arduino. Místo toho lze použít analogový pin, ale to by vyžadovalo pevné kódování hodnot registru.

Obsluha přerušení určuje, zda je počet zachycení dostatečně dlouhý na to, aby byl startovacím impulzem. Jak již bylo zmíněno dříve, mezera mezi více zprávami je 2 ms, takže to software hledá. Vzhledem k veškerému provozu 433 MHz počáteční screening v softwaru zajišťuje, že měřený čas je alespoň 1,8 ms, ale ne větší než 2,4 ms. Jakmile je detekován start, software vyhledá synchronizační bity (600us) a spočítá, aby se ujistil, že jsou přijaty čtyři z nich. Jakmile tyto testy projdou, software vyhledá správné bitové časy 200us a 400us.

Přijaté bity se zformují do bajtů a každý bajt se uloží. Po přijetí sedmi bajtů je kontrolní součet zprávy ověřen, než je povoleno další zpracování. Pokud mají být na výstupu surové bajty (režim ladění), pak jsou bajty převedeny na znaky ASCII a odeslány na LCD. Pokud jsou požadovány výstupy vlhkosti a teploty, jsou provedeny příslušné převody.

Dva bajty dat Celsia ve zprávě RF jsou spojeny dohromady a tvoří 11bitovou hodnotu. Spodní část je posunuta o jeden bit doleva, aby se odstranil paritní bit a zarovnal se s bity v horní části. Dva bajty se zformují do 16bitové proměnné slova a pak se celá věc posune o jeden bit doprava, aby se dosáhlo konečného zarovnání bitů. Proměnná slova je pak pro matematické výpočty převedena na proměnnou s pohyblivou řádovou čárkou.

Jedna velká výhoda použití C ++ v jazyce Arduino versus assembler na PIC spočívá v tom, že zjednodušuje matematické výpočty. Jak již bylo zmíněno dříve, převod na stupně Celsia je (C / 10) -100. Výsledek je převeden na řetězec a odeslán na LCD k zobrazení. Výpočet Fahrenheita je (C * 1,8) + 32. Výsledek je znovu převeden na řetězec a odeslán na LCD k zobrazení. V obou případech převod řetězce zahrnuje záporné znaménko (je -li to vhodné) a desetinnou čárku. Je provedena kontrola desetinné čárky, aby bylo zajištěno, že na displej bude odeslán pouze jeden znak za desetinnou čárkou. Tato kontrola je nutná, protože řetězec může mít délku od 3 do 5 znaků.

Mám dva senzory AcuRite, takže jsem přidal kontrolu v softwaru, abych zajistil, že data pro jeden nepřepíší data pro ostatní, pokud je software nastaven pouze na funkci počasí. První senzor přijatý po zapnutí se zobrazí na řádku 1 a druhý se zobrazí na řádku 2. Pomocí režimu ladění vidím, jaké je ID pro každý senzor, takže mohu jednoduše zkontrolovat kód, pokud chtěl zpracovat data od jednoho z nich.

Software monitoruje stav baterie (byte3) a v případě vybité baterie zobrazí zprávu. Tato zpráva přepíše všechna ostatní data pro tento senzor.

Krok 11: Displeje

Displeje
Displeje
Displeje
Displeje
Displeje
Displeje

Zde je několik příkladů zobrazení různých funkcí. Mám několik dalších instrukcí, ale většinu mých projektů mikrokontrolérů PIC najdete na mých webových stránkách: www.boomerrules.wordpress.com

Doporučuje: