Sisällysluettelo:

Arduino 3-in-1 Aika- ja säänäyttö: 11 vaihetta
Arduino 3-in-1 Aika- ja säänäyttö: 11 vaihetta

Video: Arduino 3-in-1 Aika- ja säänäyttö: 11 vaihetta

Video: Arduino 3-in-1 Aika- ja säänäyttö: 11 vaihetta
Video: Lesson 02 Arduino IDE Software | Robojax Arduino Step By Step Course 2024, Heinäkuu
Anonim

Seuraa lisää tekijältä:

ATtiny85: n käyttäminen
ATtiny85: n käyttäminen
ATtiny85: n käyttäminen
ATtiny85: n käyttäminen
Pi Powered Pie Partitioning ja Polygon Leikkaustyökalu
Pi Powered Pie Partitioning ja Polygon Leikkaustyökalu
Pi Powered Pie Partitioning ja Polygon Leikkaustyökalu
Pi Powered Pie Partitioning ja Polygon Leikkaustyökalu
Manuaalisen vahvistimen digitaaliset säätimet
Manuaalisen vahvistimen digitaaliset säätimet
Manuaalisen vahvistimen digitaaliset säätimet
Manuaalisen vahvistimen digitaaliset säätimet

Pidän PIC -mikrokontrollereista ja pidän ohjelmoinnista kokoonpanokielellä. Itse asiassa olen parin viime vuoden aikana julkaissut verkkosivustolleni noin 40 projektia yhdistelmän perusteella. Äskettäin tilasin joitain osia yhdeltä suosikkiyhtiöltäni Yhdysvalloista ja huomasin Arduino Nanon, jossa oli ohjelmointikaapeli, vain 1,20 dollaria enemmän kuin paljas ATMEGA328 -suoritin. Ostin siis pari niistä. Sitten latasin Arduino IDE: n ja pyyhin muistini C ++ -ohjelmoinnista.

Tämä projekti on sekoitus kellosta, joka käyttää GPS: ää ajoitukseen, ja RF-vastaanottimen, joka dekoodaa sääilmoitukset tavallisesta AcuRite-anturista. Tuloksena on pienimuotoinen ajan ja lämpötilan näyttö. GPS -kello ja sääohjelmat on määritetty erillisiksi tiedostoiksi, joten on helppo siirtyä päärutiiniin ja määrittää se suorittamaan vain kellotoiminto tai vain säätoiminto. Poista vain asianmukainen "#define" päärutiinin yläosasta, jos haluat vain yhden toiminnoista.

Jos molempia toimintoja käytetään, nestekidenäytön ylärivillä näkyy paikallinen aika ja nestekidenäytön alarivillä kosteus ja lämpötila sekä celsius- että fahrenheit -asteina. Jos käytetään vain kellotoimintoa, ylärivillä näkyy paikallinen aika ja alimmalla rivillä UTC. Jos käytetään vain säätoimintoa, ylärivillä näkyy ensimmäinen vastaanotettu anturi ja alimmalla rivillä kaikki muut vastaanotetut anturit. Lisäsin tämän ominaisuuden, koska minulla on kaksi sääanturia.

Vaihe 1: Säätunnistin

Säätunnistin
Säätunnistin
Säätunnistin
Säätunnistin
Säätunnistin
Säätunnistin

Tässä käytetty AcuRite -sääanturi lähettää lämpötila- ja kosteustietoja 16 sekunnin välein. Takana näkyy mallinumero 000592TXR, mutta sitä mainostetaan yleensä mallina 06002M. Tätä anturia käyttävät monet eri sääasemamallit, joten se on helppo löytää ja sain ne eBayssa alle 20 dollarilla. AcuRite myy saman näköisiä antureita joillekin sääasemilleen, mutta ne voivat noudattaa samaa viestintäprotokollaa tai eivät. Verkossa on viitteitä siitä, että vain lämpötila-anturi 00606 käyttää samaa sanomamuotoa, mutta sillä on virheellinen kosteustavu.

Kuten yllä olevasta ensimmäisestä aaltomuodosta käy ilmi, sääilmoitukset lähetetään purskeina, ja peräkkäisten viestien välissä on 2 ms: n rako. Edellä esitetty toinen aaltomuoto laajentaa osan yhdestä viestistä nähdäkseen bittien kestot ja kuviot. Synkronointibittejä on neljä, joiden korkeus on noin 600US, ja sen jälkeen 600us. Databittejä edustaa 400us korkea, jota seuraa 200us low (1) tai 200us high, jota seuraa 400us low (0).

Viestimuoto koostuu 7 tavusta. Kaksi ensimmäistä tavua ovat anturin tunnus, eivätkä ne muutu (eli se ei käytä rullaavaa koodia). Viimeinen tavu on kuuden ensimmäisen tavun yksinkertainen lisäsumma. Kolmas tavu on akun varaustason ilmaisin, ja sen tulee aina olla 44 heksadesimaalia, jos akku on hyvä. Neljäs tavu on kosteus ja se on skaalaamaton arvo välillä 0 ja 99. On tärkeää pitää mielessä, että tavujen 4, 5 ja 6 merkittävin bitti on pariteettibitti eikä ole osa mittausta. arvot. Tavut 5 ja 6 ovat skaalattu lämpötila (Celsius), ja alempi 4 tavun 5 bittiä on yhdistetty alemman 7 bitin tavuun 6 11-bittisen arvon muodostamiseksi. Lämpötila esitetään aina positiivisena lukuna ja muuttuu negatiiviseksi vasta, kun skaalaus on käytössä. Skaalaus on (C / 10) - 100. Jakaminen 10: llä on pakollista, koska lämpötilan resoluutio on kymmenesosaa. Vähennys on pakollinen, koska anturi lisää 100, jotta lähetetty arvo pysyy positiivisena.

Vaihe 2: RF -vastaanotin

RF -vastaanotin
RF -vastaanotin
RF -vastaanotin
RF -vastaanotin

Tässä projektissa käytettävä RF -moduuli on RXB6. Se on superheterodyne -vastaanotin toisin kuin vähemmän toivottavat super -regeneratiiviset vastaanottimet. Jos katsot halpoja RF -moduuleja, huomaat, että lähetin- ja vastaanotinkortit on usein niputettu yhteen. Useimmat näistä niputetuista vastaanottimista ovat erittäin regeneratiivisia, joten niillä on yleensä paljon alhaisemmat suorituskykyominaisuudet (mukaan lukien alue) kuin superheterodyne -vastaanottimilla. Tarvitsemme vain vastaanotinmoduulia tähän projektiin, koska saamme signaaleja sääanturilähettimestä.

Vaihe 3: RF -antennit

RF -antennit
RF -antennit

RXB6: n mukana ei tule antennia. Voit ostaa kierteisiä melko halvalla, mutta on myös helppo tehdä oma antenni. Itse asiassa leipälevyn hyppykaapeli voidaan liu'uttaa moduulin antennitappiin, jos et halua olla liian hieno. Ihannetapauksessa suora lanka -antenni olisi 1/4 aallonpituutta, joka toimii noin 6,8 tuumaa. Tein aluksi hyppyjohtimen, eikä minulla ollut ongelmia noutaa ulkoanturia, vaikka elektroniikkapajani on kellarissani.

Toinen mahdollisuus on tehdä oma kierteinen antenni. Internetissä on erilaisia suunnitelmia, mutta yllä olevassa kuvassa näkyvä suunnitelma on se, mitä tein. Käytin kiinteää ydinlankaa Ethernet -kaapelin romunpalasta ja kiertelin sen 5/32 tuuman poranterän sileän varren ympärille. Jätä eristys päälle paitsi RF -levyn juottokärki. Tarvitset 20 kierrosta. Voit myös käyttää 7/32 tuuman poranterää ja kääriä sen sijaan 17 kierrosta. Mikä tahansa näistä toimii luultavasti hyvin alueilla, joita sinulla todennäköisesti on antureillesi. Todellinen avain on hyvä RF -vastaanotin aluksi. AcuRite -antureissa on myös melko vahvat lähettimet.

Vaihe 4: RF -tiedonsiirtoprotokolla

Tiedonsiirtoon on olemassa muutamia erilaisia modulaatiotekniikoita, mutta nämä anturit käyttävät yksinkertaisinta, joka on OOK (on-off-keying) tai ASK (amplitudin siirto-avain). Koska tässä esimerkissä käsitellään 0/1 databittejä, amplitudi on täynnä tai pois päältä. OOK ja ASK ovat siis samoja, koska OOK tarkoittaa, että RF -kantoaalto on joko täynnä tai pois päältä. Viestimuodon määrittelee yleensä lähettävän laitteen valmistaja, ja he voivat käyttää melkein mitä tahansa lähetysnopeutta, mitä tahansa bittimuotoilutyyliä ja mitä tahansa viestin pituutta. 433 MHz: n taajuusalue on täynnä lähetyksiä esimerkiksi älykkäille mittareille jne., Joten ohjelmisto on viritettävä suodattamaan vain haluamamme viestimuoto.

Vaihe 5: Aikatiedot

Aikatiedot
Aikatiedot

Käytän halpaa GPS -yksikköä saadakseni tarkat aikatiedot, jotka käynnistyvät automaattisesti uudelleen sähkökatkon jälkeen. Minulla on useita GPS-yksiköitä (ilman näyttöjä), jotka antavat vakiomuotoisia NMEA-lauseita, mutta pienin ja halvin yksikkö, jonka minulla on, on NEO-6M. NEO-6M-moduuli on helppo liittää Arduinoon, koska se käyttää TTL-tason sarjaporttia. Ainoa todellinen ero on se, että NMEA-standardi määrittää sarjaliikenteen siirtonopeuden 4800, mutta NEO-6M: n oletusarvo on 9600 baudia. Voit käyttää ilmaista "u-center" -ohjelmaa muuttaaksesi siirtonopeutta, mutta jätin sen juuri tehdasasetuksiin. On myös ilmainen apuohjelma nimeltä GPSInfo (Globalsatin julkaisema), joka on erittäin kätevä GPS -tietojen katseluun tietokoneella. Voit liittää GPS -laitteen tavalliseen USB -TTL -kaapeliin sen tarkistamista tai asennusta varten tietokoneella. Muista, että moduulin GPS-siru toimii itse asiassa 3,3 voltin jännitteellä (sisäisen jännitesäätimen kautta), joten jos haluat muodostaa yhteyden sen RXD-porttiin, sinun on siirrettävä tasoa alaspäin 5 voltista. TXD -portti voi muodostaa yhteyden suoraan Arduinoon tai tietokoneeseen.

Vaihe 6: Aikavyöhykkeet

GPS -ajan näyttäminen on helppoa, kunhan haluat vain näyttää UTC -ajan (Universal Time Coordinated). NMEA -lauseet koostuvat ASCII -merkeistä, jotka voidaan lähettää suoraan nestekidenäyttöön. Aikaosa on muodossa HHMMSS. FF (tunnit, minuutit, sekunnit ja murto sekunnit). Kellomme murto -osa ei ole hyödyllinen, joten meidän on käsiteltävä vain kuusi merkkiä. Ongelmana on, että sinun on sitten muunnettava paikalliseen aikaan ja 12 tunnin AM/PM-muotoon, jos haluat sen. Mutta joskus ongelmat tekevät elämästä mielenkiintoisen, joten juuri siitä ohjelmiston osasta on kyse.

Mitä tulee aikavyöhykkeisiin, luulisi, että niitä olisi vain 24, joista 12 olisi UTC-sijainnin itäpuolella (+ vyöhykkeet) ja 12 niistä länteen UTC-sijainnista (- vyöhykkeet). Itse asiassa on olemassa muutamia outoja palloja, jotka ovat murto -osa -aikoja, ja pari ylittää 12 tunnin”rajan”. Jos satut asumaan jollakin näistä alueista, pyydän anteeksi, koska ohjelmistoni vastaa vain 24 koko tunnin vyöhykkeistä. Jotkut meistä käyttävät myös kesäaikaa osan vuodesta, mutta sitä ei oteta automaattisesti huomioon ohjelmistossa. Tämä edellyttää hakutaulukkoa tulevista päivämääristä, ohjelmiston monimutkaisuutta ja tarvetta päivittää ohjelmisto, jos siirtymisvuosi muuttuu. Sen sijaan laitteisto käyttää hetkellistä kosketuskytkintä, jotta aikavyöhyke voidaan asettaa helposti (UTC -siirtymä).

Vaihe 7: Kaavio

Kaavamainen
Kaavamainen

Kaavio on esitetty yllä ja sisältää liitännät 4-bittiselle 1602 LCD-liitännälle. RF -vastaanottimen sarjatiedot ovat digitaalisen logiikan tasolla, joten ne on kytketty suoraan yhteen Arduino -tiedonsiirtonasta. Tappi on ohjelmistossa konfiguroitu suorittamaan vaihdon keskeytystoiminto, jotta voimme mitata pulssileveyksiä. GPS TXD -lähtö on kytketty suoraan Arduino RX -tuloon.

Käytössä on kaksi kytkintä. Kuten aiemmin mainittiin, hetkellinen kosketuskytkin mahdollistaa UTC -poikkeaman asettamisen. Kytkintä voidaan painaa milloin tahansa siirtyäksesi asetustilaan. Aluksi näytössä näkyy virheellinen UTC -poikkeama “+77”. Katso “Kello -ohjelmisto” -osiosta UTC -offset -asetusohjeet.

Toinen kytkin on yksinkertainen virtakytkin. "Pois" -asennossa aika näytetään 12 tunnin muodossa (AM/PM) ja "on" -asennossa aika 24 tunnin muodossa. Tätä kytkintä voidaan muuttaa milloin tahansa muodon vaihtamiseksi.

Jos halutaan vain kellotoiminto, RF -vastaanotinmoduulia ei tarvitse liittää. Jos halutaan vain säätoiminto, GPS: ää ja kahta kytkintä ei tarvitse yhdistää.

Vaihe 8: LCD -ohjelmisto

Käytän yleensä kahta LCD -käyttöliittymää. Toinen on vakio 4-bittinen liitäntä ja toinen 3-johtiminen liitäntä, joka käyttää siirtorekisteriä. Suunnittelin tämän käyttöliittymän työskennellessäni pienillä PIC -mikrokontrollereilla, joissa oli rajoitettu määrä I/O -nastoja. Käytin 4-bittistä käyttöliittymää tähän projektiin, mutta minulla on oma nestekidenäytötiedosto sen sijaan, että käyttäisin yleistä Arduinon LCD-kirjastoa. Tämä vähentää muistin kulutusta ja koodin monimutkaisuutta ja mahdollistaa myös koodin säätämisen tämän kaltaisia erityisiä projekteja varten.

Vaihe 9: Kello -ohjelmisto

GPS-yksikkö antaa vakiomallisia NMEA-0183-lauseita, jotka ovat ASCII-merkkijonoja, jotka sisältävät erilaisia tietoja. Tätä sovellusta varten valitsin GGA -lauseen aikatietojen saamiseksi, koska se on lause, jota käytin edellisessä GPS -projektissa. NMEA -lauseiden tietokentät erotetaan pilkuilla, joten ohjelmisto laskee normaalisti pilkut GGA -lauseotsikon havaitsemisen jälkeen ja kutsuu sopivan rutiinin kullekin halutulle GPS -tietokentälle. Täällä tarvitaan vain aikatietoja ja se on kentässä ensimmäisen pilkun jälkeen, joten laskemista ei tarvita.

Kuusi aikanumeroa (HHMMSS) puskuroidaan ja käsitellään sitten, kun ne kaikki on vastaanotettu. GPS saattaa lähettää joitain epätäydellisiä viestejä varhain, joten puskurirutiini varmistaa, että jokainen merkki on ASCII -numeerinen arvo. Jos vastaanotetaan huono merkki, viesti hylätään. Tämä voi tapahtua myös harvoin normaalin käytön aikana, varsinkin jos sarjaporttiviestintä katkeaa hieman. Olen nähnyt tämän vain kerran ja tapahtui vain, että aika pysähtyi hetkeksi ja hyppäsi sitten kaksi sekuntia yhden sijasta.

Jos ohjelmisto on määritetty näyttämään vain ajan näyttö, nestekidenäytön ensimmäisellä rivillä näkyy paikallinen aika ja toisella rivillä UTC. UTC -ohjelmisto lähettää vain ASCII -merkit suoraan näyttörutiinille ja kaksoispisteet (:) lisätään oikein.

Jotta UTC voidaan muuntaa paikalliseksi aikaa, on käytettävä UTC -siirtymää (aikavyöhyke). Koska GPS: n UTC -aika on ASCII -muodossa, ohjelmisto muuntaa ASCII -tunnin merkit desimaaleiksi ja lisää sitten UTC -poikkeaman. UTC -siirtymä tallennetaan positiiviseksi BCD -arvoksi merkkibitin kanssa, joten se muunnetaan ensin kokonaislukuarvoksi ja sitten negatiiviseksi, jos merkkibitti on asetettu. Kun paikallinen aikatuntiarvo on laskettu, hakutaulukkoa käytetään muuntamaan se BCD: ksi ja sitten BCD muunnetaan takaisin ASCII: ksi näytettäväksi. Hakutaulukon on käsiteltävä 24 tunnin UTC-muoto sekä +/- 12 aikavyöhykettä. Tätä varten UTC -ajat 0000 - 2300 täyttävät taulukon keskimmäiset 24 merkintää, 12 merkintää ennen ja 12 merkintää aikavyöhykkeiden huomioon ottamiseksi. Yksi taulukko on 12 tunnin muodossa, joten lisäsin myös hakutaulukon näytön AM/PM-osaan. Toinen taulukko on 24 tunnin muodossa. Kuten aiemmin mainittiin, on/off-kytkin mahdollistaa 12 tunnin tai 24 tunnin muodon valitsemisen.

Aikavyöhyke haetaan EEPROMista alustamisen aikana ja näytetään lyhyesti. Jos sitä ei ole asetettu vähintään kerran, asetusrutiini kutsutaan. Asetusrutiini voidaan myös kutsua milloin tahansa painamalla hetkellistä kosketuskytkintä. Asetusrutiini alustaa näytön "UTC OFFSET +77". Kytkimen lyhyt painallus muuttaa arvon "-00". Jos tarvitaan positiivinen aikavyöhyke, toinen lyhyt painallus muuttaa arvon "+00". Pitkä painallus (> 1 sekunti) siirtää asetustilan seuraavaan vaiheeseen. Tässä vaiheessa jokainen lyhyt painallus kasvattaa aika -arvoa enintään 12. Kun olet saavuttanut halutun aikavyöhykkeen, paina kytkintä yli 1 sekunnin ajan ja vapauta se sitten. Ohjelmisto tallentaa UTC -arvon EEPROMiin ja näyttää hetken näytössä “OFFSET SAVED”. Jos teet virheen syöttämisen aikana, poistu ja paina kytkintä uudelleen nollataksesi sen.

NEO-6M ei vaadi hyvää sijainnin korjausta ajan lähettämiseksi, joten sen pitäisi lähettää viestejä heti, kun se saa yhden satelliitin. Siihen asti näytössä lukee”NO DATA”.

Vaihe 10: Sääohjelmisto

PIC -mikrokontrolleri pystyy sulkemaan ajastimen päälle/pois ulkoisen pulssin avulla. Samaa tulopulssia voidaan käyttää myös ulkoisena keskeytyksenä signaalin lähettämiseksi pulssin kestosta. Arduinolla ei ole täsmällistä ominaisuutta, joten käytin keskeytyksen vaihtotoimintoa. RF -viestipulssin yhdellä reunalla keskeytyksenkäsittelijä tallentaa nykyisen mikrosekunnin ajan. Vastakkaisella reunalla lasketaan kulunut aika pulssin leveyden määrittämiseksi.

Ohjelmistossa on DEBUG -määritelmä, joka mahdollistaa vastaanotettujen viestien raakatietomuodon näyttämisen. On myös määritelty määrittämään Arduino -sisääntulonappi RF -vastaanottimesta peräisin olevalle sarjavirralle. Ohjelmisto on määritetty laskemaan sopivat keskeytysvaihteen rekisteriasetukset tämän määritelmän perusteella. Laskenta toimii vain Arduinon digitaalisille nastoille. Sen sijaan voitaisiin käyttää analogista nastaa, mutta se vaatisi rekisteriarvojen kovaa koodausta.

Keskeytyksen käsittelijä määrittää, onko tallennettu luku tarpeeksi pitkä aloituspulssiksi. Kuten aiemmin mainittiin, useiden viestien välinen ero on 2 ms, joten ohjelmisto etsii sitä. Kaiken 433 MHz: n liikenteen vuoksi ohjelmiston ensimmäinen seulonta varmistaa, että mitattu aika on vähintään 1,8 ms mutta enintään 2,4 ms. Kun käynnistys on havaittu, ohjelmisto etsii synkronointibittejä (600us) ja laskee varmistaakseen, että neljä niistä on vastaanotettu. Kun nämä testit on läpäisty, ohjelmisto etsii oikeat bittiajat 200us ja 400us.

Vastaanotetut bitit muodostetaan tavuiksi ja jokainen tavu tallennetaan. Kun seitsemän tavua on vastaanotettu, sanoman tarkistussumma tarkistetaan ennen jatkokäsittelyn sallimista. Jos raaka tavuja on tarkoitus tulostaa (virheenkorjaustila), tavut muunnetaan ASCII -merkeiksi ja lähetetään nestekidenäyttöön. Jos halutaan kosteus- ja lämpötilalähdöt, suoritetaan asianmukaiset muunnokset.

RF-sanoman kaksi celsiusastetiedon tavua on yhdistetty muodostamaan 11-bittinen arvo. Alaosaa siirretään yksi bitti vasemmalle pariteettibitin poistamiseksi ja kohdistamiseksi yläosan bittien kanssa. Kaksi tavua muodostetaan 16-bittiseksi sanamuuttujaksi, ja sitten koko asia siirretään oikealle yhdellä bitillä lopullisen bittikohdistuksen saamiseksi. Sana muuttuja muunnetaan sitten liukulukumuuttujaksi laskutoimituksia varten.

Yksi suuri etu C ++: n käytöstä Arduinossa verrattuna kokoonpanokieleen PIC: ssä on se, että se yksinkertaistaa matemaattisia laskelmia. Kuten aiemmin mainittiin, Celsius -muunnos on (C / 10) -100. Tulos muunnetaan merkkijonoksi ja lähetetään nestekidenäyttöön näytettäväksi. Fahrenheit -laskelma on (C * 1,8) + 32. Tulos muunnetaan jälleen merkkijonoksi ja lähetetään nestekidenäyttöön näytettäväksi. Kummassakin tapauksessa merkkijonomuunnos sisältää negatiivisen merkin (tarvittaessa) ja desimaalipilkun. Desimaalipiste tarkistetaan sen varmistamiseksi, että vain yksi merkki desimaalin jälkeen lähetetään näyttöön. Tämä tarkistus on tarpeen, koska merkkijono voi olla 3-5 merkkiä pitkä.

Minulla on kaksi AcuRite -anturia, joten lisäsin tarkistuksen ohjelmistoon varmistaakseni, että toisen tiedot eivät korvaa toisen tietoja, jos ohjelmisto on asetettu suorittamaan vain säätoiminto. Ensimmäinen anturi, joka vastaanotettiin virran kytkemisen jälkeen, näytetään rivillä 1 ja toinen näytetään rivillä 2. Käyttämällä virheenkorjaustilaa näen kunkin tunnistimen tunnuksen, jotta voin tarkistaa koodin yksinkertaisesti, jos vain halusi käsitellä yhden niistä tietoja.

Ohjelmisto valvoo akun tilaa (tavu 3) ja näyttää viestin, jos se osoittaa, että akku on vähissä. Tämä viesti korvaa kaikki muut anturin tiedot.

Vaihe 11: Näytöt

Näyttää
Näyttää
Näyttää
Näyttää
Näyttää
Näyttää

Tässä on esimerkkejä eri toimintojen näytöistä. Minulla on muutama muu Instructables, mutta suurin osa PIC -mikrokontrolleriprojekteistani löytyy verkkosivustoltani: www.boomerrules.wordpress.com

Suositeltava: