Indholdsfortegnelse:
- Trin 1: Vejrsensor
- Trin 2: RF -modtager
- Trin 3: RF -antenner
- Trin 4: RF -kommunikationsprotokol
- Trin 5: Tidsdata
- Trin 6: Tidszoner
- Trin 7: Skematisk
- Trin 8: LCD -software
- Trin 9: Ursoftware
- Trin 10: Vejrsoftware
- Trin 11: Viser
Video: Arduino 3-i-1 tids- og vejrvisning: 11 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:28
Af Boomer48Følg mere af forfatteren:
Jeg kan godt lide PIC -mikrokontrollere, og jeg kan godt lide at programmere i samlingssprog. Faktisk har jeg i løbet af de sidste par år lagt omkring 40 projekter ud på mit websted baseret på den kombination. For nylig bestilte jeg nogle dele fra en af mine foretrukne amerikanske leverandører, og jeg fik øje på en Arduino Nano, med et programmeringskabel, for kun $ 1,20 mere end en ren ATMEGA328 processorchip. Så jeg købte et par af dem. Derefter downloadede jeg Arduino IDE og støvede min hukommelse om 'C ++' programmering.
Dette projekt er en sammenblanding af et ur, der bruger GPS til timing og en RF-modtager, der afkoder vejrbeskeder fra en fælles AcuRite-sensor. Resultatet er en tidsskala og temperaturvisning i lille skala. GPS -uret og vejrrutiner er konfigureret som separate, inklusive filer, så det er let at gå ind i hovedrutinen og konfigurere det til kun at gøre urfunktionen eller bare vejrfunktionen. Du skal bare fjerne den relevante "#define" øverst i hovedrutinen, hvis du kun vil have en af funktionerne.
Hvis begge funktioner bruges, viser øverste linje på LCD'en den lokale tid, og den nederste linje på LCD'et viser luftfugtigheden og temperaturen i både Celsius og Fahrenheit. Hvis bare urfunktionen bruges, viser den øverste linje lokal tid, og den nederste linje viser UTC. Hvis bare vejrfunktionen bruges, viser den øverste linje den første sensor, der modtages, og den nederste linje viser enhver anden modtaget sensor. Jeg tilføjede denne mulighed, fordi jeg har to vejrsensorer.
Trin 1: Vejrsensor
AcuRite vejrføler, der bruges her, sender oplysninger om temperatur og luftfugtighed hvert 16. sekund. På bagsiden viser det et modelnummer på 000592TXR, men det er typisk annonceret som model 06002M. Denne sensor bruges af mange forskellige vejrstationsmodeller, så den er let at finde, og jeg kunne få dem på eBay for under $ 20. AcuRite sælger lignende udseende sensorer til nogle af deres vejrstationer, men de overholder muligvis ikke den samme kommunikationsprotokol. Der er en vis indikation på nettet om, at 00606-sensor kun for temperatur kun bruger det samme meddelelsesformat, men med en ugyldig luftfugtighedsbyte.
Som det ses i den første bølgeform vist ovenfor, sendes vejrmeddelelserne i bursts med en afstand på 2 ms mellem successive meddelelser. Den anden kurve, der er vist ovenfor, udvider en del af en meddelelse for at se bitens varigheder og mønstre. Der er fire synkroniseringsbits, der er omkring 600us høje efterfulgt af 600us lave. Databitene repræsenteres af 400us høj efterfulgt af 200us lav (1) eller 200us høj efterfulgt af 400us lav (0).
Meddelelsesformatet består af 7 bytes data. De to første bytes er sensor -ID, og disse ændres ikke (dvs. det bruger ikke en rullende kode). Den sidste byte er en simpel additiv kontrolsum af de første seks bytes. Den tredje byte er en batteriniveauindikator og bør altid være 44 hex, hvis batteriet er godt. Den fjerde byte er luftfugtigheden, og det er en ikke-skaleret værdi mellem 0 og 99. Det er vigtigt at huske på, at den mest betydningsfulde bit bytes 4, 5 og 6 er en paritetsbit og ikke er en del af målingen værdier. Bytes 5 og 6 er den skalerede temperatur (Celsius), hvor de nederste 4 bit byte 5 er sammenkædet med de lavere 7 bits byte 6 for at danne en 11-bit værdi. Temperaturen er altid repræsenteret som et positivt tal og bliver kun negativt, når skaleringen anvendes. Skaleringen er (C / 10) - 100. Divideringen med 10 er påkrævet, fordi temperaturopløsningen er i tiendedele af en grad. Subtraktionen er påkrævet, fordi sensoren tilføjer 100 for at holde den transmitterede værdi positiv.
Trin 2: RF -modtager
RF -modulet, jeg bruger til dette projekt, er RXB6. Det er en super heterodyne modtager i modsætning til de mindre ønskelige super regenerative modtagere. Hvis du ser på de billige RF -moduler derude, vil du opdage, at sender- og modtagerkort ofte er samlet sammen. De fleste af de medfølgende modtagere er superregenerative typer, så de har en tendens til at have meget lavere ydelsesegenskaber (inklusive rækkevidde) end super heterodyne -modtagere. Vi har kun brug for modtagermodulet til dette projekt, fordi vi får signaler fra en vejrføler -sender.
Trin 3: RF -antenner
RXB6 leveres ikke med en antenne. Du kan købe nogle spiralformede ret billigt, men det er også let at lave din egen antenne. Faktisk kunne et brødbrætkabel blive gledet på modulets antennestift, hvis du ikke vil blive for fancy. Ideelt set ville en lige trådantenne være 1/4 bølgelængde, som udgør omkring 6,8 tommer. Jeg lavede oprindeligt jumper wire ting og havde ikke noget problem med at hente min udvendige sensor, selvom mit elektronikværksted er i min kælder.
En anden mulighed er at lave din egen spiralformede antenne. Der er en række forskellige planer for det på nettet, men den, der er vist på billedet ovenfor, er, hvad jeg lavede. Jeg brugte en solid kernetråd fra et stykke Ethernet -kabel, og viklede det rundt om det glatte skaft på et 5/32 tommer bor. Lad isoleringen være på bortset fra den spids, der lod til RF -kortet. Du skal bruge 20 omgange. Du kan også bruge et 7/32 tommer bor og pakke 17 omdrejninger i stedet. Enhver af disse vil sandsynligvis fungere fint for de områder, du sandsynligvis vil have for dine sensorer. Den virkelige nøgle er at have en god RF -modtager til at begynde med. AcuRite -sensorerne har også temmelig stærke sendere.
Trin 4: RF -kommunikationsprotokol
Der er et par forskellige moduleringsteknikker til overførsel af data, men disse sensorer bruger den enkleste som er OOK (on-off-keying) eller ASK (amplitude-shift-keying). Da vi har at gøre med 0/1 databit i dette eksempel, er amplituden fuld til eller fra. Så for vores formål er OOK og ASK de samme, fordi OOK betyder, at RF -bæreren enten er fuld til eller helt slukket. Meddelelsesformatet er generelt defineret af producenten af sendeenheden, og de kan bruge stort set enhver transmissionshastighed, enhver bitformateringsstil og enhver meddelelseslængde. 433-MHz-båndet sidder fuld af transmissioner til ting som smarte målere osv., Så softwaren skal indstilles til at filtrere efter det beskedformat, vi gerne vil bruge.
Trin 5: Tidsdata
Jeg bruger en billig GPS -enhed for at få præcise tidsdata, der automatisk genstarter efter strømafbrydelse. Jeg har flere GPS-enheder (uden displays), der udsender standard NMEA-sætninger, men den mindste og billigste af de enheder, jeg har, er NEO-6M. NEO-6M-modulet er let at interface til Arduino, fordi det bruger en seriel port på TTL-niveau. Den eneste reelle forskel er, at NMEA-standarden angiver en seriel baudhastighed på 4800, men NEO-6M er som standard 9600 baud. Du kan køre det gratis "u-center" -program for at ændre baudhastigheden, men jeg forlod det bare ved fabriksindstillingen. Der er også et gratis hjælpeprogram kaldet GPSInfo (udsendt af Globalsat), der er meget praktisk til visning af GPS -oplysninger på pc'en. Du kan tilslutte GPS -enheden til et standard USB til TTL -kabel for at tjekke den eller for at konfigurere den ved hjælp af en pc. Husk, at GPS-chippen på modulet faktisk kører ved 3,3 volt (via en indbygget spændingsregulator), så hvis du vil oprette forbindelse til dens RXD-port, skal du niveauskifte ned fra 5 volt. TXD -porten kan tilsluttes direkte til Arduino eller pc'en.
Trin 6: Tidszoner
Visning af GPS -tid er en let ting at gøre, så længe du bare vil vise UTC (Universal Time Coordinated). NMEA -sætningerne består af ASCII -tegn, der kan sendes direkte til LCD -skærmen. Tidsdelen er i formatet HHMMSS. FF (timer, minutter, sekunder og brøk sekunder). For vores ur er den brøkdel, der ikke er nyttig, så alt, hvad vi skal håndtere, er seks tegn. Problemet er, at du derefter skal konvertere til din lokale tid og til et 12-timers AM/PM-format, hvis du vil have det. Men nogle gange er problemer det, der gør livet interessant, så det er det, den del af softwaren egentlig handler om.
Hvad angår tidszoner, tror du måske, at der simpelthen ville være 24 af dem med 12 af dem øst for UTC-placeringen (+ zoner) og 12 af dem vest for UTC-placeringen (- zoner). Faktisk er der et par ulige, der er fraktionelle timer og et par, der overstiger 12 -timers "grænse". Hvis du tilfældigvis bor i et af disse områder, beklager jeg, fordi min software kun tegner sig for 24 hele timenzoner. Der er også nogle af os, der bruger sommertid en del af året, men det redegøres ikke automatisk for i softwaren. Det ville kræve en opslagstabel med fremtidige datoer, ekstra kompleksitet i softwaren og behovet for at opdatere softwaren, hvis årets uger for skiftet ændres. I stedet bruger hardwaren en kortvarig kontaktkontakt for at muliggøre nem indstilling af tidszonen (UTC -forskydning).
Trin 7: Skematisk
Skematikken er vist ovenfor og indeholder forbindelser til et 4-bit 1602 LCD-interface. De serielle data fra RF -modtageren er på digitale logiske niveauer, så de er forbundet direkte til en af Arduino -dataindgangsstifterne. Stiften er konfigureret i softwaren til at udføre en interrupt-on-change-funktion, så vi kan måle pulsbredderne. GPS TXD -udgangen er direkte forbundet til Arduino RX -indgangen.
Der bruges to kontakter. Som nævnt tidligere tillader en kortvarig kontaktafbryder indstilling af UTC -forskydningen. Der kan til enhver tid trykkes på kontakten for at gå ind i den indstillede tilstand. I første omgang viser displayet en ugyldig UTC -forskydning på “+77”. Se afsnittet "Ursoftware" for instruktioner om indstilling af UTC -forskydning.
Den anden kontakt er en enkel tænd/sluk -kontakt. I positionen "slukket" vises tiden i 12-timers format (AM/PM) og i "tændt" -positionen vises tiden i 24-timers format. Denne kontakt kan til enhver tid ændres for at skifte mellem formater.
Hvis bare urfunktionen er ønsket, behøver RF -modtagermodulet ikke at være tilsluttet. Hvis bare vejrfunktionen er ønsket, behøver GPS'en og de to kontakter ikke at være tilsluttet.
Trin 8: LCD -software
Jeg har en tendens til at bruge en af to typer LCD -grænseflader. Den ene er standard 4-bit grænsefladen, og den anden er en 3-leder grænseflade, der bruger et skiftregister. Jeg designede denne grænseflade, da jeg arbejdede med små PIC -mikrokontroller, der havde et begrænset antal I/O -ben. Jeg brugte 4-bit-grænsefladen til dette projekt, men har min egen LCD-fil med fil i stedet for at bruge det generiske Arduino LCD-bibliotek. Det reducerer hukommelsesforbrug og kodekompleksitet og giver mig også mulighed for at justere koden til specifikke projekter som denne.
Trin 9: Ursoftware
GPS-enheden udsender standard NMEA-0183 sætninger, som er ASCII-strenge, der indeholder en række oplysninger. Til denne applikation valgte jeg GGA -sætningen for at få tidsoplysninger, fordi det er den sætning, jeg brugte til et tidligere GPS -projekt. Informationsfelter i NMEA -sætninger adskilles med kommaer, så efter at GGA -sætningsoverskriften er registreret, vil softwaren normalt tælle kommaer og kalde den relevante rutine for hvert ønsket felt med GPS -information. Det er kun nødvendigt med tidsoplysninger her, og det er i feltet efter det første komma, så ingen tælling er nødvendig.
De seks tidstal (HHMMSS) bufferes og behandles derefter, efter at de alle er modtaget. GPS'en udsender muligvis nogle ufuldstændige meddelelser tidligt, så bufferrutinen verificerer, at hvert tegn er en ASCII -numerisk værdi. Hvis der modtages en dårlig karakter, kasseres meddelelsen. Dette kan også ske i sjældne tilfælde under normal drift, især hvis den serielle portkommunikation falder en smule. Jeg har kun set dette én gang, og alt der skete er, at tiden holdt pause i et sekund og derefter hoppede to sekunder i stedet for et.
Hvis softwaren er konfigureret til kun at vise tidsvisning, viser den første linje på LCD'en lokal tid, og den anden linje viser UTC. For UTC sender softwaren bare ASCII -tegnene direkte til displayrutinen, med kolon (:) indsat korrekt.
For at konvertere UTC til lokal tid skal UTC -forskydningen (tidszone) anvendes. Fordi UTC -tiden fra GPS'en er i ASCII -format, konverterer softwaren ASCII -timetegnene til decimaler og tilføjer derefter UTC -forskydningen. UTC -forskydningen gemmes som en positiv BCD -værdi med en tegnbit, så den først konverteres til en heltalsværdi og derefter negeres, hvis tegnbitten er indstillet. Når den lokale tidstidsværdi er beregnet, bruges en opslagstabel til at konvertere den til BCD, og derefter konverteres BCD'en tilbage til ASCII til visning. Opslagstabellen skal håndtere 24-timers UTC-format samt +/- 12 tidszoner. For at gøre dette indtager UTC -tiderne fra 0000 til 2300 de midterste 24 poster i tabellen med 12 poster før og 12 poster efter for at tage højde for tidszonerne. Et bord er i 12-timers format, så jeg tilføjede også en opslagstabel til AM/PM-delen af displayet. Den anden tabel er i 24-timers format. Som nævnt tidligere giver en tænd/sluk-knap mulighed for valg af 12-timers eller 24-timers format.
Tidszonen hentes fra EEPROM under initialisering og vises kort. Hvis den ikke er blevet indstillet mindst én gang, kaldes indstillingsrutinen. Indstillingsrutinen kan også til enhver tid kaldes ved at trykke på den momentane kontaktkontakt. Indstillingsrutinen initialiserer displayet til “UTC OFFSET +77”. Et kort tryk på kontakten ændrer værdien til “-00”. Hvis en positiv tidszone er påkrævet, ændrer endnu et kort tryk værdien til “+00”. Et langt tryk (> 1 sekund) vil flytte indstillingstilstanden til det næste trin. På dette tidspunkt vil hvert kort tryk øge tidsværdien til et maksimum på 12. Efter at have nået den ønskede tidszone, skal du trykke på kontakten og holde den nede i mere end 1 sekund og derefter slippe den. Softwaren gemmer derefter UTC -værdien i EEPROM og viser kort "OFFSET SAVED". Hvis du laver en fejl under indtastning, skal du bare afslutte og derefter trykke på kontakten igen for at nulstille den.
NEO-6M kræver ikke en god positionsrettelse for at sende tiden, så den skal udsende meddelelser, så snart den får en satellit. Indtil da viser displayet “NO DATA”.
Trin 10: Vejrsoftware
PIC -mikrokontrolleren har mulighed for at låse en timer til/fra ved hjælp af en ekstern puls. Den samme inputpuls kan også bruges som en ekstern afbrydelse til at signalere en læsning af varigheden af pulsen. Arduino har ikke den nøjagtige kapacitet, så jeg brugte interrupt-on-change-funktionen. På den ene kant af RF -meddelelsespulsen gemmes den aktuelle mikrosekundtid af afbrydelsesbehandleren. På den modsatte kant beregnes den forløbne tid til at bestemme pulsbredden.
Softwaren har en "DEBUG" -definition, der giver mulighed for visning af rådataformatet for de modtagne meddelelser. Der er også en definition for at angive Arduino -indgangsstiften for den serielle strøm fra RF -modtageren. Softwaren er konfigureret til at beregne de passende interrupt-on-change registerindstillinger baseret på denne definition. Beregningen fungerer kun for Arduino digitale ben. En analog pin kunne bruges i stedet, men det ville kræve hård kodning af registerværdierne.
Afbrydelsesbehandleren bestemmer, om det registrerede antal er længe nok til at være en startpuls. Som nævnt tidligere er afstanden mellem flere meddelelser 2 ms, så det er det, softwaren leder efter. På grund af al trafikken på 433 MHz sørger den indledende screening i softwaren for, at den målte tid er mindst 1,8 ms, men ikke større end 2,4 ms. Når starten er registreret, søger softwaren efter synkroniseringsbitene (600us) og tæller for at sikre, at fire af dem modtages. Når disse tests er bestået, søger softwaren efter de korrekte bitider på 200us og 400us.
Modtagne bits formes til bytes, og hver byte gemmes. Efter at syv bytes er modtaget, kontrolleres kontrolsummen med beskeden, før yderligere behandling er tilladt. Hvis rå bytes skal udskrives (fejlretningstilstand), konverteres bytes til ASCII -tegn og sendes ud til LCD'et. Hvis luftfugtigheds- og temperaturoutput ønskes, udføres de relevante konverteringer.
De to bytes med Celsius-data i RF-meddelelsen moses sammen for at danne en 11-bit værdi. Den nederste del forskydes til venstre en bit for at eliminere paritetsbitten og for at justere den med bitene i den øvre del. De to bytes er formet til en 16-bit ordvariabel, og derefter er det hele forskudt en bit for at få den sidste bitjustering. Ordet variabel konverteres derefter til en floating point -variabel til matematiske beregninger.
En stor fordel ved at bruge C ++ på Arduino kontra forsamlingssprog på PIC er, at det forenkler matematiske beregninger. Som tidligere nævnt er Centigrade -konverteringen (C / 10) -100. Resultatet konverteres til en streng og sendes til LCD for visning. Fahrenheit -beregningen er (C * 1.8) + 32. Resultatet konverteres igen til en streng og sendes til LCD'et til visning. I begge tilfælde inkluderer strengkonverteringen det negative tegn (hvis det er relevant) og decimaltegnet. Der kontrolleres med decimaltegnet for at sikre, at kun et tegn efter decimalet sendes til displayet. Denne kontrol er nødvendig, fordi strengen kan variere fra 3 til 5 tegn i længden.
Jeg har to AcuRite -sensorer, så jeg tilføjede en check i softwaren for at sikre, at dataene for den ene ikke overskriver dataene for den anden, hvis softwaren er indstillet til kun at udføre vejrfunktionen. Den første sensor, der modtages efter opstart, vises på linje 1, og den anden vises på linje 2. Ved at bruge fejlfindingstilstand kan jeg se, hvad ID'et er for hver sensor, så jeg kunne foretage en enkel check i koden, hvis jeg kun ønskede at behandle data fra en af dem.
Softwaren overvåger batteristatus (byte3) og viser en meddelelse, hvis den angiver et lavt batteriniveau. Denne meddelelse overskriver alle andre data for den pågældende sensor.
Trin 11: Viser
Her er nogle eksempelvisninger til de forskellige funktioner. Jeg har et par andre Instructables, men de fleste af mine PIC -mikrokontrollerprojekter kan findes på mit websted på: www.boomerrules.wordpress.com
Anbefalede:
Arduino bil omvendt parkering alarmsystem - Trin for trin: 4 trin
Arduino bil omvendt parkering alarmsystem. Trin for trin: I dette projekt vil jeg designe en simpel Arduino bil omvendt parkeringssensorkreds ved hjælp af Arduino UNO og HC-SR04 ultralydssensor. Dette Arduino -baserede bilomvendt alarmsystem kan bruges til en autonom navigation, robotafstand og andre rækkevidde
Enkel vejrvisning ved hjælp af Raspberry PI og Cyntech WeatherHAT: 4 trin
Enkel vejrvisning ved hjælp af Raspberry PI og Cyntech WeatherHAT: * I 2019 ændrede Yahoo sin API, og dette stoppede med at fungere. Jeg var ikke klar over ændringen. I september 2020 er dette projekt blevet opdateret til at bruge OPENWEATHERMAP API Se det opdaterede afsnit herunder, resten af disse oplysninger er stadig gode
Akustisk levitation med Arduino Uno trin for trin (8 trin): 8 trin
Akustisk levitation med Arduino Uno Step-by Step (8-trin): ultralyds lydtransducere L298N Dc kvindelig adapter strømforsyning med en han-DC-pin Arduino UNOBreadboard Sådan fungerer det: Først uploader du kode til Arduino Uno (det er en mikrokontroller udstyret med digital og analoge porte til konvertering af kode (C ++)
RC -sporet robot ved hjælp af Arduino - Trin for trin: 3 trin
RC Tracked Robot Using Arduino - Step by Step: Hey guys, I are back with another cool Robot chassis from BangGood. Håber du har gennemgået vores tidligere projekter - Spinel Crux V1 - Gesture Controlled Robot, Spinel Crux L2 - Arduino Pick and Place Robot med Robotic Arms og The Badland Braw
Storbritannien Tog og vejrvisning: 5 trin
Tog- og vejrvisning i Storbritannien: Denne vejledning er beregnet til batteridrevne britiske togafgange og vejrvisning. Det brugte National Rail OpenLDBWS -databasen til at få oplysninger om togafgang i realtid for en bestemt lokal jernbanestation og vise dem. Den bruger openweather