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, Juli
Anonim

Od Boomer48Sledi Još autora:

Koristeći ATtiny85
Koristeći ATtiny85
Koristeći ATtiny85
Koristeći 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 ispraznio sjećanje na programiranje ‘C ++’.

Ovaj projekt predstavlja skup sata koji koristi GPS za mjerenje vremena i RF prijemnik koji dekodira vremenske poruke sa 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 red LCD -a prikazuje lokalno vrijeme, a donji red LCD -a prikazuje vlažnost i temperaturu u Celzijusima i Farenhajtima. Ako se koristi samo funkcija sata, tada gornji red prikazuje lokalno vrijeme, a donji red UTC. Ako se koristi samo vremenska funkcija, tada gornji red 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

Sensor Weather
Sensor Weather
Sensor Weather
Sensor Weather
Sensor Weather
Sensor Weather

Ovdje korišteni AcuRite senzor vremena šalje informacije o temperaturi i vlažnosti zraka svakih 16 sekundi. Na poleđini 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 od svojih meteoroloških stanica, ali se mogu pridržavati ili ne pridržavati se istog komunikacijskog protokola. Na webu postoje neke naznake da senzor 00606 samo za temperaturu koristi isti format poruke, ali s nevažećim bajtom vlažnosti.

Kao što se vidi na prvom gore prikazanom talasnom obliku, vremenske poruke se šalju rafalno sa razmakom od 2 ms između uzastopnih poruka. Drugi prikazani valni oblik proširuje dio jedne poruke kako bi se vidjelo trajanje bita i obrasci. Postoje četiri bita za sinhronizaciju koji su visoki oko 600us, a zatim 600us niski. Bitovi podataka predstavljeni su sa 400us visokim, zatim 200us niskim (1) ili 200us visokim, praćenim 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). Zadnji bajt je jednostavna aditivna kontrolna suma prvih šest bajtova. Treći bajt je indikator napunjenosti baterije i trebao bi uvijek biti 44 heksadecimalni ako je baterija dobra. Četvrti bajt je vlažnost i to je vrijednost koja se ne skalira između 0 i 99. Važno je imati na umu da je najznačajniji bit bajtova 4, 5 i 6 paritet i nije dio mjerenja vrijednosti. Bajtovi 5 i 6 su skalirana temperatura (Celzijus) s donjim 4 bita bajta 5 koji su povezani s donjih 7 bitova bajta 6 kako bi se formirala 11-bitna vrijednost. Temperatura se uvijek prikazuje kao pozitivan broj i postaje negativna tek kada se primijeni skaliranje. Skala je (C / 10) - 100. Podijeljena s 10 je potrebna jer je temperaturna rezolucija u desetinama stepena. Oduzimanje je potrebno jer senzor dodaje 100 kako bi prenesena vrijednost bila 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 isporučenih prijemnika su super regenerativni tipovi pa imaju tendenciju da imaju mnogo niže performanse (uključujući domet) od super heterodinskih prijemnika. Za ovaj projekt nam je potreban samo prijemni modul jer ćemo primati signale od 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 je i lako napraviti vlastitu antenu. U stvari, kratkospojnik kabela za matičnu ploču mogao bi se navući na antenski iglu modula ako ne želite biti previše dopadljivi. U idealnom slučaju, ravna žičana antena bila bi 1/4 valne dužine koja radi na oko 6,8 inča. U početku sam radio sa prespojnom žicom 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 je ono što sam napravio. Koristio sam žicu s čvrstim jezgrom od starog komada Ethernet kabela i namotao je oko glatke drške svrdla od 5/32 inča. Ostavite izolaciju uključenu, osim za vrh 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 omotati 17 zavoja. Bilo koji od ovih će vjerovatno dobro funkcionirati za opsege koje ćete vjerovatno imati za svoje senzore. Pravi ključ je imati dobar RF prijemnik za početak. AcuRite senzori takođe imaju prilično jake predajnike.

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 0/1 bitovima podataka, amplituda je puna ili potpuno isključena. Dakle, za naše potrebe, OOK i ASK su isti jer OOK znači da je RF nosač ili potpuno uključen ili potpuno napunjen. 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 dužinu poruke. Opseg 433-MHz prepun je prijenosa za stvari poput pametnih mjerača itd., Pa je softver potrebno podesiti da filtrira samo format poruke koji želimo koristiti.

Korak 5: Podaci o vremenu

Vremenski podaci
Vremenski podaci

Koristim jeftinu GPS jedinicu kako bih dobio točne podatke o vremenu koji će se automatski ponovo pokrenuti nakon nestanka struje. Imam nekoliko GPS jedinica (bez ekrana) koje emitiraju standardne NMEA rečenice, ali najmanja i najjeftinija jedinica koju imam je NEO-6M. Modul NEO-6M je jednostavan za povezivanje s Arduinom jer koristi serijski port na nivou 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 ja sam ga samo ostavio na tvornički zadane postavke. Postoji i besplatni uslužni program pod nazivom GPSInfo (koji je izdao Globalsat) koji je vrlo zgodan za pregled GPS informacija na računaru. GPS jedinicu možete spojiti na standardni USB na TTL kabel radi provjere ili postavljanja pomoću računara. 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 port, trebali biste prebaciti nivo s 5 volti prema dolje. TXD port može se spojiti izravno na Arduino ili računalo.

Korak 6: Vremenske zone

Prikazivanje GPS vremena je jednostavna stvar ako samo želite prikazati UTC (univerzalno koordinirano vrijeme). NMEA rečenice se sastoje od ASCII znakova koji se mogu direktno poslati 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 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 obračunava 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 softver. To bi zahtijevalo pregled tabela budućih datuma, dodatnu složenost softvera i potrebu za ažuriranjem softvera ako se promijene sedmice 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: Shema

Shematski
Shematski

Shema je prikazana gore i uključuje veze za 4-bitni 1602 LCD interfejs. Serijski podaci s RF prijemnika nalaze se na digitalnoj logičkoj razini pa su povezani direktno 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 je direktno povezan s Arduino RX ulazom.

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 ekranu prikazivati nevažeći UTC pomak od "+77". Upute za postavljanje pomaka UTC potražite u odjeljku "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 prekidač se može promijeniti u bilo kojem trenutku za prebacivanje između formata.

Ako želite samo funkciju 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

Obično koristim jednu od dvije vrste LCD sučelja. Jedan je standardni 4-bitni interfejs, a drugi je trožilni interfejs koji koristi shift shift. 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ćava mi i podešavanje koda za određene projekte poput ovog.

Korak 9: Softver sata

GPS jedinica emituje standardne NMEA-0183 rečenice 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 odvojena su zarezima, tako da bi softver nakon otkrivanja zaglavlja rečenice GGA -a softver normalno brojao zareze i pozivao 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 odbrojavanje.

Šest vremenskih znamenki (HHMMSS) se baferiraju i zatim obrađuju nakon što su sve primljene. GPS može rano poslati neke nepotpune poruke pa rutina međuspremnika provjerava da li je 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, posebno 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 red UTC. Za UTC softver samo šalje ASCII znakove direktno u rutinu prikaza, sa dvotočkama (:) na odgovarajući način umetnutim.

Za pretvaranje UTC -a u lokalno vrijeme mora se primijeniti UTC pomak (vremenska zona). Budući da je UTC -vrijeme sa GPS -a u ASCII formatu, softver pretvara ASCII satne znakove u decimalne i zatim dodaje UTC pomak. UTC pomak se pohranjuje 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. Da bi se to učinilo, UTC vremena od 0000 do 2300 zauzimaju srednja 24 unosa u tabeli sa 12 unosa prije i 12 unosa nakon kako bi se uzele u obzir vremenske zone. Jedna tablica je u 12-satnom formatu pa sam dodao i tabelu za pretraživanje za AM/PM dio ekrana. Druga tabela je u 24-časovnom 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 tokom inicijalizacije i kratko prikazuje. Ako nije postavljen barem jednom, tada se poziva rutina postavljanja. Rutina podešavanja se također može pozvati u bilo kojem trenutku pritiskom na prekidač za trenutni kontakt. Rutina postavljanja će inicijalizirati prikaz na “UTC OFFSET +77”. Kratkim pritiskom na prekidač vrijednost će se promijeniti na “-00”. Ako je potrebna pozitivna vremenska zona, tada će još jedan kratak pritisak promijeniti vrijednost na “+00”. Dugim pritiskom (> 1 sekunda) pomaknut ćete način postavljanja na sljedeći korak. U ovom trenutku će svaki kratki pritisak povećati vrijednost vremena do najviše 12. Nakon dostizanja željene vremenske zone, pritisnite i držite prekidač duže 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 ekranu biti ispisano “NO DATA”.

Korak 10: Vremenski softver

PIC mikrokontroler ima mogućnost uključivanja/isključivanja tajmera pomoću vanjskog impulsa. Taj isti ulazni impuls može se koristiti i kao vanjski prekid za signalizaciju očitavanja trajanja impulsa. Arduino nema te mogućnosti, pa sam upotrijebio funkciju prekida i promjene. Na jednoj ivici impulsa RF poruke, upravljač prekida sprema trenutno mikrosekundno vrijeme. Na suprotnoj ivici se računa proteklo vrijeme za određivanje širine impulsa.

Softver ima definiciju “DEBUG” koja omogućava prikaz neobrađenog formata 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 osnovu 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 prometa od 433 MHz, početni pregled softvera 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 sinhronizaciju (600us) i računa da se uvjeri da su primljena četiri od njih. Nakon što ovi testovi prođu, softver traži odgovarajuće vrijeme bita od 200us i 400us.

Primljeni bitovi se formiraju u bajtove i svaki se bajt sprema. Nakon što je primljeno sedam bajtova, kontrolna suma poruka se provjerava prije nego što je dopuštena daljnja obrada. Ako će se izlaziti sirovi bajtovi (način otklanjanja greš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 Centigrade podataka u RF poruci zajedno se formiraju u 11-bitnu vrijednost. Donji dio pomaknut je ulijevo za jedan bit kako bi se uklonio paritetni bit i poravnalo s bitima u gornjem dijelu. Dva bajta se formiraju u 16-bitnu varijablu riječi, a zatim se cijela stvar pomakne udesno za jedan bit kako bi se dobilo konačno poravnanje bita. 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 ponovo pretvara u niz i šalje na LCD zaslon za prikaz. U oba slučaja, konverzija niza uključuje negativni predznak (ako je potrebno) i decimalni zarez. Provjerava se decimalna točka kako bi se osiguralo da se samo jedan znak nakon decimalne poruke šalje na zaslon. Ta je provjera potrebna jer niz može imati raspon 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 se prikazuje na retku 2. Korištenjem načina otklanjanja pogrešaka mogu vidjeti koji je ID za svaki senzor kako bih mogao jednostavno provjeriti kôd samo ako htio obraditi podatke od jednog od njih.

Softver prati stanje baterije (byte3) i prikazuje poruku ako ukazuje na nisku bateriju. Ova poruka prepisuje sve ostale podatke za taj senzor.

Korak 11: Prikazi

Displeji
Displeji
Displeji
Displeji
Displeji
Displeji

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: www.boomerrules.wordpress.com

Preporučuje se: