Satura rādītājs:

Arduino 3-in-1 laika un laika displejs: 11 soļi
Arduino 3-in-1 laika un laika displejs: 11 soļi

Video: Arduino 3-in-1 laika un laika displejs: 11 soļi

Video: Arduino 3-in-1 laika un laika displejs: 11 soļi
Video: Lesson 22: Using Seven Segment Display with Arduino and Electronic Dice | SunFounder Robojax 2024, Jūlijs
Anonim

Seko vairāk no autora:

Izmantojot ATtiny85
Izmantojot ATtiny85
Izmantojot ATtiny85
Izmantojot ATtiny85
Pi Powered Pie sadalīšanas un daudzstūra atzarošanas rīks
Pi Powered Pie sadalīšanas un daudzstūra atzarošanas rīks
Pi Powered Pie sadalīšanas un daudzstūra atzarošanas rīks
Pi Powered Pie sadalīšanas un daudzstūra atzarošanas rīks
Manuāla audio pastiprinātāja digitālās vadības ierīces
Manuāla audio pastiprinātāja digitālās vadības ierīces
Manuāla audio pastiprinātāja digitālās vadības ierīces
Manuāla audio pastiprinātāja digitālās vadības ierīces

Man patīk PIC mikrokontrolleri un programmēšana montāžas valodā. Patiesībā pēdējo pāris gadu laikā savā vietnē esmu ievietojis aptuveni 40 projektus, pamatojoties uz šo kombināciju. Nesen es pasūtīju dažas detaļas no viena no maniem iecienītākajiem ASV pārdevējiem, un es pamanīju Arduino Nano ar programmēšanas kabeli tikai par 1,20 USD vairāk nekā tukša ATMEGA328 procesora mikroshēma. Tāpēc es nopirku pāris no tiem. Tad es lejupielādēju Arduino IDE un notīrīju atmiņu no “C ++” programmēšanas.

Šis projekts ir pulksteņa sajaukums, kas izmanto GPS laika noteikšanai, un RF uztvērējs, kas dekodē laika ziņas no kopējā AcuRite sensora. Rezultāts ir neliela laika un temperatūras displejs. GPS pulkstenis un laika apstākļi ir iestatīti kā atsevišķi iekļauti faili, tāpēc ir viegli iedziļināties galvenajā rutīnā un konfigurēt to, lai tā veiktu tikai pulksteņa funkciju vai tikai laika apstākļu funkciju. Vienkārši noņemiet komentāru atbilstošās “#define” galvenās rutīnas augšdaļā, ja vēlaties tikai vienu no funkcijām.

Ja tiek izmantotas abas funkcijas, LCD augšējā rindā tiek parādīts vietējais laiks, bet LCD apakšējā rindā - mitrums un temperatūra gan pēc Celsija, gan pēc Fārenheita. Ja tiek izmantota tikai pulksteņa funkcija, augšējā rindā tiek parādīts vietējais laiks, bet apakšējā - UTC. Ja tiek izmantota tikai laika apstākļu funkcija, augšējā rindā tiek parādīts pirmais saņemtais sensors, bet apakšējā rindā - jebkurš cits saņemtais sensors. Es pievienoju šo iespēju, jo man ir divi laika sensori.

1. solis: laika apstākļu sensors

Laika sensors
Laika sensors
Laika sensors
Laika sensors
Laika sensors
Laika sensors

Šeit izmantotais AcuRite laika sensors nosūta informāciju par temperatūru un mitrumu ik pēc 16 sekundēm. Aizmugurē ir redzams modeļa numurs 000592TXR, bet parasti tas tiek reklamēts kā modelis 06002M. Šo sensoru izmanto daudzi dažādi meteoroloģisko staciju modeļi, tāpēc to ir viegli atrast, un es varēju tos iegūt vietnē eBay zem 20 USD. AcuRite pārdod līdzīga izskata sensorus dažām meteoroloģiskajām stacijām, taču tie var vai nevar ievērot to pašu sakaru protokolu. Tīmeklī ir dažas norādes, ka tikai temperatūras sensors 00606 izmanto to pašu ziņojumu formātu, bet ar nederīgu mitruma baitu.

Kā redzams iepriekš parādītajā pirmajā viļņu formā, laika ziņas tiek nosūtītas sērijveidā ar 2 ms atstarpi starp secīgiem ziņojumiem. Iepriekš parādītā otrā viļņa forma paplašina viena ziņojuma daļu, lai redzētu bitu ilgumu un modeļus. Ir četri sinhronizācijas biti, kuru augstums ir aptuveni 600us, kam seko 600us zems. Datu bitus attēlo 400us augsts, kam seko 200us zems (1) vai 200us augsts, kam seko 400us zems (0).

Ziņojuma formāts sastāv no 7 baitiem datu. Pirmie divi baiti ir sensora ID, un tie nemainās (ti, tas neizmanto slīdošo kodu). Pēdējais baits ir vienkārša pirmo sešu baitu kontrolsumma. Trešais baits ir akumulatora uzlādes līmeņa indikators, un tam vienmēr jābūt 44 hex, ja akumulators ir labs. Ceturtais baits ir mitrums, un tā nav mērogota vērtība no 0 līdz 99. Ir svarīgi paturēt prātā, ka nozīmīgākais 4., 5. un 6. baitu bits ir paritātes bits un nav daļa no mērījuma. vērtības. Baiti 5 un 6 ir mērogotā temperatūra (pēc Celsija), bet apakšējie 4 baita 5 biti ir savienoti ar apakšējiem 7 bitiem 6, veidojot 11 bitu vērtību. Temperatūra vienmēr tiek attēlota kā pozitīvs skaitlis un kļūst negatīva tikai tad, kad tiek piemērota mērogošana. Mērogojums ir (C / 10) - 100. Sadalījums ar 10 ir nepieciešams, jo temperatūras izšķirtspēja ir grāda desmitdaļas. Atņemšana ir nepieciešama, jo sensors pievieno 100, lai pārraidītā vērtība būtu pozitīva.

2. solis: RF uztvērējs

RF uztvērējs
RF uztvērējs
RF uztvērējs
RF uztvērējs

RF modulis, ko izmantoju šim projektam, ir RXB6. Tas ir super heterodīna uztvērējs pretstatā mazāk vēlamajiem super reģeneratīvajiem uztvērējiem. Ja paskatās uz lētajiem RF moduļiem, jūs atradīsit, ka raidītāja un uztvērēja plates bieži ir komplektā. Lielākā daļa no šiem komplektētajiem uztvērējiem ir īpaši reģeneratīvi, tāpēc tiem parasti ir daudz zemākas veiktspējas īpašības (ieskaitot diapazonu) nekā super heterodīna uztvērējiem. Šim projektam mums ir nepieciešams tikai uztvērēja modulis, jo mēs saņemsim signālus no laika sensoru raidītāja.

3. solis: RF antenas

RF antenas
RF antenas

RXB6 nav komplektā ar antenu. Jūs varat iegādāties dažus spirālveida tos diezgan lēti, taču ir arī viegli izveidot savu antenu. Faktiski maizes dēļa džemperis var tikt uzvilkts uz moduļa antenas tapas, ja nevēlaties kļūt pārāk iedomāts. Ideālā gadījumā taisnas stieples antena būtu 1/4 viļņa garumā, kas būtu aptuveni 6,8 collas. Sākumā es darīju džempera vadu, un man nebija problēmu paņemt ārējo sensoru, lai gan mana elektronikas darbnīca atrodas manā pagrabā.

Vēl viena iespēja ir izveidot savu spirālveida antenu. Tīmeklī ir dažādi plāni, bet es izveidoju iepriekš attēlā redzamo. Es izmantoju cieto serdes vadu no Ethernet kabeļa lūžņa un aptinu to ap 5/32 collu urbja gludo kātu. Atstājiet izolāciju ieslēgtu, izņemot galu, kas pielodēts pie RF plates. Jums būs nepieciešami 20 pagriezieni. Varat arī izmantot 7/32 collu urbi un ietīt 17 pagriezienus. Jebkurš no tiem, visticamāk, darbosies lieliski diapazonos, kas, visticamāk, būs jūsu sensoriem. Patiesībā galvenais ir labs RF uztvērējs. AcuRite sensoriem ir arī diezgan spēcīgi raidītāji.

4. solis: RF sakaru protokols

Datu pārsūtīšanai ir dažas dažādas modulācijas metodes, taču šie sensori izmanto vienkāršāko, kas ir OOK (ieslēgšanas-izslēgšanas taustiņš) vai ASK (amplitūdas maiņas keying). Tā kā šajā piemērā mēs strādājam ar 0/1 datu bitiem, amplitūda ir pilna vai izslēgta. Tātad, mūsu vajadzībām OOK un ASK ir vienādi, jo OOK nozīmē, ka RF nesējs ir vai nu pilns, vai ieslēgts. Ziņojuma formātu parasti nosaka raidīšanas ierīces ražotājs, un viņi var izmantot gandrīz jebkuru pārraides ātrumu, jebkuru bitu formatēšanas stilu un jebkura ziņojuma garumu. 433 MHz josla ir pārpildīta ar pārraidi tādām lietām kā viedie skaitītāji utt., Tāpēc programmatūra ir jāpielāgo tā, lai filtrētu tikai to ziņojumu formātu, kuru mēs vēlamies izmantot.

5. darbība. Laika dati

Laika dati
Laika dati

Es izmantoju lētu GPS ierīci, lai iegūtu precīzus laika datus, kas automātiski atsāksies pēc strāvas padeves pārtraukuma. Man ir vairākas GPS ierīces (bez displejiem), kas izvada standarta NMEA teikumus, bet mazākā un lētākā no manām vienībām ir NEO-6M. NEO-6M moduli ir viegli savienot ar Arduino, jo tas izmanto TTL līmeņa seriālo portu. Vienīgā patiesā atšķirība ir tāda, ka NMEA standarts nosaka 4800 sērijas bodu pārraides ātrumu, bet NEO-6M noklusējuma vērtība ir 9600 bodu. Jūs varat palaist bezmaksas “u-center” programmu, lai mainītu datu pārraides ātrumu, bet es vienkārši atstāju to rūpnīcas noklusējuma režīmā. Ir arī bezmaksas utilīta programma ar nosaukumu GPSInfo (izlikusi Globalsat), kas ir ļoti ērta GPS informācijas apskatei datorā. Jūs varat savienot GPS ierīci ar standarta USB -TTL kabeli, lai to pārbaudītu vai iestatītu, izmantojot datoru. Paturiet prātā, ka moduļa GPS mikroshēma faktiski darbojas ar 3,3 voltu spriegumu (izmantojot iebūvētu sprieguma regulatoru), tādēļ, ja vēlaties izveidot savienojumu ar tā RXD portu, nobīdiet līmeni no 5 voltiem. TXD portu var savienot tieši ar Arduino vai datoru.

6. darbība. Laika joslas

GPS laika parādīšana ir vienkārša lieta, ja vien vēlaties parādīt UTC (universālā laika koordinēts). NMEA teikumi sastāv no ASCII rakstzīmēm, kuras var tieši izvadīt LCD. Laika daļa ir HHMMSS. FF formātā (stundas, minūtes, sekundes un daļējas sekundes). Mūsu pulkstenim daļskaitliskā daļa nav noderīga, tāpēc mums jārisina tikai sešas rakstzīmes. Problēma ir tāda, ka pēc tam jums ir jāpārvērš vietējais laiks un 12 stundu AM/PM formāts, ja vēlaties. Bet dažreiz problēmas padara dzīvi interesantu, tāpēc šī programmatūras daļa patiešām ir paredzēta.

Runājot par laika joslām, jūs varētu domāt, ka tās vienkārši būtu 24, no kurām 12 atrodas uz austrumiem no UTC atrašanās vietas (+ zonas) un 12 no tām uz rietumiem no UTC atrašanās vietas (- zonas). Patiesībā ir dažas nepāra stundas, kas ir daļējas stundas, un pāris, kas pārsniedz 12 stundu “robežu”. Ja jūs dzīvojat kādā no šīm teritorijām, es atvainojos, jo mana programmatūra veido tikai 24 visu stundu zonas. Ir arī daži no mums, kuri izmanto vasaras laiku, bet tas netiek automātiski ņemts vērā programmatūrā. Tam būtu nepieciešama turpmāko datumu uzmeklēšanas tabula, programmatūras papildu sarežģītība un nepieciešamība atjaunināt programmatūru, ja mainās pārejas gada nedēļas. Tā vietā aparatūra izmanto īslaicīgu kontakta slēdzi, lai varētu viegli iestatīt laika joslu (UTC nobīde).

7. solis: shematisks

Shematisks
Shematisks

Shēma ir parādīta iepriekš un ietver savienojumus 4 bitu 1602 LCD interfeisam. Sērijas dati no RF uztvērēja atrodas digitālās loģikas līmenī, tāpēc tie ir tieši savienoti ar vienu no Arduino datu ievades tapām. Adata programmatūrā ir konfigurēta, lai veiktu maiņas pārtraukšanas funkciju, lai mēs varētu izmērīt impulsu platumus. GPS TXD izeja ir tieši savienota ar Arduino RX ieeju.

Tiek izmantoti divi slēdži. Kā minēts iepriekš, īslaicīgs kontakta slēdzis ļauj iestatīt UTC nobīdi. Lai pārietu uz iestatīto režīmu, slēdzi var nospiest jebkurā laikā. Sākotnēji displejā būs redzams nederīgs UTC nobīde “+77”. UTC nobīdes iestatīšanas norādījumus skatiet sadaļā “Pulksteņa programmatūra”.

Otrais slēdzis ir vienkāršs ieslēgšanas/izslēgšanas slēdzis. Pozīcijā “izslēgts” laiks tiks parādīts 12 stundu formātā (AM/PM), bet pozīcijā “ieslēgts” laiks tiks rādīts 24 stundu formātā. Šo slēdzi var mainīt jebkurā laikā, lai pārslēgtos starp formātiem.

Ja ir nepieciešama tikai pulksteņa funkcija, RF uztvērēja modulis nav jāpievieno. Ja ir vēlama tikai laika apstākļu funkcija, GPS un abi slēdži nav jāpievieno.

8. solis: LCD programmatūra

Es mēdzu izmantot vienu no diviem LCD saskarņu veidiem. Viens ir standarta 4 bitu interfeiss, bet otrs ir 3 vadu interfeiss, kas izmanto maiņu reģistru. Es izstrādāju šo saskarni, strādājot ar maziem PIC mikrokontrolleriem, kuriem bija ierobežots skaits I/O tapas. Šim projektam es izmantoju 4 bitu saskarni, bet man ir savs LCD iekļaušanas fails, nevis vispārējā Arduino LCD bibliotēka. Tas samazina atmiņas patēriņu un koda sarežģītību, kā arī ļauj man pielāgot kodu konkrētiem projektiem, piemēram, šim.

9. solis: pulksteņa programmatūra

GPS ierīce izvada standarta NMEA-0183 teikumus, kas ir ASCII virknes, kas satur dažādu informāciju. Šai lietojumprogrammai es izvēlējos GGA teikumu, lai iegūtu informāciju par laiku, jo tas ir teikums, ko izmantoju iepriekšējā GPS projektā. Informācijas lauki NMEA teikumos ir atdalīti ar komatiem, tāpēc pēc GGA teikuma galvenes noteikšanas programmatūra parasti saskaita komatus un izsauc atbilstošo rutīnu katram vēlamajam GPS informācijas laukam. Šeit ir nepieciešama tikai informācija par laiku, un tā ir laukā pēc pirmā komata, tāpēc skaitīšana nav nepieciešama.

Seši laika cipari (HHMMSS) tiek buferizēti un pēc tam apstrādāti pēc visu saņemšanas. GPS var izvadīt dažus nepabeigtus ziņojumus agri, tāpēc buferizācijas kārtība pārbauda, vai katra rakstzīme ir ASCII skaitliskā vērtība. Ja tiek saņemts slikts raksturs, ziņojums tiek atmests. Tas var notikt arī retos gadījumos normālas darbības laikā, īpaši, ja seriālā porta sakari nedaudz samazinās. Es to esmu redzējis tikai vienu reizi, un viss, kas notika, ir tāds, ka laiks apstājās uz sekundi un pēc tam uzlēca divas sekundes, nevis vienu.

Ja programmatūra ir konfigurēta tikai laika rādīšanai, tad LCD pirmajā rindā tiks parādīts vietējais laiks, bet otrajā rindā - UTC. UTC programmatūra tikai nosūta ASCII rakstzīmes tieši uz displeja rutīnu, attiecīgi ievietojot kolu (:).

Lai pārvērstu UTC par vietējo laiku, ir jāpiemēro UTC nobīde (laika josla). Tā kā UTC laiks no GPS ir ASCII formātā, programmatūra konvertē ASCII stundu rakstzīmes uz decimāldaļu un pēc tam pievieno UTC nobīdi. UTC nobīde tiek saglabāta kā pozitīva BCD vērtība ar zīmes bitu, tāpēc tā vispirms tiek pārveidota par veselu skaitli un pēc tam tiek noliegta, ja ir iestatīts zīmes bits. Kad vietējā laika stundas vērtība ir aprēķināta, uzmeklēšanas tabula tiek izmantota, lai to pārvērstu BCD, un pēc tam BCD tiek pārvērsta atpakaļ ASCII, lai to parādītu. Uzmeklēšanas tabulai ir jāapstrādā 24 stundu UTC formāts, kā arī +/- 12 laika joslas. Lai to izdarītu, UTC laiki no 0000 līdz 2300 aizņem vidējos 24 ierakstus tabulā ar 12 ierakstiem pirms un 12 ierakstiem pēc tam, lai ņemtu vērā laika joslas. Viena tabula ir 12 stundu formātā, tāpēc es pievienoju arī uzmeklēšanas tabulu displeja AM/PM daļai. Otra tabula ir 24 stundu formātā. Kā minēts iepriekš, ieslēgšanas/izslēgšanas slēdzis ļauj izvēlēties 12 stundu vai 24 stundu formātu.

Laika josla tiek iegūta no EEPROM inicializācijas laikā un tiek īsi parādīta. Ja tas nav iestatīts vismaz vienu reizi, tiek izsaukta iestatīšanas kārtība. Iestatīšanas rutīnu var izsaukt arī jebkurā laikā, nospiežot mirkļa kontakta slēdzi. Iestatīšanas rutīna inicializēs displeju uz “UTC OFFSET +77”. Īsi nospiežot slēdzi, vērtība tiks mainīta uz “-00”. Ja ir nepieciešama pozitīva laika josla, tad vēl vienu īsu nospiešanu vērtība tiks mainīta uz “+00”. Ilgi nospiežot (> 1 sekunde), iestatīšanas režīms tiks pārvietots uz nākamo soli. Šajā brīdī katra īsa nospiešana palielinās laika vērtību līdz maksimāli 12. Pēc vēlamās laika joslas sasniegšanas nospiediet un turiet slēdzi ilgāk par 1 sekundi un pēc tam atlaidiet to. Pēc tam programmatūra saglabās UTC vērtību EEPROM un īsi parādīs “OFFSET SAVED”. Ja ievadīšanas laikā pieļaujat kļūdu, vienkārši izejiet un pēc tam vēlreiz nospiediet slēdzi, lai to atiestatītu.

Lai izvadītu laiku, NEO-6M nav nepieciešama laba atrašanās vietas noteikšana, tāpēc tam vajadzētu izvadīt ziņojumus, tiklīdz tas saņem vienu satelītu. Līdz tam displejā būs redzams uzraksts “NO DATA”.

10. solis: laika apstākļu programmatūra

PIC mikrokontrolleram ir iespēja ieslēgt/izslēgt taimeri, izmantojot ārēju impulsu. To pašu ievades impulsu var izmantot arī kā ārēju pārtraukumu, lai signalizētu par impulsa ilguma nolasīšanu. Arduino nav tik precīzu iespēju, tāpēc es izmantoju maiņas pārtraukšanas funkciju. RF ziņojuma impulsa vienā malā pārtraukuma apstrādātājs saglabā pašreizējo mikrosekundes laiku. Pretējā malā tiek aprēķināts pagājis laiks, lai noteiktu impulsa platumu.

Programmatūrai ir DEBUG definīcija, kas ļauj parādīt saņemto ziņojumu neapstrādāto datu formātu. Ir arī definīcija, lai norādītu Arduino ievades tapu sērijveida plūsmai no RF uztvērēja. Programmatūra ir iestatīta, lai, pamatojoties uz šo definīciju, aprēķinātu atbilstošos pārtraukšanas režīma reģistra iestatījumus. Aprēķins darbojas tikai Arduino digitālajām tapām. Tā vietā varētu izmantot analogo tapu, taču tam būtu nepieciešama stingra reģistra vērtību kodēšana.

Pārtraukuma apstrādātājs nosaka, vai uztvertais skaitlis ir pietiekami ilgs, lai tas būtu sākuma impulss. Kā minēts iepriekš, plaisa starp vairākiem ziņojumiem ir 2 ms, tāpēc programmatūra to meklē. Ņemot vērā visu 433 MHz trafiku, sākotnējā programmatūras pārbaude nodrošina, ka izmērītais laiks ir vismaz 1,8 ms, bet ne lielāks par 2,4 ms. Pēc sākuma noteikšanas programmatūra meklē sinhronizācijas bitus (600us) un skaita, lai pārliecinātos, ka četri no tiem ir saņemti. Kad šie testi ir nokārtoti, programmatūra meklē pareizos bitu laikus 200us un 400us.

Saņemtie biti tiek veidoti baitos un katrs baits tiek saglabāts. Pēc septiņu baitu saņemšanas ziņojuma kontrolsumma tiek pārbaudīta, pirms tiek atļauta turpmāka apstrāde. Ja jāizvada neapstrādāti baiti (atkļūdošanas režīms), tad baiti tiek pārvērsti ASCII rakstzīmēs un nosūtīti uz LCD. Ja ir vēlama mitruma un temperatūras izeja, tiek veikta atbilstoša pārveidošana.

Divi baiti Celsija pakāpes datu RF ziņojumā ir sajaukti kopā, veidojot 11 bitu vērtību. Apakšējā daļa ir nobīdīta pa kreisi par vienu bitu, lai novērstu paritātes bitu un izlīdzinātu to ar augšējā daļā esošajiem bitiem. Abi baiti tiek veidoti 16 bitu vārda mainīgajā lielumā, un tad visa lieta tiek nobīdīta pa labi par vienu bitu, lai iegūtu galīgo bitu izlīdzināšanu. Vārdu mainīgais pēc tam matemātiskajiem aprēķiniem pārvērš par peldošā komata mainīgo.

Viena liela priekšrocība, izmantojot C ++ Arduino, salīdzinot ar montāžas valodu PIC, ir tā, ka tā vienkāršo matemātiskos aprēķinus. Kā minēts iepriekš, Celsija pakāpes konversija ir (C / 10) -100. Rezultāts tiek pārvērsts virknē un nosūtīts uz LCD displejam. Fārenheita aprēķins ir (C * 1,8) + 32. Rezultāts atkal tiek pārvērsts par virkni un nosūtīts uz displeju parādīšanai. Abos gadījumos virknes reklāmguvumā ir iekļauta negatīvā zīme (ja nepieciešams) un aiz komata. Tiek pārbaudīta decimāldaļa, lai pārliecinātos, ka uz displeju tiek nosūtīta tikai viena rakstzīme aiz komata. Šī pārbaude ir nepieciešama, jo virkne var būt no 3 līdz 5 rakstzīmēm gara.

Man ir divi AcuRite sensori, tāpēc es programmatūrā pievienoju pārbaudi, lai pārliecinātos, ka dati vienam nav pārrakstīti otram, ja programmatūra ir iestatīta tikai laika apstākļu funkcijai. Pirmais sensors, kas saņemts pēc ieslēgšanas, tiek parādīts 1. rindā, bet otrs - 2. rindā. Izmantojot atkļūdošanas režīmu, es redzu katra sensora ID, lai es varētu vienkārši pārbaudīt kodu, ja vēlējās apstrādāt datus no viena no tiem.

Programmatūra uzrauga akumulatora stāvokli (baits3) un parāda ziņojumu, ja tas norāda uz zemu akumulatora uzlādes līmeni. Šis ziņojums pārraksta visus pārējos šī sensora datus.

11. darbība. Displeji

Displeji
Displeji
Displeji
Displeji
Displeji
Displeji

Šeit ir daži dažādu funkciju displeju piemēri. Man ir dažas citas instrukcijas, bet lielāko daļu manu PIC mikrokontrolleru projektu var atrast manā vietnē: www.boomerrules.wordpress.com

Ieteicams: