Sadržaj:

Arduino 3-u-1 prikaz vremena i vremena: 11 koraka
Arduino 3-u-1 prikaz vremena i vremena: 11 koraka

Video: Arduino 3-u-1 prikaz vremena i vremena: 11 koraka

Video: Arduino 3-u-1 prikaz vremena i vremena: 11 koraka
Video: Дедушка не выдержал и дал ответ за Украинский флаг 2024, Srpanj
Anonim

Autor Boomer48Slijedite Više od autora:

Pomoću ATtiny85
Pomoću ATtiny85
Pomoću ATtiny85
Pomoću ATtiny85
Alat za particioniranje i orezivanje poligona s Pi pogonom
Alat za particioniranje i orezivanje poligona s Pi pogonom
Alat za particioniranje i orezivanje poligona s Pi pogonom
Alat za particioniranje i orezivanje poligona s Pi pogonom
Digitalne kontrole za ručno audio pojačalo
Digitalne kontrole za ručno audio pojačalo
Digitalne kontrole za ručno audio pojačalo
Digitalne kontrole za ručno audio pojačalo

Volim PIC mikrokontrolere i volim programiranje na asemblerskom jeziku. Zapravo, u posljednjih nekoliko godina na svojoj sam web stranici objavio oko 40 projekata na temelju te kombinacije. Nedavno sam naručivao neke dijelove od jednog od svojih omiljenih američkih prodavača i ugledao sam Arduino Nano sa kablom za programiranje za samo 1,20 USD više od golog ATMEGA328 procesorskog čipa. Pa sam ih kupio par. Zatim sam preuzeo Arduino IDE i izbrisao sjećanje na programiranje ‘C ++’.

Ovaj projekt je skup sata koji koristi GPS za mjerenje vremena i RF prijemnik koji dekodira vremenske poruke s uobičajenog AcuRite senzora. Rezultat je mali prikaz vremena i temperature. GPS sat i vremenske rutine postavljene su kao zasebne datoteke za uključivanje pa je lako ući u glavnu rutinu i konfigurirati je tako da radi samo funkciju sata ili samo funkciju vremena. Samo uklonite komentar s odgovarajućeg "#define" na vrhu glavne rutine ako želite samo jednu od funkcija.

Ako se koriste obje funkcije, tada gornji redak LCD -a prikazuje lokalno vrijeme, a donji red LCD -a prikazuje vlažnost i temperaturu u Celzijusima i Fahrenheitu. Ako se koristi samo funkcija sata, tada gornji redak prikazuje lokalno vrijeme, a donji redak UTC. Ako se koristi samo vremenska funkcija, tada gornji redak prikazuje prvi primljeni senzor, a donji red prikazuje sve ostale primljene senzore. Dodao sam tu mogućnost jer imam dva vremenska senzora.

Korak 1: Vremenski senzor

Senzor vremena
Senzor vremena
Senzor vremena
Senzor vremena
Senzor vremena
Senzor vremena

Ovdje korišteni AcuRite senzor vremena šalje podatke o temperaturi i vlažnosti zraka svakih 16 sekundi. Na stražnjoj strani prikazuje broj modela 000592TXR, ali se obično oglašava kao model 06002M. Ovaj senzor koristi mnogo različitih modela meteoroloških stanica pa ga je lako pronaći, a uspio sam ga nabaviti na eBayu za manje od 20 USD. AcuRite prodaje senzore sličnog izgleda za neke svoje meteorološke postaje, ali se mogu pridržavati ili ne pridržavati se istog komunikacijskog protokola. Na webu postoje neke naznake da senzor samo za temperaturu 00606 koristi isti format poruke, ali s nevažećim bajtom vlažnosti.

Kao što se vidi u prvom gore prikazanom obliku vala, vremenske se poruke šalju rafalno s razmakom od 2 ms između uzastopnih poruka. Drugi gore prikazani valni oblik proširuje dio jedne poruke kako bi se vidjelo trajanje bita i obrasci. Postoje četiri bita za sinkronizaciju koji su visoki oko 600us, a zatim 600us niski. Bitovi podataka predstavljeni su sa 400us visokim, zatim 200us niskim (1) ili 200us visokim, a zatim 400us niskim (0).

Format poruke sastoji se od 7 bajtova podataka. Prva dva bajta su ID senzora i oni se ne mijenjaju (tj. Ne koristi pokretni kôd). Posljednji bajt je jednostavna aditivna kontrolna suma prvih šest bajtova. Treći bajt je pokazatelj napunjenosti baterije i trebao bi uvijek biti 44 heksadecimalni ako je baterija dobra. Četvrti bajt je vlažnost i to je vrijednost koja nije skalirana između 0 i 99. Važno je imati na umu da je najznačajniji bit bajtova 4, 5 i 6 bit parnosti i nije dio mjerenja vrijednosti. Bajtovi 5 i 6 su skalirana temperatura (Celzijus) s donjim 4 bita bajta 5 koji su spojeni s donjih 7 bitova bajta 6 kako bi oblikovali 11-bitnu vrijednost. Temperatura se uvijek prikazuje kao pozitivan broj i postaje negativna tek kada se primijeni skaliranje. Skaliranje je (C / 10) - 100. Podijeli se s 10 jer je temperaturna razlučivost u desetinama stupnja. Oduzimanje je potrebno jer senzor dodaje 100 kako bi prenesena vrijednost ostala pozitivna.

Korak 2: RF prijemnik

RF prijemnik
RF prijemnik
RF prijemnik
RF prijemnik

RF modul koji koristim za ovaj projekt je RXB6. To je super heterodinski prijemnik za razliku od manje poželjnih super regenerativnih prijemnika. Ako pogledate jeftine RF module vani, vidjet ćete da su odašiljačke i prijemne ploče često povezane zajedno. Većina tih prijemnika u paketu su super regenerativni tipovi pa imaju tendenciju imati mnogo niže karakteristike performansi (uključujući raspon) od super heterodinskih prijemnika. Za ovaj projekt nam je potreban samo prijemni modul jer ćemo dobivati signale s odašiljača vremenskog senzora.

Korak 3: RF antene

RF antene
RF antene

RXB6 ne dolazi s antenom. Neke spiralne možete kupiti prilično jeftino, ali također je lako napraviti vlastitu antenu. Zapravo, kratkospojnik kabela za ploču mogao bi se navući na antenski iglu modula ako ne želite biti previše dopadljivi. U idealnom slučaju, ravna antena bila bi 1/4 valne duljine koja radi na oko 6,8 inča. U početku sam radio na skakačkoj žici i nije mi bilo teško pokupiti vanjski senzor, iako mi je radionica za elektroniku u podrumu.

Druga mogućnost je da sami napravite spiralnu antenu. Postoje različiti planovi za to na webu, ali onaj koji je prikazan na gornjoj slici ja sam napravio. Koristio sam žicu s čvrstom jezgrom iz komadića Ethernet kabela i namotao je oko glatke drške svrdla od 5/32 inča. Ostavite izolaciju uključenu osim vrha koji lemi na RF ploči. Trebat će vam 20 okreta. Također možete upotrijebiti svrdlo promjera 7/32 inča i umjesto toga zamotati 17 zavoja. Bilo koji od ovih će vjerojatno dobro funkcionirati za raspone koje ćete vjerojatno imati za svoje senzore. Pravi ključ je imati dobar RF prijemnik za početak. Senzori AcuRite također imaju prilično jake odašiljače.

Korak 4: RF komunikacijski protokol

Postoji nekoliko različitih tehnika modulacije za prijenos podataka, ali ti senzori koriste najjednostavniji koji je OOK (on-off-keying) ili ASK (amplitude-shift-keying). Budući da se u ovom primjeru bavimo bitovima podataka 0/1, amplituda je uključena ili puna. Dakle, za naše potrebe, OOK i ASK su isti jer OOK znači da je RF operater pun ili uključen. Format poruke općenito definira proizvođač prijenosnog uređaja i oni mogu koristiti gotovo bilo koju brzinu prijenosa, bilo koji stil formatiranja bita i bilo koju duljinu poruke. Opseg od 433-MHz prepun je prijenosa za stvari poput pametnih mjerača itd. Pa softver treba prilagoditi za filtriranje samo za format poruke koji želimo koristiti.

Korak 5: Podaci o vremenu

Podaci o vremenu
Podaci o vremenu

Koristim jeftinu GPS jedinicu kako bih dobio točne podatke o vremenu koji će se automatski ponovno pokrenuti nakon nestanka struje. Imam nekoliko GPS jedinica (bez zaslona) koje emitiraju standardne NMEA rečenice, ali najmanja i najjeftinija jedinica koju imam je NEO-6M. Modul NEO-6M lako se povezuje s Arduinom jer koristi serijski port na razini TTL. Jedina stvarna razlika je u tome što standard NMEA navodi serijsku brzinu prijenosa od 4800, ali NEO-6M prema zadanim postavkama iznosi 9600 bauda. Možete pokrenuti besplatni program "u-center" za promjenu brzine prijenosa, ali samo sam ga ostavio na tvornički zadane postavke. Postoji i besplatni uslužni program pod nazivom GPSInfo (izdao ga Globalsat) koji je vrlo zgodan za pregled GPS informacija na računalu. GPS jedinicu možete spojiti na standardni USB na TTL kabel radi provjere ili postavljanja pomoću računala. Imajte na umu da GPS čip na modulu zapravo radi na 3,3 volta (putem ugrađenog regulatora napona) pa ako se želite spojiti na njegov RXD priključak, trebali biste prebaciti razinu s 5 volti prema dolje. TXD priključak može se izravno povezati s Arduinom ili računalom.

Korak 6: Vremenske zone

Prikazivanje GPS vremena lako je učiniti sve dok samo želite prikazati UTC (Univerzalno koordinirano vrijeme). NMEA rečenice sastavljene su od ASCII znakova koji se mogu izravno iznijeti na LCD. Dio vremena je u formatu HHMMSS. FF (sati, minute, sekunde i djelimične sekunde). Za naš sat razlomljeni dio nije koristan pa sve što trebamo riješiti je šest znakova. Problem je u tome što se tada morate pretvoriti u svoje lokalno vrijeme i u 12-satni AM/PM format ako to želite. No ponekad su problemi ono što čini život zanimljivim pa je to ono o čemu se zapravo radi u tom dijelu softvera.

Što se tiče vremenskih zona, mogli biste pomisliti da bi ih jednostavno bilo 24, od kojih je 12 istočno od UTC lokacije (+ zone) i 12 njih zapadno od UTC lokacije (- zone). Zapravo, postoji nekoliko neobičnih koji su djelimični i par koji prelaze 12 -satno "ograničenje". Ako slučajno živite u jednom od tih područja, ispričavam se jer moj softver obuhvaća samo 24 sata sata. Neki od nas također koriste dio godine za ljetno računanje vremena, ali to se ne računa automatski u softveru. To bi zahtijevalo traženje tablice budućih datuma, dodatnu složenost softvera i potrebu ažuriranja softvera ako se promijene tjedni u godini za prelazak. Umjesto toga, hardver koristi prekidač za trenutni kontakt kako bi se omogućilo jednostavno postavljanje vremenske zone (UTC pomak).

Korak 7: Shematski prikaz

Shematski
Shematski

Shema je prikazana gore i uključuje veze za 4-bitno 1602 LCD sučelje. Serijski podaci s RF prijemnika nalaze se na digitalnoj logičkoj razini pa su izravno spojeni na jedan od Arduino ulaznih pinova podataka. Pin je u softveru konfiguriran za obavljanje funkcije prekida i promjene tako da možemo mjeriti širine impulsa. GPS TXD izlaz izravno je spojen na Arduino RX ulaz.

Koriste se dva prekidača. Kao što je ranije spomenuto, trenutni kontaktni prekidač omogućuje postavljanje UTC pomaka. Prekidač se može pritisnuti u bilo kojem trenutku za ulazak u postavljeni način rada. U početku će se na zaslonu prikazivati nevažeći UTC pomak od "+77". Za upute o postavljanju pomaka UTC pogledajte odjeljak "Softver sata".

Drugi prekidač je jednostavan prekidač za uključivanje/isključivanje. U položaju "isključeno" vrijeme će biti prikazano u 12-satnom formatu (AM/PM), a u položaju "uključeno" vrijeme će biti prikazano u 24-satnom formatu. Ovaj se prekidač može promijeniti u bilo kojem trenutku za prebacivanje između formata.

Ako se želi samo funkcija sata, tada RF prijemnik ne mora biti povezan. Ako se želi samo vremenska funkcija, GPS i dva prekidača ne moraju biti povezani.

Korak 8: LCD softver

Sklon sam koristiti jednu od dvije vrste LCD sučelja. Jedno je standardno 4-bitno sučelje, a drugo je trožilno sučelje koje koristi pomak registara. Dizajnirao sam to sučelje dok sam radio s malim PIC mikrokontrolerima koji su imali ograničen broj I/O pinova. Koristio sam 4-bitno sučelje za ovaj projekt, ali imam vlastitu datoteku za uključivanje LCD-a umjesto korištenja generičke Arduino LCD biblioteke. To smanjuje potrošnju memorije i složenost koda, a omogućuje mi i podešavanje koda za određene projekte poput ovog.

Korak 9: Softver sata

GPS jedinica emitira standardne rečenice NMEA-0183 koje su ASCII nizovi koji sadrže različite informacije. Za ovu aplikaciju odabrao sam GGA rečenicu kako bih dobio informacije o vremenu jer je to rečenica koju sam koristio za prethodni GPS projekt. Polja informacija u rečenicama NMEA -e odvojena su zarezima pa će softver, nakon što se otkrije zaglavlje rečenice GGA, softver normalno brojati zareze i pozivati odgovarajuću rutinu za svako željeno polje GPS informacija. Ovdje su potrebne samo informacije o vremenu, koje se nalaze u polju nakon prve zareze, tako da nije potrebno brojanje.

Šest vremenskih znamenki (HHMMSS) međuspremnici se i zatim obrađuju nakon što ih sve primimo. GPS može rano poslati neke nepotpune poruke pa rutina međuspremnika provjerava je li svaki znak ASCII numerička vrijednost. Ako se primi loš znak, poruka se odbacuje. To se također može dogoditi u rijetkim slučajevima tijekom normalnog rada, osobito ako komunikacija serijskog porta malo padne. Ovo sam vidio samo jednom i sve što se dogodilo je da je vrijeme pauziralo na sekundu, a zatim skočilo dvije sekunde umjesto jedne.

Ako je softver konfiguriran samo za prikaz vremena, tada će prvi redak LCD -a prikazati lokalno vrijeme, a drugi redak UTC. Za UTC softver samo šalje ASCII znakove izravno u rutinu prikaza, s dvotočkama (:) na odgovarajući način umetnutim.

Da biste UTC pretvorili u lokalno vrijeme, morate primijeniti UTC pomak (vremensku zonu). Budući da je UTC -vrijeme s GPS -a u ASCII formatu, softver pretvara ASCII satne znakove u decimalne i zatim dodaje UTC pomak. UTC pomak pohranjen je kao pozitivna BCD vrijednost sa predznakom pa se prvo pretvara u cjelobrojnu vrijednost, a zatim se negira ako je predznak postavljen. Nakon što se izračuna lokalna vrijednost vremena sata, tablica za pretraživanje koristi se za pretvaranje u BCD, a zatim se BCD pretvara natrag u ASCII za prikaz. Tablica za pretraživanje mora rukovati 24-satnim UTC formatom, kao i +/- 12 vremenskim zonama. Kako bi to učinili, UTC -vremena od 0000 do 2300 zauzimaju srednja 24 unosa u tablici s 12 unosa prije i 12 unosa nakon kako bi uzeli u obzir vremenske zone. Jedna tablica je u 12-satnom formatu pa sam dodao i tablicu za traženje za AM/PM dio zaslona. Druga tablica je u 24-satnom formatu. Kao što je ranije spomenuto, prekidač za uključivanje/isključivanje omogućuje odabir 12-satnog ili 24-satnog formata.

Vremenska zona se preuzima iz EEPROM -a tijekom inicijalizacije i kratko prikazuje. Ako nije postavljen barem jednom, tada se poziva rutina postavljanja. Rutinu postavljanja također možete pozvati u bilo kojem trenutku pritiskom na prekidač za trenutni kontakt. Rutina postavljanja početno prikazuje zaslon na "UTC OFFSET +77". Kratkim pritiskom na prekidač vrijednost će se promijeniti na “-00”. Ako je potrebna pozitivna vremenska zona, drugi kratki pritisak promijenit će vrijednost na "+00". Dugim pritiskom (> 1 sekunda) pomaknut ćete način postavljanja na sljedeći korak. U ovom trenutku svaki kratki pritisak povećat će vrijednost vremena do najviše 12. Nakon dostizanja željene vremenske zone, pritisnite i držite prekidač dulje od 1 sekunde, a zatim ga otpustite. Softver će tada spremiti UTC vrijednost u EEPROM i nakratko prikazati "OFFSET SAVED". Ako pogriješite tijekom unosa, samo izađite, a zatim ponovno pritisnite prekidač da biste ga poništili.

NEO-6M ne zahtijeva dobro popravljanje položaja kako bi prikazao vrijeme pa bi trebao slati poruke čim dobije jedan satelit. Do tada će na zaslonu biti ispisano "NO DATA".

10. korak: Vremenski softver

PIC mikrokontroler ima mogućnost uključivanja/isključivanja timera pomoću vanjskog impulsa. Taj isti ulazni impuls može se koristiti i kao vanjski prekid za signalizaciju očitanja trajanja impulsa. Arduino nema te točne mogućnosti pa sam upotrijebio funkciju prekidanja pri promjeni. Na jednom rubu impulsa RF poruke trenutačno vrijeme u mikrosekundi sprema se pomoću rukovatelja prekida. Na suprotnom rubu izračunava se proteklo vrijeme za određivanje širine impulsa.

Softver ima definiciju “DEBUG” koja omogućuje prikaz sirovog formata podataka primljenih poruka. Postoji i definicija za navođenje Arduino ulaznog pina za serijski tok iz RF prijemnika. Softver je postavljen za izračunavanje odgovarajućih postavki registra prekida pri promjeni na temelju ove definicije. Izračun funkcionira samo za Arduino digitalne pinove. Umjesto toga mogao bi se koristiti analogni pin, ali to bi zahtijevalo teško kodiranje vrijednosti registra.

Rukovalac prekida određuje je li snimljeni broj dovoljno dug da bude startni impuls. Kao što je ranije spomenuto, jaz između više poruka je 2 ms pa softver traži to. Zbog cijelog prometa od 433 MHz, početni pregled u softveru osigurava da je izmjereno vrijeme najmanje 1,8 ms, ali ne veće od 2,4 ms. Nakon što se otkrije početak, softver traži bitove za sinkronizaciju (600us) i računa kako bi bio siguran da je primio četiri od njih. Nakon što prođu ove testove, softver traži odgovarajuća bitovna vremena od 200us i 400us.

Primljeni bitovi se oblikuju u bajtove i svaki se bajt sprema. Nakon što je primljeno sedam bajtova, kontrolni zbroj poruka se provjerava prije nego što je dopuštena daljnja obrada. Ako se žele izlaziti sirovi bajtovi (način otklanjanja pogrešaka), tada se bajtovi pretvaraju u ASCII znakove i šalju na LCD. Ako se želi izlaz vlage i temperature, tada se izvode odgovarajuće pretvorbe.

Dva bajta Celzijevih podataka u RF poruci zgnječeni su zajedno kako bi oblikovali 11-bitnu vrijednost. Donji dio pomaknut je ulijevo za jedan bit kako bi se uklonio paritetni bit i poravnalo s bitovima u gornjem dijelu. Dva bajta se oblikuju u 16-bitnu varijablu riječi, a zatim se cijela stvar pomakne udesno za jedan bit kako bi se dobilo konačno poravnanje bitova. Varijabla riječi tada se pretvara u varijablu s pomičnim zarezom za matematičke izračune.

Jedna velika prednost korištenja C ++ na Arduinu u odnosu na asemblerski jezik na PIC -u je ta što pojednostavljuje matematičke izračune. Kao što je ranije spomenuto, Celzijeva konverzija je (C / 10) -100. Rezultat se pretvara u niz i šalje na LCD zaslon za prikaz. Fahrenheitov izračun je (C * 1,8) + 32. Rezultat se ponovno pretvara u niz i šalje na LCD zaslon za prikaz. U oba slučaja, pretvaranje niza uključuje negativni predznak (ako je potrebno) i decimalnu točku. Provjerava se decimalna točka kako bi se osiguralo da se na zaslon šalje samo jedan znak nakon decimalne točke. Ta je provjera potrebna jer niz može imati od 3 do 5 znakova.

Imam dva AcuRite senzora pa sam dodao provjeru u softver kako bih se uvjerio da podaci za jedan neće prebrisati podatke za drugi ako je softver postavljen samo na vremensku funkciju. Prvi senzor primljen nakon uključivanja prikazuje se na retku 1, a drugi je prikazan na retku 2. Korištenjem načina otklanjanja pogrešaka mogu vidjeti koji je ID za svaki senzor pa bih mogao jednostavno provjeriti kôd samo ako htio obraditi podatke s jedne od njih.

Softver prati stanje baterije (byte3) i prikazuje poruku ako pokazuje da je baterija prazna. Ova poruka prepisuje sve ostale podatke za taj senzor.

11. korak: Zasloni

Zasloni
Zasloni
Zasloni
Zasloni
Zasloni
Zasloni

Evo nekoliko primjera prikaza za različite funkcije. Imam još nekoliko instrukcija, ali većina mojih projekata PIC mikrokontrolera može se pronaći na mojoj web stranici na: www.boomerrules.wordpress.com

Preporučeni: