Shfaqja e kohës dhe motit Arduino 3 në 1: 11 hapa
Shfaqja e kohës dhe motit Arduino 3 në 1: 11 hapa
Anonim

Ndiqni më shumë nga autori:

Duke përdorur ATtiny85
Duke përdorur ATtiny85
Duke përdorur ATtiny85
Duke përdorur ATtiny85
Pi Powered Pie Partitioning dhe Polygon Pruning Tool
Pi Powered Pie Partitioning dhe Polygon Pruning Tool
Pi Powered Pie Partitioning dhe Polygon Pruning Tool
Pi Powered Pie Partitioning dhe Polygon Pruning Tool
Kontrollet dixhitale për një përforcues audio manual
Kontrollet dixhitale për një përforcues audio manual
Kontrollet dixhitale për një përforcues audio manual
Kontrollet dixhitale për një përforcues audio manual

Më pëlqejnë mikrokontrolluesit PIC dhe më pëlqen programimi në gjuhën e asamblesë. Në fakt, gjatë dy viteve të fundit, unë kam postuar rreth 40 projekte në faqen time të internetit bazuar në atë kombinim. Kohët e fundit po porosisja disa pjesë nga një nga shitësit e mi të preferuar në SHBA dhe pashë një Arduino Nano, me një kabllo programimi, për vetëm 1.20 dollarë më shumë se një çip i zhveshur i procesorit ATMEGA328. Kështu që bleva disa prej tyre. Pastaj shkarkova Arduino IDE dhe pastrova kujtesën time të programimit ‘C ++’.

Ky projekt është një përzierje e një ore që përdor GPS për kohën dhe një marrës RF që deshifron mesazhet e motit nga një sensor i zakonshëm AcuRite. Rezultati është një ekran i shkallës së vogël të kohës dhe temperaturës. Ora GPS dhe rutinat e motit janë vendosur si skedarë të veçantë, kështu që është e lehtë të futesh në rutinën kryesore dhe ta konfigurosh që të bëjë vetëm funksionin e orës ose vetëm funksionin e motit. Thjesht mos komentoni "#përkufizimin" e duhur në krye të rutinës kryesore nëse dëshironi vetëm një nga funksionet.

Nëse përdoren të dy funksionet, atëherë linja e sipërme e LCD -së shfaq kohën lokale dhe rreshti i poshtëm i LCD -së shfaq lagështinë dhe temperaturën në Celsius dhe Fahrenheit. Nëse përdoret vetëm funksioni i orës, atëherë rreshti i lartë tregon kohën lokale dhe ai i fundit shfaq UTC. Nëse përdoret vetëm funksioni i motit, atëherë në vijën e sipërme shfaqet sensori i parë i marrë dhe në fund shfaqet çdo sensor tjetër i marrë. Unë e shtova atë aftësi sepse kam dy sensorë moti.

Hapi 1: Sensori i motit

Sensori i motit
Sensori i motit
Sensori i motit
Sensori i motit
Sensori i motit
Sensori i motit

Sensori i motit AcuRite i përdorur këtu dërgon informacion mbi temperaturën dhe lagështinë çdo 16 sekonda. Në anën e pasme tregon një numër modeli 000592TXR, por zakonisht reklamohet si model 06002M. Ky sensor përdoret nga shumë modele të ndryshme të stacioneve të motit, kështu që është e lehtë për tu gjetur dhe unë kam qenë në gjendje t'i marr ato në eBay për nën 20 dollarë. AcuRite shet sensorë me pamje të ngjashme për disa nga stacionet e tyre të motit, por ata mund ose nuk mund t'i përmbahen të njëjtit protokoll komunikimi. Ekziston një indikacion në internet që sensori i temperaturës 00606 përdor të njëjtin format mesazhi, por me një bajt lagështie të pavlefshëm.

Siç shihet në formën e parë të valëve të treguar më lart, mesazhet e motit dërgohen me breshëri me një boshllëk 2ms midis mesazheve të njëpasnjëshme. Forma e dytë e valës e treguar më lart zgjeron një pjesë të një mesazhi në mënyrë që të shihen kohëzgjatjet dhe modelet e bitit. Ekzistojnë katër bite sinkronizimi që janë rreth 600us të larta të ndjekura nga 600us të ulëta. Bitet e të dhënave përfaqësohen nga 400us lartë e ndjekur nga 200us e ulët (1) ose 200us e lartë e ndjekur nga 400us e ulët (0).

Formati i mesazhit përbëhet nga 7 bajt të dhëna. Dy bajtët e parë janë ID e sensorit dhe këto nuk ndryshojnë (dmth.: Nuk përdor një kod kodrirës). Bajti i fundit është një kontroll shtesë i thjeshtë shtesë i gjashtë bajtëve të parë. Bajti i tretë është një tregues i nivelit të baterisë dhe duhet të jetë gjithmonë 44 heks nëse bateria është e mirë. Bajti i katërt është lagështia dhe është një vlerë e pa-shkallëzuar midis 0 dhe 99. isshtë e rëndësishme të kihet parasysh se biti më domethënës i byteve 4, 5 dhe 6 është një bit pariteti dhe nuk është pjesë e matjes vlerat. Bytes 5 dhe 6 janë temperatura e shkallëzuar (Celsius) me 4 bitët më të ulët të bajtit 5 të bashkuar me 7 bitët e ulët të bajtit 6 për të formuar një vlerë 11-bit. Temperatura përfaqësohet gjithmonë si një numër pozitiv dhe bëhet negative vetëm kur aplikohet shkallëzimi. Shkallëzimi është (C / 10) - 100. Pjesëtimi me 10 kërkohet sepse zgjidhja e temperaturës është në të dhjetat e një shkalle. Zbritja kërkohet sepse 100 shtohet nga sensori në mënyrë që të mbajë vlerën e transmetuar pozitive.

Hapi 2: Marrësi RF

Marrës RF
Marrës RF
Marrës RF
Marrës RF

Moduli RF që përdor për këtë projekt është RXB6. Shtë një marrës super heterodinë në krahasim me marrësit super rigjenerues më pak të dëshirueshëm. Nëse shikoni modulet e lira RF atje, do të gjeni se bordet e transmetuesit dhe marrësit shpesh janë të bashkuar së bashku. Shumica e atyre marrësve të paketuar janë lloje super rigjeneruese, kështu që ata kanë tendencë të kenë karakteristika shumë më të ulëta të performancës (përfshirë gamën) sesa marrësit super heterodinë. Ne kemi nevojë vetëm për modulin e marrësit për këtë projekt sepse do të marrim sinjale nga një transmetues i sensorit të motit.

Hapi 3: Antenat RF

Antenat RF
Antenat RF

RXB6 nuk vjen me një antenë. Ju mund të blini disa nga ato spirale mjaft lirë, por është gjithashtu e lehtë të bëni antenën tuaj. Në fakt, një kabllo kërcyesi i bordit të bukës mund të rrëshqasë në kunjin e antenës së modulit nëse nuk doni të bëheni shumë të dashur. Në mënyrë ideale, një antenë me tela të drejtë do të ishte 1/4 gjatësi vale e cila funksionon në rreth 6.8 inç. Fillimisht bëra gjënë me tela bluzë dhe nuk e kisha problem të merrja sensorin tim të jashtëm edhe pse punëtoria ime elektronike është në bodrumin tim.

Një mundësi tjetër është të bëni antenën tuaj spirale. Ekzistojnë një sërë planet për këtë në internet, por ai që tregohet në foton më lart është ajo që kam bërë. Kam përdorur një tel të ngurtë me bërthamë nga një copë copë kabllo Ethernet dhe e mbështjell atë rreth kreshtës së lëmuar të një stërvitje 5/32 inç. Lëreni izolimin të ndezur përveç majës që ngjitet në tabelën RF. Do t'ju duhen 20 kthesa. Ju gjithashtu mund të përdorni një stërvitje 7/32 inç dhe të përfundoni në vend të saj 17 kthesa. Secila nga këto ndoshta do të funksionojë mirë për gamën që ka të ngjarë të keni për sensorët tuaj. Çelësi i vërtetë është të kesh një marrës të mirë RF për të filluar. Sensorët AcuRite gjithashtu kanë transmetues mjaft të fortë.

Hapi 4: Protokolli i Komunikimit RF

Ekzistojnë disa teknika të ndryshme modulimi për transmetimin e të dhënave, por këta sensorë përdorin më të thjeshtën që është OOK (çelës-çelës) ose ASK (çelës amplitudë-zhvendosje). Meqenëse kemi të bëjmë me bitët e të dhënave 0/1 në këtë shembull, amplituda është e ndezur ose e plotë. Pra, për qëllimet tona, OOK dhe ASK janë të njëjta sepse OOK do të thotë që transportuesi RF është ose i ndezur ose i fikur plotësisht. Formati i mesazhit në përgjithësi përcaktohet nga prodhuesi i pajisjes transmetuese dhe ata mund të përdorin pothuajse çdo shpejtësi transmetimi, çdo stil të formatimit të bitit dhe çdo gjatësi mesazhi. Brezi 433-MHz është i mbushur plot me transmetime për gjëra të tilla si matësa inteligjentë, etj. Kështu që softueri duhet të akordohet për të filtruar vetëm për formatin e mesazhit që duam të përdorim.

Hapi 5: Të dhënat e kohës

Të dhënat e kohës
Të dhënat e kohës

Unë përdor një njësi të lirë GPS për të marrë të dhëna të sakta kohore që do të rinisen automatikisht pas një ndërprerje të energjisë. Unë kam disa njësi GPS (pa ekrane) që nxjerrin fjalitë standarde NMEA por më e vogla dhe më e lirë e njësive që kam është NEO-6M. Moduli NEO-6M është i lehtë për tu ndërlidhur me Arduino sepse përdor një port serial të nivelit TTL. Dallimi i vetëm i vërtetë është se standardi NMEA përcakton një normë seri të baudit prej 4800, por NEO-6M parazgjedhje në 9600 baud. Ju mund të ekzekutoni programin falas "u-center" për të ndryshuar normën e baudit, por unë sapo e lashë atë në paracaktimin e fabrikës. Ekziston gjithashtu një program falas i shërbimeve i quajtur GPSInfo (i publikuar nga Globalsat) që është shumë i dobishëm për të parë informacionin GPS në PC. Mund ta lidhni njësinë GPS me një kabllo standard USB në TTL për ta kontrolluar atë ose për ta konfiguruar duke përdorur një kompjuter. Mbani në mend se çipi GPS në modul në të vërtetë funksionon me 3.3 volt (përmes një rregullatori të tensionit në bord), kështu që nëse doni të lidheni me portën e tij RXD, duhet të zhvendoseni nivelin nga 5 volt. Porta TXD mund të lidhet drejtpërdrejt me Arduino ose PC.

Hapi 6: Zonat kohore

Shfaqja e kohës GPS është një gjë e lehtë për t'u bërë për sa kohë që ju thjesht dëshironi të shfaqni UTC (Koha e Koordinuar Universale). Fjalitë NMEA përbëhen nga karaktere ASCII të cilat mund të dalin drejtpërdrejt në LCD. Pjesa e kohës është në formatin HHMMSS. FF (orë, minuta, sekonda dhe sekonda të pjesshëm). Për orën tonë, pjesa e pjesshme nuk është e dobishme, kështu që gjithçka me të cilën duhet të merremi është gjashtë karaktere. Problemi është se atëherë ju duhet të konvertoheni në kohën tuaj lokale dhe në një format 12-orësh AM/PM nëse e dëshironi këtë. Por ndonjëherë problemet janë ato që e bëjnë jetën interesante, kështu që kjo është ajo që është ajo pjesë e softuerit.

Sa i përket zonave kohore, ju mund të mendoni se thjesht do të ishin 24 prej tyre me 12 prej tyre në lindje të vendndodhjes UTC (+ zona) dhe 12 prej tyre në perëndim të vendndodhjes UTC (- zona). Në fakt, ka disa nga ato të çuditshme që janë orë të pjesshme dhe një çift që tejkalojnë "limitin" prej 12 orësh. Nëse ju ndodh që të jetoni në njërën nga ato zona ju kërkoj falje sepse softueri im llogaritet vetëm për zonat e tëra 24 orësh. Ekzistojnë gjithashtu disa prej nesh që përdorin Kohën e Dimrit gjatë një viti, por kjo nuk llogaritet automatikisht në softuer. Kjo do të kërkonte një tabelë kërkimi të datave të ardhshme, kompleksitet shtesë në softuer dhe nevojën për të azhurnuar softuerin nëse javët e vitit për kalimin ndryshonin. Në vend të kësaj, hardueri përdor një çelës kontakti të çastit për të lejuar vendosjen e lehtë të zonës kohore (offset UTC).

Hapi 7: Skematike

Skematike
Skematike

Skema është treguar më lart dhe përfshin lidhjet për një ndërfaqe LCD 4-bit 1602. Të dhënat serike nga marrësi RF janë në nivele logjike dixhitale, kështu që lidhen drejtpërdrejt me një nga kunjat e hyrjes së të dhënave Arduino. Kunja është e konfiguruar në softuer për të kryer një funksion ndërprerje në ndryshim në mënyrë që të mund të masim gjerësinë e pulsit. Dalja GPS TXD lidhet drejtpërdrejt me hyrjen Arduino RX.

Janë përdorur dy ndërprerës. Siç u përmend më herët, një ndërprerës i çastit i kontaktit lejon vendosjen e kompensimit të UTC. Çelësi mund të shtypet në çdo kohë për të hyrë në modalitetin e caktuar. Fillimisht, ekrani do të tregojë një kompensim të pavlefshëm të UTC të "+77". Referojuni seksionit "Programi i orës" për udhëzimet e vendosjes së kompensimit të UTC.

Çelësi i dytë është një çelës i thjeshtë ndezje/fikje. Në pozicionin "off" koha do të shfaqet në formatin 12-orësh (AM/PM) dhe në pozicionin "on" koha do të shfaqet në formatin 24-orësh. Ky çelës mund të ndryshohet në çdo kohë për të kaluar midis formateve.

Nëse dëshironi vetëm funksionin e orës, atëherë moduli i marrësit RF nuk ka nevojë të lidhet. Nëse dëshironi vetëm funksionin e motit, atëherë GPS dhe dy ndërprerës nuk kanë nevojë të lidhen.

Hapi 8: Softueri LCD

Unë prirem të përdor një nga dy llojet e ndërfaqeve LCD. Njëra është ndërfaqja standarde 4-bit dhe tjetra është një ndërfaqe me 3 tela që përdor një regjistër ndërrimi. Unë e krijova atë ndërfaqe kur punoja me mikrokontrollues të vegjël PIC që kishin një numër të kufizuar të kunjave I/O. Kam përdorur ndërfaqen 4-bit për këtë projekt, por kam skedarin tim LCD të përfshirë në vend që të përdor bibliotekën e përgjithshme Arduino LCD. Kjo zvogëlon konsumin e kujtesës dhe kompleksitetin e kodit dhe gjithashtu më lejon të ndryshoj kodin për projekte të veçanta si ky.

Hapi 9: Softueri i orës

Njësia GPS nxjerr fjali standarde NMEA-0183 të cilat janë vargje ASCII që përmbajnë një larmi informacioni. Për këtë aplikacion zgjodha fjalinë GGA për të marrë informacionin e kohës sepse kjo është fjalia që kam përdorur për një projekt të mëparshëm GPS. Fushat e informacionit në fjalitë NMEA ndahen me presje, kështu që pasi të zbulohet titulli i fjalisë GGA, softveri normalisht do të numëronte presje dhe do të thërriste rutinën e duhur për secilën fushë të dëshiruar të informacionit GPS. Këtu nevojitet vetëm informacioni i kohës dhe ai është në terren pas presjes së parë, kështu që nuk nevojitet numërim.

Gjashtë shifrat kohore (HHMMSS) janë ruajtur dhe përpunuar pasi të jenë marrë të gjitha. GPS mund të nxjerrë disa mesazhe jo të plota herët, kështu që rutina buffering verifikon që secili karakter është një vlerë numerike ASCII. Nëse merret një karakter i keq, mesazhi hidhet poshtë. Kjo gjithashtu mund të ndodhë në raste të rralla gjatë funksionimit normal, veçanërisht nëse komunikimi i portit serik bie pak. Unë e kam parë këtë vetëm një herë dhe gjithçka që ndodhi është se koha u ndal për një sekondë dhe pastaj u hodh dy sekonda në vend të një.

Nëse softueri është i konfiguruar që të shfaqë vetëm kohën, atëherë rreshti i parë i LCD do të shfaqë kohën lokale dhe rreshti i dytë do të shfaq UTC. Për UTC, softueri thjesht dërgon personazhet ASCII direkt në rutinën e shfaqjes, me dy pika (:) të futura në mënyrë të përshtatshme.

Për të konvertuar UTC në kohën lokale, duhet të aplikohet kompensimi (zona kohore) e UTC. Për shkak se koha UTC nga GPS është në formatin ASCII, softueri i kthen personazhet e orës ASCII në dhjetore dhe më pas shton kompensimin e UTC. Kompensimi UTC ruhet si një vlerë pozitive BCD me një bit shënues kështu që së pari konvertohet në një vlerë të plotë dhe më pas mohohet nëse biti i shenjës është vendosur. Pasi të llogaritet vlera e orës lokale të kohës, një tabelë kërkimi përdoret për ta kthyer atë në BCD, dhe pastaj BCD kthehet përsëri në ASCII për t'u shfaqur. Tabela e kërkimit duhet të trajtojë formatin 24-orësh UTC, si dhe +/- 12 zona kohore. Për ta bërë këtë, kohët e UTC nga 0000 në 2300 zënë 24 hyrjet e mesme në tabelë me 12 shënime para dhe 12 hyrje pas për të llogaritur zonat kohore. Një tabelë është në format 12-orësh, kështu që shtova gjithashtu një tabelë kërkimi për pjesën AM/PM të ekranit. Tabela tjetër është në formatin 24-orësh. Siç u përmend më herët, një çelës on/off lejon zgjedhjen e formatit 12-orësh ose 24-orësh.

Zona kohore merret nga EEPROM gjatë fillimit dhe shfaqet shkurtimisht. Nëse nuk është vendosur të paktën një herë, atëherë quhet rutina e cilësimit. Rutina e cilësimit gjithashtu mund të thirret në çdo kohë duke shtypur çelësin e kontaktit momental. Rutina e cilësimeve do të inicializojë ekranin në "UTC OFFSET +77". Një shtypje e shkurtër e çelësit do të ndryshojë vlerën në "-00". Nëse kërkohet një zonë kohore pozitive, atëherë një shtyp tjetër i shkurtër do të ndryshojë vlerën në "+00". Një shtypje e gjatë (> 1 sekondë) do të zhvendosë modalitetin e cilësimit në hapin tjetër. Në këtë pikë çdo shtypje e shkurtër do të rrisë vlerën e kohës deri në një maksimum prej 12. Pasi të keni arritur zonën kohore të dëshiruar, shtypni dhe mbani çelësin për më shumë se 1 sekondë dhe më pas lëshojeni. Softueri më pas do të ruajë vlerën UTC në EEPROM dhe do të shfaqë shkurtimisht "OFFSET SAVED". Nëse bëni një gabim gjatë hyrjes, thjesht dilni dhe pastaj shtypni përsëri çelësin për ta rivendosur atë.

NEO-6M nuk kërkon një rregullim të mirë të pozicionit në mënyrë që të nxjerrë kohën, kështu që duhet të nxjerrë mesazhe sapo të marrë një satelit. Deri atëherë ekrani do të lexojë "JO TAT DHNA".

Hapi 10: Softueri i motit

Mikrokontrolluesi PIC ka aftësinë për të aktivizuar/fikur një kohëmatës duke përdorur një impuls të jashtëm. I njëjti impuls hyrës mund të përdoret gjithashtu si një ndërprerje e jashtme për të sinjalizuar një lexim të kohëzgjatjes së pulsit. Arduino nuk e ka atë aftësi të saktë, kështu që unë përdor funksionin ndërprerje në ndryshim. Në njërën anë të pulsit të mesazhit RF koha aktuale e mikrosekondit ruhet nga mbajtësi i ndërprerjes. Në skajin e kundërt koha e kaluar llogaritet për të përcaktuar gjerësinë e impulsit.

Softueri ka një përcaktim "DEBUG" që lejon shfaqjen e formatit të papërpunuar të të dhënave të mesazheve të marra. Ekziston gjithashtu një përcaktim për të specifikuar pinin e hyrjes Arduino për rrjedhën serike nga marrësi RF. Softueri është krijuar për të llogaritur cilësimet e duhura të regjistrit të ndërprerjes në ndryshim bazuar në këtë përcaktim. Llogaritja funksionon vetëm për kunjat dixhitale Arduino. Një pin analog mund të përdoret në vend, por që do të kërkonte kodim të vështirë të vlerave të regjistrit.

Trajtuesi i ndërprerjes përcakton nëse numërimi i kapur është mjaft i gjatë për të qenë një impuls fillestar. Siç u përmend më herët, hendeku midis mesazheve të shumëfishta është 2ms kështu që kjo është ajo që kërkon softueri. Për shkak të të gjithë trafikut 433-MHz, shqyrtimi fillestar në softuer siguron që koha e matur të jetë së paku 1.8ms, por jo më e madhe se 2.4ms. Pasi të zbulohet fillimi, programi kërkon bitët e sinkronizimit (600us) dhe numëron për t'u siguruar që katër prej tyre janë marrë. Pasi të kalojnë këto teste, softueri kërkon kohën e duhur të bitëve 200us dhe 400us.

Bitet e marra formohen në byte dhe secili bajt ruhet. Pasi të jenë marrë shtatë byte, mesazhi verifikues i mesazhit verifikohet para se të lejohet përpunimi i mëtejshëm. Nëse bajtët e papërpunuar do të dalin (modaliteti i korrigjimit), atëherë bajtët konvertohen në karaktere ASCII dhe dërgohen në LCD. Nëse dëshirohet dalja e lagështirës dhe temperaturës, atëherë kryhen konvertimet e duhura.

Dy bajtët e të dhënave Centigrade në mesazhin RF grumbullohen së bashku për të formuar një vlerë 11-bit. Pjesa e poshtme zhvendoset majtas një bit për të eleminuar bitin e barazisë dhe për ta rreshtuar atë me copat në pjesën e sipërme. Dy bajtet formohen në një variabël të fjalës 16-bit dhe pastaj e gjithë gjë zhvendoset drejtë një bit për të marrë shtrirjen përfundimtare të bitit. Fjala variabël më pas shndërrohet në një ndryshore të pikës lundruese për llogaritjet e matematikës.

Një avantazh i madh i përdorimit të C ++ në gjuhën Arduino kundrejt asamblesë në PIC është se thjeshton llogaritjet matematikore. Siç u përmend më herët, konvertimi në Centigrad është (C / 10) -100. Rezultati konvertohet në një varg dhe dërgohet në ekranin LCD. Llogaritja e Fahrenheit është (C * 1.8) + 32. Rezultati kthehet përsëri në një varg dhe dërgohet në LCD për shfaqje. Në të dy rastet, konvertimi i String përfshin shenjën negative (nëse është e përshtatshme) dhe pikën dhjetore. Bëhet një kontroll për pikën dhjetore për të siguruar që vetëm një karakter pasi të jetë dërguar dhjetori në ekran. Ky kontroll është i nevojshëm sepse vargu mund të shkojë nga 3 në 5 karaktere në gjatësi.

Unë kam dy sensorë AcuRite, kështu që shtova një kontroll në softuer për të siguruar që të dhënat për njërin të mos i mbivendosin të dhënat për tjetrën, nëse softueri është vendosur të bëjë vetëm funksionin e motit. Sensori i parë i marrë pas ndezjes shfaqet në linjën 1 dhe tjetri shfaqet në linjën 2. Duke përdorur modalitetin e korrigjimit, unë mund të shoh se çfarë është ID për secilin sensor, kështu që unë mund të bëj një kontroll të thjeshtë në kod nëse vetëm donte të përpunonte të dhëna nga njëra prej tyre.

Softueri monitoron gjendjen e baterisë (byte3) dhe shfaq një mesazh nëse tregon një bateri të ulët. Ky mesazh mbishkruan të gjitha të dhënat e tjera për atë sensor.

Hapi 11: Shfaqet

Shfaqet
Shfaqet
Shfaqet
Shfaqet
Shfaqet
Shfaqet

Këtu janë disa shembuj të shfaqjeve për funksionet e ndryshme. Unë kam disa udhëzime të tjera, por shumica e projekteve të mia të mikrokontrolluesve PIC mund të gjenden në faqen time në internet: www.boomerrules.wordpress.com