Sisukord:

Arduino 3-in-1 aja- ja ilmakuva: 11 sammu
Arduino 3-in-1 aja- ja ilmakuva: 11 sammu

Video: Arduino 3-in-1 aja- ja ilmakuva: 11 sammu

Video: Arduino 3-in-1 aja- ja ilmakuva: 11 sammu
Video: Функция Arduino Millis поясняется 3 примерами 2024, November
Anonim

Jälgige rohkem autorilt:

ATtiny85 kasutamine
ATtiny85 kasutamine
ATtiny85 kasutamine
ATtiny85 kasutamine
Pi Powered Pie Partitioning ja Polygon pügamise tööriist
Pi Powered Pie Partitioning ja Polygon pügamise tööriist
Pi Powered Pie Partitioning ja Polygon pügamise tööriist
Pi Powered Pie Partitioning ja Polygon pügamise tööriist
Digitaalsed juhtnupud käsitsi helivõimendi jaoks
Digitaalsed juhtnupud käsitsi helivõimendi jaoks
Digitaalsed juhtnupud käsitsi helivõimendi jaoks
Digitaalsed juhtnupud käsitsi helivõimendi jaoks

Mulle meeldivad PIC -mikrokontrollerid ja programmeerimine koostamiskeeles. Tegelikult olen viimase paari aasta jooksul selle kombinatsiooni põhjal oma veebisaidile postitanud umbes 40 projekti. Hiljuti tellisin osi ühelt USA lemmikmüüjalt ja märkasin Arduino Nano koos programmeerimiskaabliga vaid 1,20 dollari eest rohkem kui paljas ATMEGA328 protsessorikiip. Nii et ostsin paar neist. Seejärel laadisin alla Arduino IDE ja tolmutasin mälu C ++ programmeerimisest.

See projekt on kella segamine, mis kasutab ajastamiseks GPS-i ja RF-vastuvõtjat, mis dekodeerib tavalise AcuRite anduri ilmateateid. Tulemuseks on väikese aja ja temperatuuri näidik. GPS -kell ja ilmastikurežiimid on seadistatud eraldi kaasamisfailidena, nii et on lihtne siseneda põhirutiini ja konfigureerida see tegema ainult kellafunktsiooni või lihtsalt ilmateadet. Lihtsalt tühistage põhirutiini ülaosas sobiv „#define”, kui soovite ainult ühte funktsioonidest.

Kui kasutatakse mõlemat funktsiooni, kuvab vedelkristallekraani ülemine rida kohaliku aja ja LCD alumine rida näitab niiskust ja temperatuuri nii Celsiuse kui Fahrenheiti järgi. Kui kasutatakse ainult kellafunktsiooni, näitab ülemine rida kohalikku aega ja alumine rida UTC. Kui kasutatakse ainult ilmastikutingimusi, kuvatakse ülemisel real esimene vastuvõetud andur ja alumisel real kõik muud andurid. Lisasin selle võimaluse, kuna mul on kaks ilmaandurit.

Samm: ilmastikuandur

Ilmandur
Ilmandur
Ilmandur
Ilmandur
Ilmandur
Ilmandur

Siin kasutatav AcuRite ilmastikuandur saadab temperatuuri ja niiskuse teavet iga 16 sekundi järel. Tagaküljel on näidatud mudeli number 000592TXR, kuid tavaliselt reklaamitakse seda mudelina 06002M. Seda andurit kasutavad paljud erinevad ilmajaamade mudelid, nii et seda on lihtne leida ja mul õnnestus need eBayst alla 20 dollari eest hankida. AcuRite müüb mõne ilmajaama jaoks sarnase välimusega andureid, kuid need võivad sama sideprotokolli järgida või mitte. Veebis on märke selle kohta, et ainult temperatuuriandur 00606 kasutab sama sõnumivormingut, kuid vale niiskuse baidiga.

Nagu ülaltoodud esimesest lainekujust näha, saadetakse ilmateated järjestikku, järjestikuste sõnumite vahel on 2 ms vahe. Eespool näidatud teine lainekuju laiendab osa ühest sõnumist, et näha bittide kestust ja mustreid. Seal on neli sünkroonimisbitti, mis on umbes 600us kõrged, millele järgneb 600us madal. Andmebitte tähistab 400us kõrge, millele järgneb 200us madal (1) või 200us kõrge, millele järgneb 400us madal (0).

Sõnumivorming koosneb 7 baidist andmetest. Kaks esimest baiti on anduri ID ja need ei muutu (st see ei kasuta jooksvat koodi). Viimane bait on esimese kuue baidi lihtne liidulisand. Kolmas bait on aku taseme indikaator ja kui aku on hea, peaks see alati olema 44 hex. Neljas bait on niiskus ja see on skaleerimata väärtus vahemikus 0–99. Oluline on meeles pidada, et baitide 4, 5 ja 6 kõige olulisem bit on pariteedibitt ega kuulu mõõtmisse väärtused. Baidid 5 ja 6 on skaleeritud temperatuur (Celsius), kusjuures baidi 5 alumine 4 bitti ühendatakse baidi 6 alumise 7 bitiga, moodustades 11-bitise väärtuse. Temperatuuri esitatakse alati positiivse arvuna ja see muutub negatiivseks alles siis, kui skaleerimine on rakendatud. Skaleerimine on (C / 10) - 100. Jagamine 10 -ga on vajalik, kuna temperatuuri eraldusvõime on kümnendik kraadides. Lahutamine on vajalik, kuna andur lisab 100, et edastatud väärtus oleks positiivne.

Samm 2: RF -vastuvõtja

RF vastuvõtja
RF vastuvõtja
RF vastuvõtja
RF vastuvõtja

Selle projekti jaoks kasutatav RF -moodul on RXB6. See on superheterodüünvastuvõtja, erinevalt vähem soovitavatest superregenereerivatest vastuvõtjatest. Kui vaatate odavaid RF -mooduleid, leiate, et saatja ja vastuvõtja plaadid on sageli komplekteeritud. Enamik neist komplekteeritud vastuvõtjatest on super regeneratiivsed, nii et neil on tavaliselt palju madalamad jõudlusomadused (sealhulgas vahemik) kui superheterodüünvastuvõtjatel. Selle projekti jaoks vajame ainult vastuvõtja moodulit, sest saame signaale ilmaandurite saatjalt.

Samm: RF -antennid

RF antennid
RF antennid

RXB6 -ga ei ole kaasas antenni. Mõnda spiraalset saate osta üsna odavalt, kuid ka antenni on lihtne valmistada. Tegelikult võib leivaplaadi hüppajakaabli libistada mooduli antennipistikule, kui te ei soovi liiga väljamõeldud. Ideaalis oleks sirge juhtmega antenn 1/4 lainepikkusega, mis ulatub umbes 6,8 tolli. Algselt tegin hüppaja juhtme ja mul polnud probleeme välise anduri ülesvõtmisega, kuigi mu elektroonikatöökoda asub minu keldris.

Teine võimalus on teha oma spiraalantenn. Veebis on selle jaoks erinevaid plaane, kuid ülaltoodud pildil näidatud on see, mille tegin. Kasutasin Etherneti kaabli jäägijupist kindlat südamiktraati ja kerisin selle ümber 5/32 -tollise puuri sileda varre. Jätke isolatsioon sisse, välja arvatud RF -plaadi külge joodetud ots. Teil on vaja 20 pööret. Võite kasutada ka 7/32 tolli puurit ja keerata selle asemel 17 pööret. Kõik need toimivad tõenäoliselt suurepäraselt nende vahemike korral, mis teil tõenäoliselt andurite jaoks on. Tõeline võti on kõigepealt hea RF -vastuvõtja olemasolu. AcuRite anduritel on ka päris tugevad saatjad.

Samm 4: RF -sideprotokoll

Andmete edastamiseks on mõned erinevad modulatsioonitehnikad, kuid need andurid kasutavad lihtsaimat, mis on OOK (sisse-välja-võtmed) või ASK (amplituudi nihutamise võtmed). Kuna selles näites käsitleme 0/1 andmebitte, on amplituud täis või väljas. Niisiis, meie eesmärkidel on OOK ja ASK samad, kuna OOK tähendab, et raadiosagedusoperaator on kas täis või väljas. Sõnumivormingu määrab tavaliselt edastava seadme tootja ja nad saavad kasutada peaaegu igasugust edastuskiirust, bitivormingu stiili ja sõnumi pikkust. 433 MHz sagedusriba on täis ülekandeid selliste asjade jaoks nagu nutikad arvestid jne, seega tuleb tarkvara häälestada nii, et see filtreeriks just selle sõnumivormingu, mida soovime kasutada.

Samm: ajaandmed

Ajaandmed
Ajaandmed

Kasutan odavat GPS -seadet, et saada täpseid ajaandmeid, mis pärast voolukatkestust automaatselt taaskäivituvad. Mul on mitu GPS-seadet (ilma kuvariteta), mis väljastavad standardseid NMEA lauseid, kuid väikseim ja odavaim neist on NEO-6M. NEO-6M moodulit on lihtne Arduinoga liidestada, kuna see kasutab TTL-taseme jadaporti. Ainus tegelik erinevus on see, et NMEA standard määrab jadaühenduse kiiruseks 4800, kuid NEO-6M vaikeväärtuseks on 9600 baud. Boodikiiruse muutmiseks saate käivitada tasuta programmi „u-center”, kuid jätsin selle lihtsalt tehase vaikeseadeks. Samuti on olemas tasuta utiliitprogramm nimega GPSInfo (välja pannud Globalsat), mis on väga mugav GPS -teabe vaatamiseks arvutis. Saate GPS -seadme ühendada tavalise USB -TTL -kaabliga, et seda kontrollida või arvuti abil seadistada. Pidage meeles, et mooduli GPS-kiip töötab tegelikult 3,3 volti (sisseehitatud pingeregulaatori kaudu), nii et kui soovite ühendada selle RXD-pordiga, peaksite taseme nihutama 5 voltilt allapoole. TXD -pordi saab ühendada otse Arduino või arvutiga.

6. samm: ajavööndid

GPS -i aja kuvamine on lihtne asi, kui soovite kuvada UTC (universaalne ajakoordineeritud). NMEA laused koosnevad ASCII märkidest, mida saab otse LCD -le väljastada. Ajaosa on vormingus HHMMSS. FF (tunnid, minutid, sekundid ja murdosa sekundid). Meie kella jaoks ei ole murdosa kasulik, seega peame tegelema ainult kuue tähemärgiga. Probleem on selles, et peate seejärel konverteerima oma kohaliku aja ja 12-tunnise AM/PM vormingu, kui soovite. Kuid mõnikord muudavad elu huvitavaks probleemid, nii et see tarkvara osa on tegelikult kõik.

Ajavööndite osas võite arvata, et neid oleks lihtsalt 24, neist 12 ida pool UTC asukohast (+ tsoonid) ja 12 neist UTC asukohast läänes (- tsoonid). Tegelikult on mõned veidrad pallid, mis on murdosa tunde, ja paar, mis ületavad 12 tunni piiri. Kui juhtute elama ühes nendest piirkondadest, siis palun vabandust, sest minu tarkvara moodustab ainult 24 -tunnised tsoonid. Mõned meist kasutavad ka suveaega, kuid seda ei arvestata tarkvaras automaatselt. See nõuaks tulevaste kuupäevade otsingu tabelit, tarkvara keerukust ja tarkvara uuendamise vajadust, kui ülemineku aastanädalad muutuksid. Selle asemel kasutab riistvara hetkelist kontaktlülitit, et võimaldada ajavööndi hõlpsat seadistamist (UTC nihe).

Samm 7: Skeem

Skeem
Skeem

Skeem on näidatud ülal ja sisaldab 4-bitise 1602 LCD-liidese ühendusi. Raadiosagedusvastuvõtja seeriaandmed on digitaalse loogika tasemel, nii et need on ühendatud otse ühe Arduino andmesisestapiga. Tihvt on tarkvaras konfigureeritud täitma vahetamise katkestamise funktsiooni, et saaksime mõõta impulsi laiusi. GPS TXD väljund on otse ühendatud Arduino RX sisendiga.

Kasutatakse kahte lülitit. Nagu varem mainitud, võimaldab hetkeline kontaktlüliti määrata UTC nihke. Seadistusrežiimi sisenemiseks saab lülitit igal ajal vajutada. Esialgu kuvatakse ekraanil kehtetu UTC nihe “+77”. UTC nihke seadistamise juhiseid leiate jaotisest „Kella tarkvara”.

Teine lüliti on lihtne sisse/välja lüliti. "Väljas" asendis kuvatakse kellaaeg 12-tunnises vormingus (AM/PM) ja "sisse" asendis kuvatakse kellaaeg 24-tunnises vormingus. Seda lülitit saab vormingute vahel vahetamiseks igal ajal muuta.

Kui soovitakse ainult kellafunktsiooni, ei pea RF -vastuvõtja moodulit ühendama. Kui soovitakse ainult ilmastikutingimusi, ei pea GPS -i ja kahte lülitit ühendama.

8. samm: LCD -tarkvara

Kaldun kasutama ühte kahest tüüpi LCD -liidest. Üks on tavaline 4-bitine liides ja teine 3-juhtmeline liides, mis kasutab nihkeregistrit. Kujundasin selle liidese, kui töötasin väikeste PIC -mikrokontrolleritega, millel oli piiratud arv I/O kontakte. Ma kasutasin selle projekti jaoks 4-bitist liidest, kuid mul on oma LCD-fail üldise Arduino LCD-raamatukogu kasutamise asemel. See vähendab mälutarbimist ja koodi keerukust ning võimaldab mul ka koodi muuta selliste konkreetsete projektide jaoks nagu see.

9. samm: kella tarkvara

GPS-seade väljastab standardseid NMEA-0183 lauseid, mis on mitmesugust teavet sisaldavad ASCII stringid. Selle rakenduse jaoks valisin ajainformatsiooni saamiseks GGA lause, kuna seda lauset kasutasin eelmise GPS -projekti jaoks. Teabeväljad NMEA lausetes on eraldatud komadega, nii et pärast GGA lause päise tuvastamist loendaks tarkvara tavaliselt komad ja kutsuks iga soovitud GPS -teabe välja jaoks sobiva rutiini. Siin on vaja ainult ajainformatsiooni ja see on väljal pärast esimest koma, nii et loendamist pole vaja.

Kuus ajanumbrit (HHMMSS) puhverdatakse ja töödeldakse pärast kõigi nende vastuvõtmist. GPS võib varakult väljastada mõned mittetäielikud teated, nii et puhverdamisrutiin kontrollib, kas iga märk on ASCII arvväärtus. Halva tegelase vastuvõtmisel jäetakse sõnum kõrvale. See võib juhtuda ka harvadel juhtudel normaalse töö ajal, eriti kui jadaportide side mõnevõrra katkeb. Olen seda ainult korra näinud ja juhtus vaid see, et aeg peatus sekundiks ja hüppas seejärel ühe sekundi asemel kaks sekundit.

Kui tarkvara on konfigureeritud kuvama ainult kellaaega, kuvatakse vedelkristallekraani esimesel real kohalik aeg ja teisel real UTC. UTC puhul saadab tarkvara lihtsalt ASCII märgid otse kuvamisrutiini, lisades koolonid (:).

UTC teisendamiseks kohalikuks ajaks tuleb rakendada UTC nihet (ajavöönd). Kuna GPS -i UTC aeg on ASCII -vormingus, teisendab tarkvara ASCII -tunni märgid kümnendkohaks ja lisab seejärel UTC -nihke. UTC nihe salvestatakse positiivse BCD väärtusena koos märgi bitiga, nii et see teisendatakse esmalt täisarvuks ja seejärel negatiivsena, kui märgibitt on seatud. Kui kohaliku kellaaja väärtus on arvutatud, kasutatakse otsingutabelit selle teisendamiseks BCD -ks ja seejärel teisendatakse BCD kuvamiseks tagasi ASCII -ks. Otsingutabel peab hakkama saama 24-tunnise UTC-vorminguga ja +/- 12 ajavööndiga. Selleks on ajavööndite arvestamiseks UTC ajad 0000 kuni 2300 tabeli keskmised 24 kirjet, 12 kirjet enne ja 12 kirjet pärast seda. Üks tabel on 12-tunnises vormingus, nii et lisasin ka otsingu tabeli ekraani AM/PM osa jaoks. Teine tabel on 24-tunnises vormingus. Nagu varem mainitud, võimaldab sisse/välja lüliti valida 12- või 24-tunnise vormingu.

Ajavöönd otsitakse EEPROM -ist initsialiseerimise ajal ja kuvatakse lühidalt. Kui seda pole vähemalt korra määratud, kutsutakse sisse seadistusrutiin. Seadistusrutiini saab ka igal ajal välja kutsuda, vajutades hetkelist kontaktlülitit. Seadistusrutiin lähtestab ekraani olekule „UTC OFFSET +77”. Lüliti lühike vajutamine muudab väärtuseks “-00”. Kui nõutakse positiivset ajavööndit, muudab teine lühike vajutus väärtuseks „+00”. Pikk vajutus (> 1 sekund) viib seadistusrežiimi järgmisele sammule. Sel hetkel suurendab iga lühike vajutus ajaväärtust maksimaalselt 12. Pärast soovitud ajavööndi saavutamist vajutage ja hoidke lülitit kauem kui 1 sekund ja seejärel vabastage see. Tarkvara salvestab seejärel UTC väärtuse EEPROM -i ja kuvab lühidalt „OFFSET SAVED”. Kui teete sisenemise ajal vea, väljuge ja vajutage selle lähtestamiseks uuesti lülitit.

NEO-6M ei vaja aja väljastamiseks head asukoha määramist, nii et see peaks sõnumeid väljastama kohe, kui saab ühe satelliidi. Seni kuvatakse ekraanil kiri “NO DATA”.

10. samm: ilmastikutarkvara

PIC -mikrokontrolleril on võimalik välise impulsi abil taimer sisse/välja lülitada. Sama sisendimpulssi saab kasutada ka välise katkestusena, et anda märku impulsi kestuse lugemisest. Arduinol pole seda täpset võimalust, nii et kasutasin vahetamise katkestamise funktsiooni. RF -teate impulsi ühel serval salvestab katkestuste käitleja praeguse mikrosekundilise aja. Vastaservas arvutatakse kulunud aeg impulsi laiuse määramiseks.

Tarkvaral on „DEBUG” määratlus, mis võimaldab kuvada vastuvõetud sõnumite töötlemata andmete vormingut. Samuti on määratletud RF -vastuvõtja jadavoo Arduino sisendpinna määramine. Tarkvara on loodud selleks, et arvutada selle määratluse põhjal sobivad muudatuste katkestamise registri seaded. Arvutus töötab ainult Arduino digitaalsete tihvtide puhul. Selle asemel võiks kasutada analoogpinge, kuid see nõuaks registriväärtuste rasket kodeerimist.

Katkestuste käitleja otsustab, kas jäädvustatud arv on piisavalt pikk, et olla stardipulss. Nagu varem mainitud, on mitme sõnumi vahe 2 ms, nii et tarkvara otsib seda. Kogu 433 MHz liikluse tõttu tagab tarkvara esialgne sõelumine, et mõõdetud aeg on vähemalt 1,8 ms, kuid mitte suurem kui 2,4 ms. Pärast alguse tuvastamist otsib tarkvara sünkroonimisbitte (600us) ja loeb, veendumaks, et neli neist on vastu võetud. Kui need testid on läbitud, otsib tarkvara õiged bitiajad 200us ja 400us.

Vastuvõetud bitid vormitakse baitideks ja iga bait salvestatakse. Pärast seitsme baidi vastuvõtmist kontrollitakse sõnumi kontrollsumma enne edasise töötlemise lubamist. Kui soovitakse väljastada toorbaite (silumisrežiim), teisendatakse baidid ASCII tähemärkideks ja saadetakse LCD -ekraanile. Kui soovitakse niiskuse ja temperatuuri väljundeid, viiakse läbi vastavad teisendused.

RF-sõnumis olevad kaks baiti Celsiuse kraadi andmeid on 11-bitise väärtuse moodustamiseks kokku segatud. Alumist osa nihutatakse ühe bitti vasakule, et kõrvaldada paarsusbitt ja joondada see ülemise osa bittidega. Kaks baiti moodustatakse 16-bitiseks sõna muutujaks ja seejärel nihutatakse kogu asi ühe bitti lõplikult, et saada lõplik joondus. Seejärel teisendatakse sõna muutuja matemaatiliste arvutuste jaoks ujukoma muutujaks.

Üks suur eelis C ++ kasutamisel Arduino -s võrreldes PIC -i koostamiskeelega on see, et see lihtsustab matemaatilisi arvutusi. Nagu varem mainitud, on temperatuurimuutus (C / 10) -100. Tulemus teisendatakse stringiks ja saadetakse kuvamiseks LCD -le. Fahrenheiti arvutus on (C * 1,8) + 32. Tulemus teisendatakse uuesti stringiks ja saadetakse kuvamiseks LCD -ekraanile. Mõlemal juhul sisaldab Stringi teisendus negatiivset märki (kui see on asjakohane) ja koma. Kümnendkoha suhtes kontrollitakse, kas pärast kümnendkoha kuvamist kuvatakse ainult üks märk. See kontroll on vajalik, kuna string võib olla vahemikus 3 kuni 5 tähemärki.

Mul on kaks AcuRite andurit, nii et lisasin tarkvarasse kontrolli, et ühe andmed ei kirjutaks teise andmeid üle, kui tarkvara on seadistatud tegema ainult ilmastikutingimusi. Esimene andur, mis saadi pärast sisselülitamist, kuvatakse 1. real ja teine 2. real. Silumisrežiimi kasutades näen iga anduri ID -d, et saaksin koodi lihtsalt kontrollida, kui soovis ühe neist andmeid töödelda.

Tarkvara jälgib aku olekut (bait3) ja kuvab teate, kui aku on tühi. See teade kirjutab üle kõik muud selle anduri andmed.

11. samm: kuvab

Kuvab
Kuvab
Kuvab
Kuvab
Kuvab
Kuvab

Siin on mõned näited erinevate funktsioonide kohta. Mul on veel mõned juhised, kuid enamiku minu PIC -mikrokontrollerite projektidest leiate minu veebisaidilt: www.boomerrules.wordpress.com

Soovitan: