INHOUDSOPGAWE:
- Stap 1: Weersensor
- Stap 2: RF -ontvanger
- Stap 3: RF -antennas
- Stap 4: RF -kommunikasieprotokol
- Stap 5: Tyddata
- Stap 6: Tydsones
- Stap 7: Skematiese
- Stap 8: LCD -sagteware
- Stap 9: Kloksagteware
- Stap 10: Weersagteware
- Stap 11: Vertoon
Video: Arduino 3-in-1 tyd- en weerweergawe: 11 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:26
Deur Boomer48 Volg meer deur die skrywer:
Ek hou van PIC -mikrobeheerders en ek hou van programmeer in monteringstaal. Trouens, die afgelope paar jaar het ek ongeveer 40 projekte op my webwerf geplaas op grond van die kombinasie. Onlangs bestel ek 'n paar onderdele by een van my gunsteling Amerikaanse verkopers, en ek sien 'n Arduino Nano met 'n programmeerkabel vir slegs $ 1,20 meer as 'n blote ATMEGA328 -verwerkerskyf. So ek het 'n paar van hulle gekoop. Toe laai ek die Arduino IDE af en verwyder my geheue van 'C ++' programmering.
Hierdie projek is 'n kombinasie van 'n horlosie wat GPS gebruik vir tydsberekening en 'n RF-ontvanger wat weerboodskappe van 'n gewone AcuRite-sensor dekodeer. Die resultaat is 'n klein skaal van tyd en temperatuur. Die GPS -klok en weerroetines is opgestel as afsonderlike lêers, sodat dit maklik is om in die hoofroetine in te gaan en dit op te stel om net die klokfunksie of net die weerfunksie te doen. Skakel net die toepaslike '#define' bo -aan die hoofroetine, as u net een van die funksies wil hê.
As beide funksies gebruik word, vertoon die boonste reël van die LCD die plaaslike tyd en die onderste reël van die LCD vertoon die humiditeit en temperatuur in beide Celsius en Fahrenheit. As slegs die klokfunksie gebruik word, vertoon die boonste reël plaaslike tyd en die onderste reël vertoon UTC. As slegs die weerfunksie gebruik word, vertoon die boonste reël die eerste sensor wat ontvang is en die onderste reël enige ander sensor wat ontvang is. Ek het die vermoë bygevoeg omdat ek twee weersensors het.
Stap 1: Weersensor
Die AcuRite -weersensor wat hier gebruik word, stuur elke 16 sekondes inligting oor temperatuur en humiditeit. Op die agterkant toon dit 'n modelnommer van 000592TXR, maar dit word gewoonlik as model 06002M geadverteer. Hierdie sensor word deur baie verskillende weerstasie -modelle gebruik, so dit is maklik om te vind, en ek kon dit op minder as $ 20 op eBay kry. AcuRite verkoop sensors wat soortgelyk is aan sommige van hul weerstasies, maar hulle kan dieselfde kommunikasieprotokol volg of nie. Daar is 'n aanduiding op die internet dat die 00606-sensor slegs vir temperatuur dieselfde boodskapformaat gebruik, maar met 'n ongeldige humiditeitsbyte.
Soos gesien in die eerste golfvorm hierbo, word die weerboodskappe in bars uitgestuur met 'n gaping van 2 ms tussen opeenvolgende boodskappe. Die tweede golfvorm hierbo, brei 'n deel van een boodskap uit om die bisduur en patrone te sien. Daar is vier sinchronisasie -bisse wat ongeveer 600us hoog is, gevolg deur 600us laag. Die databits word voorgestel deur 400us hoog gevolg deur 200us laag (1) of 200us hoog gevolg deur 400us laag (0).
Die boodskapformaat bestaan uit 7 grepe data. Die eerste twee grepe is die sensor -ID en dit verander nie (dit wil sê: dit gebruik nie 'n rolkode nie). Die laaste greep is 'n eenvoudige additiewe kontrolesom van die eerste ses grepe. Die derde greep is 'n batteryniveau -aanwyser en moet altyd 44 heks wees as die battery goed is. Die vierde greep is die humiditeit en dit is 'n ongeskale waarde tussen 0 en 99. Dit is belangrik om in gedagte te hou dat die belangrikste greepbytes 4, 5 en 6 'n pariteitsbit is en nie deel is van die meting nie waardes. Grepe 5 en 6 is die afgeskaalde temperatuur (Celsius), met die onderste 4 bisse 5 byt aan die onderste 7 bisse 6 bytes om 'n 11-bis waarde te vorm. Die temperatuur word altyd as 'n positiewe getal voorgestel en word slegs negatief wanneer die skaal toegepas word. Die skaal is (C / 10) - 100. Die deel met 10 word vereis omdat die temperatuurresolusie in tiendes van 'n graad is. Die aftrekking is nodig omdat 100 deur die sensor bygevoeg word om die oordraagbare waarde positief te hou.
Stap 2: RF -ontvanger
Die RF -module wat ek vir hierdie projek gebruik, is die RXB6. Dit is 'n super heterodiene ontvanger in teenstelling met die minder wenslike superregeneratiewe ontvangers. As u na die goedkoop RF -modules kyk, vind u dat sender- en ontvangerborde dikwels saamgevoeg is. Die meeste van die saamgevoegde ontvangers is super -regeneratiewe tipes, sodat hulle geneig is om baie laer prestasie -eienskappe (insluitend reeks) te hê as super -heterodyne -ontvangers. Ons benodig slegs die ontvangermodule vir hierdie projek, want ons sal seine van 'n weersensorsender ontvang.
Stap 3: RF -antennas
Die RXB6 kom nie met 'n antenna nie. U kan 'n paar heliese goedkoop koop, maar dit is ook maklik om u eie antenna te maak. In werklikheid kan 'n broodbordkabel op die antenna -pen van die module gegly word as u nie te slim wil raak nie. Die ideaal is dat 'n reguit draadantenne 1/4 golflengte is, wat ongeveer 6,8 duim is. Ek het aanvanklik die jumper wire gedoen en het geen probleem gehad om my sensor buite te haal nie, alhoewel my elektroniese werkswinkel in my kelder is.
'N Ander moontlikheid is om u eie spiraalvormige antenna te maak. Daar is verskillende planne hiervoor op die internet, maar die een wat op die foto hierbo verskyn, is wat ek gemaak het. Ek het 'n soliede kerndraad van 'n stukkie Ethernet -kabel gebruik en om die gladde steel van 'n 5/32 duim -boor gedraai. Laat die isolasie aan behalwe die punt wat aan die RF -bord verkoop word. Jy benodig 20 draaie. U kan ook 'n 7/32 duim -boorpunt gebruik en in plaas daarvan 17 draaie draai. Enige hiervan werk waarskynlik goed vir die reekse wat u waarskynlik vir u sensors sal hê. Die belangrikste ding is om eers 'n goeie RF -ontvanger te hê. Die AcuRite -sensors het ook redelik sterk senders.
Stap 4: RF -kommunikasieprotokol
Daar is 'n paar verskillende modulasietegnieke om data oor te dra, maar hierdie sensors gebruik die eenvoudigste OOK (on-off-keying) of ASK (amplitude-shift-keying). Aangesien ons in hierdie voorbeeld te doen het met 0/1 databits, is die amplitude vol aan of uit. Dus, vir ons doeleindes, is OOK en ASK dieselfde, want OOK beteken dat die RF -draer vol is of af is. Die boodskapformaat word oor die algemeen bepaal deur die vervaardiger van die oordragapparaat en dit kan byna enige transmissietempo, enige opmaakstyl en enige boodskaplengte gebruik. Die 433-MHz-band sit vol transmissies vir dinge soos slimmeters, ens., Sodat die sagteware ingestel moet word om te filter net vir die boodskapformaat wat ons wil gebruik.
Stap 5: Tyddata
Ek gebruik 'n goedkoop GPS -eenheid om akkurate tyddata te kry wat outomaties herlaai na 'n kragonderbreking. Ek het verskeie GPS-eenhede (sonder skerms) wat die standaard NMEA-sinne lewer, maar die kleinste en goedkoopste van die eenhede wat ek het, is die NEO-6M. Die NEO-6M-module kan maklik met die Arduino gekoppel word omdat dit 'n seriële poort op TTL-vlak gebruik. Die enigste werklike verskil is dat die NMEA-standaard 'n seriële baud-snelheid van 4800 spesifiseer, maar die NEO-6M is standaard 9600 baud. U kan die gratis "u-center" -program gebruik om die baud-tempo te verander, maar ek het dit net by die fabrieksinstelling gelaat. Daar is ook 'n gratis hulpprogram genaamd GPSInfo (uitgegee deur Globalsat) wat baie handig is om GPS -inligting op die rekenaar te sien. U kan die GPS -eenheid aansluit op 'n standaard USB -na -TTL -kabel om dit na te gaan of om dit op te stel met 'n rekenaar. Hou in gedagte dat die GPS-chip op die module eintlik 3,3 volt werk (via 'n ingeboude spanningsreguleerder), dus as u aan die RXD-poort wil koppel, moet u die vlak van 5 volt afskuif. Die TXD -poort kan direk met die Arduino of die rekenaar gekoppel word.
Stap 6: Tydsones
Dit is maklik om GPS -tyd te wys, solank u net UTC (Universal Time Coordinated) wil vertoon. Die NMEA -sinne bestaan uit ASCII -karakters wat direk na die LCD gestuur kan word. Die tydsgedeelte is in die formaat van HHMMSS. FF (ure, minute, sekondes en breuke). Vir ons horlosie is die breukdeel nie nuttig nie, en al wat ons hoef te hanteer is ses karakters. Die probleem is dat u dan moet omskakel na u plaaslike tyd en na 'n 12-uur AM/PM-formaat as u dit wil hê. Maar soms is probleme wat die lewe interessant maak, so dit is eintlik waaroor die gedeelte van die sagteware gaan.
Wat tydsones betref, dink u miskien dat daar 24 daarvan is, waarvan 12 oos van die UTC-plek (+ sones) en 12 daarvan wes van die UTC-ligging (- sones). Trouens, daar is 'n paar vreemde ure wat breuke is en 'n paartjie wat die 'limiet' van 12 uur oorskry. As u toevallig in een van die gebiede woon, vra ek om verskoning, want my sagteware is slegs verantwoordelik vir die hele 24 uur sones. Daar is ook 'n paar van ons wat 'n deel van die jaar die somertyd gebruik, maar dit word nie outomaties in die sagteware verantwoord nie. Dit verg 'n opsigtabel van toekomstige datums, ekstra kompleksiteit in die sagteware en die noodsaaklikheid om die sagteware by te werk as die weke van die jaar vir die omskakeling verander. Die hardeware gebruik in plaas daarvan 'n kort kontakskakelaar om die tydsone (UTC -offset) maklik te stel.
Stap 7: Skematiese
Die skema word hierbo getoon en bevat die verbindings vir 'n 4-bis 1602 LCD-koppelvlak. Die seriële data van die RF -ontvanger is op digitale logiese vlakke, sodat dit direk aan een van die Arduino -data -invoerpenne gekoppel is. Die pen is in die sagteware gekonfigureer om 'n interrupt-on-change funksie uit te voer sodat ons die polswydtes kan meet. Die GPS TXD -uitset is direk gekoppel aan die Arduino RX -ingang.
Daar word twee skakelaars gebruik. Soos vroeër genoem, kan 'n kort kontakskakelaar die UTC -offset instel. Die skakelaar kan te eniger tyd ingedruk word om in die ingestelde modus te gaan. Aanvanklik sal die skerm 'n ongeldige UTC -offset van "+77" vertoon. Raadpleeg die afdeling "Kloksagteware" vir instruksies vir die instelling van UTC -offset.
Die tweede skakelaar is 'n eenvoudige aan/uit -skakelaar. In die "af" -posisie sal die tyd in 12-uur-formaat (AM/PM) vertoon word en in die "aan" -posisie sal die tyd in 24-uur-formaat vertoon word. Hierdie skakelaar kan te eniger tyd verander word om tussen formate te wissel.
As slegs die klokfunksie verlang word, hoef die RF -ontvanger -module nie gekoppel te word nie. As net die weerfunksie verlang word, hoef die GPS en die twee skakelaars nie gekoppel te wees nie.
Stap 8: LCD -sagteware
Ek is geneig om een van twee soorte LCD -koppelvlakke te gebruik. Die een is die standaard 4-bis-koppelvlak en die ander 'n 3-draads koppelvlak wat 'n skofregister gebruik. Ek het die koppelvlak ontwerp toe ek met klein PIC -mikrobeheerders werk wat 'n beperkte aantal I/O -penne gehad het. Ek het die 4-bis-koppelvlak vir hierdie projek gebruik, maar ek het my eie LCD-lêer, in plaas van die generiese Arduino LCD-biblioteek. Dit verminder die geheueverbruik en kodekompleksiteit en stel my ook in staat om die kode aan te pas vir spesifieke projekte soos hierdie.
Stap 9: Kloksagteware
Die GPS-eenheid lewer standaard NMEA-0183 sinne uit, wat ASCII-snare is wat 'n verskeidenheid inligting bevat. Vir hierdie toepassing het ek die GGA -sin gekies om die tydinligting te kry, want dit is die sin wat ek vir 'n vorige GPS -projek gebruik het. Inligtingsvelde in NMEA -sinne word deur kommas geskei, dus nadat die GGA -sinopskrif opgespoor is, tel die sagteware gewoonlik kommas en bel die geskikte roetine vir elke gewenste veld met GPS -inligting. Hier is slegs die tydsinligting nodig, en dit is in die veld na die eerste komma, dus hoef u nie te tel nie.
Die ses tydsyfers (HHMMSS) word gebuffer en dan verwerk nadat hulle almal ontvang is. Die GPS kan 'n paar onvolledige boodskappe vroeg uitstuur, sodat die bufferroetine bevestig dat elke karakter 'n ASCII -numeriese waarde is. As 'n slegte karakter ontvang word, word die boodskap weggegooi. Dit kan ook in seldsame gevalle gebeur tydens normale werking, veral as die seriële poortkommunikasie effens daal. Ek het dit net een keer gesien, en al wat gebeur het, is dat die tyd vir 'n sekonde stilstaan en dan twee sekondes spring in plaas van een.
As die sagteware gekonfigureer is om slegs tyd te vertoon, sal die eerste reël van die LCD plaaslike tyd vertoon en die tweede reël UTC. Vir UTC stuur die sagteware die ASCII -karakters direk na die vertoonroetine, met kolon (:) gepas ingevoeg.
Om die UTC na plaaslike tyd om te skakel, moet die UTC -offset (tydsone) toegepas word. Omdat die UTC -tyd van die GPS in ASCII -formaat is, skakel die sagteware die ASCII -uurtekens om na desimale en voeg dan die UTC -offset by. Die UTC -offset word gestoor as 'n positiewe BCD -waarde met 'n tekenbit, sodat dit eers omgeskakel word na 'n heelgetalwaarde en dan ontken word as die tekenbit gestel word. Sodra die plaaslike tyd -uurwaarde bereken is, word 'n opzoektabel gebruik om dit na BCD om te skakel, en dan word die BCD omgeskakel na ASCII vir vertoning. Die soektafel moet die 24-uur UTC-formaat sowel as +/- 12 tydsones hanteer. Om dit te kan doen, beslaan die UTC -tye van 0000 tot 2300 die middelste 24 inskrywings in die tabel met 12 inskrywings voor en 12 inskrywings daarna om die tydsones in ag te neem. Een tafel is in 12-uur-formaat, so ek het ook 'n soektafel vir die AM/PM-deel van die skerm bygevoeg. Die ander tabel is in 24-uur-formaat. Soos vroeër genoem, kan 'n aan/uit-skakelaar die 12-uur- of 24-uur-formaat kies.
Die tydsone word tydens die inisialisering van EEPROM gehaal en kortliks vertoon. As dit nie ten minste een keer ingestel is nie, word die instellingsroetine genoem. Die instellingsroetine kan ook te eniger tyd gebel word deur op die kortstondige kontakskakelaar te druk. Die instellingsroetine sal die skerm begin met 'UTC OFFSET +77'. 'N Kort druk op die skakelaar verander die waarde na "-00". As 'n positiewe tydsone nodig is, verander 'n kort druk die waarde na "+00". 'N Lang druk (> 1 sekonde) sal die instellingsmodus na die volgende stap skuif. Op hierdie punt verhoog elke kort druk die tydwaarde tot 'n maksimum van 12. Nadat u die gewenste tydsone bereik het, hou die skakelaar langer as 1 sekonde ingedruk en laat dit dan los. Die sagteware stoor dan die UTC -waarde in EEPROM en vertoon kortliks "OFFSET SAVED". As u 'n fout maak tydens die inskrywing, gaan u uit en druk dan weer op die skakelaar om dit terug te stel.
Die NEO-6M benodig nie 'n goeie posisie om die tyd uit te voer nie, dus moet dit boodskappe stuur sodra dit een satelliet kry. Tot dan sal die skerm “GEEN GEGEWENS” vertoon nie.
Stap 10: Weersagteware
Die PIC -mikrobeheerder het die vermoë om 'n timer aan/uit te skakel met behulp van 'n eksterne pols. Dieselfde ingangspuls kan ook as 'n eksterne onderbreking gebruik word om 'n lesing van die duur van die pols aan te dui. Die Arduino het nie die presiese vermoë nie, so ek het die interrupt-on-change-funksie gebruik. Aan die een kant van die RF -boodskappuls word die huidige mikrosekondetyd deur die onderbrekingshanteerder gestoor. Op die teenoorgestelde rand word die verloop van tyd bereken om die polswydte te bepaal.
Die sagteware het 'n "DEBUG" -definisie waarmee die rou dataformaat van die ontvangde boodskappe vertoon kan word. Daar is ook 'n definisie om die Arduino -invoerpen vir die seriële stroom van die RF -ontvanger te spesifiseer. Die sagteware is opgestel om die toepaslike interrupt-on-change registerinstellings te bereken op grond van hierdie definisie. Die berekening werk slegs vir die Arduino digitale penne. 'N Analoog pen kan in plaas daarvan gebruik word, maar dit verg harde kodering van die registerwaardes.
Die onderbrekingshanteerder bepaal of die vasgestelde telling lank genoeg is om 'n beginpuls te wees. Soos vroeër genoem, is die gaping tussen verskeie boodskappe 2ms, en dit is waarna die sagteware soek. As gevolg van al die 433 MHz-verkeer, verseker die aanvanklike ondersoek in die sagteware dat die gemete tyd minstens 1,8 ms is, maar nie groter as 2,4 ms nie. Nadat die begin opgespoor is, soek die sagteware na die sinchronisasie -bisse (600 us) en tel om seker te maak dat vier daarvan ontvang word. Sodra hierdie toetse geslaag is, soek die sagteware na die regte bytyd van 200us en 400us.
Ontvangte stukkies word in grepe gevorm en elke greep word gestoor. Nadat sewe grepe ontvang is, word die kontrolesom van die boodskap geverifieer voordat verdere verwerking toegelaat word. As rou grepe uitgevoer moet word (ontfoutingsmodus), word die grepe omgeskakel na ASCII -karakters en na die LCD gestuur. As humiditeits- en temperatuuruitsette verlang word, word die toepaslike omskakelings uitgevoer.
Die twee grepe Celsius-data in die RF-boodskap word saamgevoeg om 'n 11-bis waarde te vorm. Die onderste gedeelte word een bietjie na links verskuif om die pariteitsboor uit te skakel en dit in lyn te bring met die bisse in die boonste gedeelte. Die twee grepe word gevorm in 'n 16-bis-woordveranderlike, en dan word die hele ding een bietjie regs geskuif om die finale bis-belyning te kry. Die woord veranderlike word dan omgeskakel na 'n drywende punt veranderlike vir die wiskundige berekeninge.
Een groot voordeel van die gebruik van C ++ op die Arduino versus monteringstaal op die PIC is dat dit die wiskundige berekeninge vereenvoudig. Soos vroeër genoem, is die Celsius -omskakeling (C / 10) -100. Die resultaat word omgeskakel na 'n string en na die LCD gestuur vir vertoning. Die Fahrenheit -berekening is (C * 1.8) + 32. Die resultaat word weer omgeskakel na 'n string en na die LCD gestuur vir vertoning. In beide gevalle bevat die string -omskakeling die negatiewe teken (indien toepaslik) en die desimale punt. Daar word gekyk na die desimale punt om te verseker dat slegs een karakter na die desimale na die skerm gestuur word. Die tjek is nodig omdat die string van 3 tot 5 karakters lank kan wees.
Ek het twee AcuRite -sensors, so ek het 'n tjek in die sagteware bygevoeg om te verseker dat die data vir die een nie die data vir die ander oorskryf as die sagteware slegs die weerfunksie verrig nie. Die eerste sensor wat ontvang word nadat dit aangeskakel is, word op reël 1 vertoon en die ander op reël 2. Deur die ontfoutmodus te gebruik, kan ek sien wat die ID vir elke sensor is, sodat ek die kode eenvoudig kan kontroleer as ek net wou data van een van hulle verwerk.
Die sagteware monitor die batterystatus (byte3) en gee 'n boodskap as dit dui op 'n lae battery. Hierdie boodskap oorskryf alle ander data vir die sensor.
Stap 11: Vertoon
Hier is 'n paar voorbeeldskerms vir die verskillende funksies. Ek het 'n paar ander instruksies, maar die meeste van my PIC -mikrobeheerprojekte kan op my webwerf gevind word by: www.boomerrules.wordpress.com
Aanbeveel:
Eenvoudige weerweergawe met framboos PI en Cyntech WeatherHAT: 4 stappe
Eenvoudige weerweergawe met Raspberry PI en Cyntech WeatherHAT: * In 2019 het Yahoo die API verander, en dit het opgehou werk. Ek was nie bewus van die verandering nie. In September 2020 is hierdie projek opgedateer om die OPENWEATHERMAP API te gebruik. Sien die onderstaande opgedateerde afdeling, die res van hierdie inligting is nog steeds goed
Arduino GPS-klok met plaaslike tyd met behulp van NEO-6M-module: 9 stappe
Arduino GPS-klok met plaaslike tyd met behulp van NEO-6M-module: in hierdie tutoriaal leer ons hoe u die huidige tyd van die satelliete kan kry met behulp van arduino. Kyk na die video
Arduino en VL53L0X Tyd-van-vlug + OLED-skermstudie: 6 stappe
Arduino en VL53L0X Time-of-Flight + OLED Display Tutoriaal: In hierdie tutoriaal leer ons hoe om die afstand in mm te wys met behulp van VL53L0X Time-of-Flight sensor en OLED Display. Kyk na die video
Britse trein- en weerweergawe: 5 stappe
Britse trein- en weerweergawe: hierdie instruksie is bedoel vir 'n battery -aangedrewe Britse treinvertrek en weerweergawe. Dit het die National Rail OpenLDBWS -databasis gebruik om intydse treinvertrekinligting vir 'n spesifieke plaaslike treinstasie te kry en dit te vertoon. Dit gebruik oopweer
Arduino datum/tyd plot/aanteken met behulp van Millis () en PfodApp: 11 stappe
Arduino datum/tyd plot/aanteken met behulp van Millis () en PfodApp: geen Arduino- of Android -programmering nodig nie. RTC- en GPS -modules word ook ondersteun. Outomatiese regstelling vir tydsones, RTC -drift en GPS ontbreek sprongsekondes Inleiding Hierdie handleiding wys hoe u u Arduino millis kan gebruik ( ) tydstempels om data op te stel