Inhoudsopgave:

Arduino 3-in-1 tijd- en weerweergave - Ajarnpa
Arduino 3-in-1 tijd- en weerweergave - Ajarnpa

Video: Arduino 3-in-1 tijd- en weerweergave - Ajarnpa

Video: Arduino 3-in-1 tijd- en weerweergave - Ajarnpa
Video: 🇳🇱 ARDUINO STOPWATCH - Arduino project 2024, November
Anonim

Door Boomer48Volg meer van de auteur:

De ATtiny85. gebruiken
De ATtiny85. gebruiken
De ATtiny85. gebruiken
De ATtiny85. gebruiken
Pie Powered Pie Partitionering en Polygon Snoeien Tool
Pie Powered Pie Partitionering en Polygon Snoeien Tool
Pie Powered Pie Partitionering en Polygon Snoeien Tool
Pie Powered Pie Partitionering en Polygon Snoeien Tool
Digitale bedieningselementen voor een handmatige audioversterker
Digitale bedieningselementen voor een handmatige audioversterker
Digitale bedieningselementen voor een handmatige audioversterker
Digitale bedieningselementen voor een handmatige audioversterker

Ik hou van PIC-microcontrollers en ik hou van programmeren in assembler. In feite heb ik de afgelopen jaren ongeveer 40 projecten op mijn website geplaatst op basis van die combinatie. Onlangs bestelde ik wat onderdelen bij een van mijn favoriete Amerikaanse leveranciers en ik zag een Arduino Nano, met een programmeerkabel, voor slechts $ 1,20 meer dan een kale ATMEGA328-processorchip. Dus kocht ik er een paar. Daarna heb ik de Arduino IDE gedownload en mijn geheugen van 'C++'-programmering afgestoft.

Dit project is een mash-up van een klok die GPS gebruikt voor timing en een RF-ontvanger die weerberichten van een gewone AcuRite-sensor decodeert. Het resultaat is een kleinschalige tijd- en temperatuurweergave. De GPS-klok- en weerroutines zijn ingesteld als afzonderlijke meegeleverde bestanden, dus het is gemakkelijk om naar de hoofdroutine te gaan en deze te configureren om alleen de klokfunctie of alleen de weerfunctie uit te voeren. Verwijder het commentaar van de juiste "#define" bovenaan de hoofdroutine als u slechts één van de functies wilt.

Als beide functies worden gebruikt, geeft de bovenste regel van het LCD-scherm de lokale tijd weer en de onderste regel van het LCD-scherm de vochtigheid en temperatuur in zowel Celsius als Fahrenheit. Als alleen de klokfunctie wordt gebruikt, wordt op de bovenste regel de lokale tijd weergegeven en op de onderste regel UTC. Als alleen de weerfunctie wordt gebruikt, geeft de bovenste regel de eerste ontvangen sensor weer en de onderste regel elke andere ontvangen sensor. Ik heb die mogelijkheid toegevoegd omdat ik twee weersensoren heb.

Stap 1: Weersensor

Weersensor
Weersensor
Weersensor
Weersensor
Weersensor
Weersensor

De hier gebruikte AcuRite-weersensor stuurt elke 16 seconden temperatuur- en vochtigheidsinformatie. Op de achterkant staat het modelnummer 000592TXR, maar het wordt meestal geadverteerd als model 06002M. Deze sensor wordt door veel verschillende weerstationmodellen gebruikt, dus het is gemakkelijk te vinden en ik kon ze op eBay krijgen voor minder dan $ 20. AcuRite verkoopt gelijkaardige sensoren voor sommige van hun weerstations, maar ze kunnen al dan niet aan hetzelfde communicatieprotocol voldoen. Er is enige indicatie op internet dat de 00606-sensor voor alleen temperatuur hetzelfde berichtformaat gebruikt, maar met een ongeldige vochtigheidsbyte.

Zoals te zien is in de eerste golfvorm hierboven, worden de weerberichten in bursts verzonden met een tussenruimte van 2 ms tussen opeenvolgende berichten. De tweede golfvorm die hierboven wordt getoond, breidt een deel van één bericht uit om de bitduur en -patronen te zien. Er zijn vier synchronisatiebits die ongeveer 600us hoog zijn, gevolgd door 600us laag. De databits worden weergegeven door 400us hoog gevolgd door 200us laag (1) of 200us hoog gevolgd door 400us laag (0).

Het berichtformaat bestaat uit 7 bytes aan gegevens. De eerste twee bytes zijn de sensor-ID en deze veranderen niet (d.w.z. er wordt geen rollende code gebruikt). De laatste byte is een eenvoudige additieve controlesom van de eerste zes bytes. De derde byte is een indicator voor het batterijniveau en moet altijd 44 hex zijn als de batterij goed is. De vierde byte is de vochtigheid en het is een niet-geschaalde waarde tussen 0 en 99. Het is belangrijk om in gedachten te houden dat het meest significante bit van bytes 4, 5 en 6 een pariteitsbit is en geen deel uitmaakt van de meting waarden. Bytes 5 en 6 zijn de geschaalde temperatuur (Celsius) waarbij de onderste 4 bits van byte 5 worden samengevoegd met de onderste 7 bits van byte 6 om een 11-bits waarde te vormen. De temperatuur wordt altijd weergegeven als een positief getal en wordt pas negatief als de schaal wordt toegepast. De schaal is (C / 10) - 100. Delen door 10 is vereist omdat de temperatuurresolutie in tienden van een graad is. De aftrekking is nodig omdat 100 door de sensor wordt opgeteld om de verzonden waarde positief te houden.

Stap 2: RF-ontvanger

RF-ontvanger
RF-ontvanger
RF-ontvanger
RF-ontvanger

De RF-module die ik voor dit project gebruik, is de RXB6. Het is een super heterodyne ontvanger in tegenstelling tot de minder wenselijke super regeneratieve ontvangers. Als je kijkt naar de goedkope RF-modules die er zijn, zul je merken dat zender- en ontvangerkaarten vaak bij elkaar worden gebundeld. De meeste van die gebundelde ontvangers zijn super regeneratieve typen, dus ze hebben de neiging om veel lagere prestatiekenmerken (inclusief bereik) te hebben dan super heterodyne ontvangers. We hebben alleen de ontvangermodule nodig voor dit project omdat we signalen krijgen van een weersensorzender.

Stap 3: RF-antennes

RF-antennes
RF-antennes

De RXB6 wordt niet geleverd met een antenne. Je kunt een aantal spiraalvormige exemplaren vrij goedkoop kopen, maar het is ook gemakkelijk om je eigen antenne te maken. In feite kan een breadboard-startkabel op de antennepin van de module worden geschoven als je niet te luxe wilt worden. Idealiter zou een rechte draadantenne 1/4 golflengte hebben, wat neerkomt op ongeveer 6,8 inch. Ik deed aanvankelijk het jumper wire-ding en had geen probleem om mijn buitensensor op te pakken, ook al is mijn elektronica-werkplaats in mijn kelder.

Een andere mogelijkheid is om uw eigen spiraalantenne te maken. Er zijn verschillende plannen daarvoor op internet, maar degene die op de afbeelding hierboven wordt getoond, is wat ik heb gemaakt. Ik gebruikte wat massieve draad van een stukje ethernetkabel en wikkelde het rond de gladde schacht van een boor van 5/32 inch. Laat de isolatie aan, behalve de punt die aan de RF-kaart soldeert. Je hebt 20 beurten nodig. U kunt ook een boor van 7/32 inch gebruiken en in plaats daarvan 17 slagen wikkelen. Elk van deze zal waarschijnlijk prima werken voor het bereik dat u waarschijnlijk voor uw sensoren hebt. De echte sleutel is om te beginnen een goede RF-ontvanger. De AcuRite-sensoren hebben ook behoorlijk sterke zenders.

Stap 4: RF-communicatieprotocol

Er zijn een paar verschillende modulatietechnieken voor het verzenden van gegevens, maar deze sensoren gebruiken de eenvoudigste, namelijk OOK (on-off-keying) of ASK (amplitude-shift-keying). Aangezien we in dit voorbeeld te maken hebben met 0/1 databits, is de amplitude volledig aan of volledig uit. Dus voor onze doeleinden zijn OOK en ASK hetzelfde, omdat OOK betekent dat de RF-draaggolf volledig aan of volledig uit is. Het berichtformaat wordt over het algemeen gedefinieerd door de fabrikant van het verzendende apparaat en ze kunnen vrijwel elke transmissiesnelheid, elke bitformatteringsstijl en elke berichtlengte gebruiken. De 433-MHz-band zit vol met uitzendingen voor zaken als slimme meters, enz. Dus de software moet worden afgestemd om te filteren op alleen het berichtformaat dat we willen gebruiken.

Stap 5: Tijdgegevens

Tijdgegevens
Tijdgegevens

Ik gebruik een goedkope GPS-eenheid om nauwkeurige tijdgegevens te krijgen die automatisch opnieuw worden gestart na een stroomstoring. Ik heb verschillende GPS-apparaten (zonder displays) die de standaard NMEA-zinnen uitvoeren, maar de kleinste en goedkoopste van de eenheden die ik heb, is de NEO-6M. De NEO-6M-module is eenvoudig te koppelen aan de Arduino omdat deze een seriële poort op TTL-niveau gebruikt. Het enige echte verschil is dat de NMEA-standaard een seriële baudrate van 4800 specificeert, maar de NEO-6M is standaard 9600 baud. U kunt het gratis programma "u-center" uitvoeren om de baudrate te wijzigen, maar ik heb het gewoon op de fabrieksinstellingen gelaten. Er is ook een gratis hulpprogramma genaamd GPSInfo (uitgebracht door Globalsat) dat erg handig is voor het bekijken van GPS-informatie op de pc. U kunt de GPS-eenheid aansluiten op een standaard USB-naar-TTL-kabel om hem uit te checken of om hem in te stellen met een pc. Houd er rekening mee dat de GPS-chip op de module daadwerkelijk op 3,3 volt werkt (via een ingebouwde spanningsregelaar), dus als u verbinding wilt maken met de RXD-poort, moet u het niveau verlagen van 5 volt. De TXD-poort kan rechtstreeks op de Arduino of de pc worden aangesloten.

Stap 6: Tijdzones

Het weergeven van de GPS-tijd is eenvoudig, zolang u alleen UTC (Universal Time Coordinated) wilt weergeven. De NMEA-zinnen zijn samengesteld uit ASCII-tekens die direct kunnen worden uitgevoerd naar het LCD-scherm. Het tijdgedeelte heeft de indeling HMMMSS. FF (uren, minuten, seconden en fracties van seconden). Voor onze klok is het fractionele deel niet nuttig, dus we hoeven alleen maar zes tekens te gebruiken. Het probleem is dat je dan moet converteren naar je lokale tijd en naar een 12-uurs AM/PM-formaat als je dat wilt. Maar soms maken problemen het leven interessant, dus dat is waar dat deel van de software echt om draait.

Wat tijdzones betreft, zou je kunnen denken dat er gewoon 24 zouden zijn, waarvan 12 ten oosten van de UTC-locatie (+ zones) en 12 ten westen van de UTC-locatie (- zones). In feite zijn er een paar excentrieke uren die fractionele uren zijn en een paar die de "limiet" van 12 uur overschrijden. Als je toevallig in een van die gebieden woont, bied ik mijn excuses aan omdat mijn software alleen de 24-uurszones dekt. Er zijn er ook die een deel van het jaar zomertijd gebruiken, maar daar wordt niet automatisch rekening mee gehouden in de software. Dat vereist een opzoektabel met toekomstige datums, extra complexiteit in de software en de noodzaak om de software bij te werken als de weken van het jaar voor de omschakeling veranderen. In plaats daarvan gebruikt de hardware een tijdelijke contactschakelaar om de tijdzone (UTC-offset) eenvoudig in te stellen.

Stap 7: Schematisch

Schematisch
Schematisch

Het schema is hierboven weergegeven en bevat de aansluitingen voor een 4-bit 1602 LCD-interface. De seriële gegevens van de RF-ontvanger bevinden zich op digitale logische niveaus, dus deze zijn rechtstreeks verbonden met een van de Arduino-gegevensinvoerpinnen. De pin is in de software geconfigureerd om een interrupt-on-change functie uit te voeren zodat we de pulsbreedtes kunnen meten. De GPS TXD-uitgang is rechtstreeks verbonden met de Arduino RX-ingang.

Er zijn twee schakelaars gebruikt. Zoals eerder vermeld, maakt een tijdelijke contactschakelaar het mogelijk om de UTC-offset in te stellen. De schakelaar kan op elk moment worden ingedrukt om naar de instelmodus te gaan. In eerste instantie zal het display een ongeldige UTC-offset van “+77” weergeven. Raadpleeg het gedeelte "Kloksoftware" voor instructies voor het instellen van UTC-offset.

De tweede schakelaar is een eenvoudige aan/uit-schakelaar. In de “off” positie wordt de tijd weergegeven in 12-uurs formaat (AM/PM) en in de “on” positie wordt de tijd weergegeven in 24-uurs formaat. Deze schakelaar kan op elk moment worden gewijzigd om tussen formaten te schakelen.

Als alleen de klokfunctie gewenst is, hoeft de RF-ontvangermodule niet te worden aangesloten. Als alleen de weerfunctie gewenst is, dan hoeven de GPS en de twee schakelaars niet te worden aangesloten.

Stap 8: LCD-software

Ik heb de neiging om een van de twee soorten LCD-interfaces te gebruiken. De ene is de standaard 4-bits interface en de andere is een 3-draads interface die een schuifregister gebruikt. Ik ontwierp die interface toen ik met kleine PIC-microcontrollers werkte die een beperkt aantal I/O-pinnen hadden. Ik heb de 4-bit-interface voor dit project gebruikt, maar heb mijn eigen LCD-bestand in plaats van de generieke Arduino LCD-bibliotheek te gebruiken. Dat vermindert het geheugenverbruik en de complexiteit van de code en stelt me ook in staat om de code voor specifieke projecten zoals deze aan te passen.

Stap 9: Kloksoftware

De GPS-eenheid voert standaard NMEA-0183-zinnen uit die ASCII-reeksen zijn die een verscheidenheid aan informatie bevatten. Voor deze toepassing heb ik de GGA-zin gekozen om de tijdinformatie te krijgen, want dat is de zin die ik gebruikte voor een eerder GPS-project. Informatievelden in NMEA-zinnen worden gescheiden door komma's, dus nadat de GGA-zinkop is gedetecteerd, telt de software normaal gesproken komma's en roept de juiste routine op voor elk gewenst veld met GPS-informatie. Alleen de tijdinformatie is hier nodig en dat staat in het veld na de eerste komma, dus tellen is niet nodig.

De zes tijdcijfers (HHMMSS) worden gebufferd en vervolgens verwerkt nadat ze allemaal zijn ontvangen. De GPS kan in het begin enkele onvolledige berichten uitvoeren, zodat de bufferroutine controleert of elk teken een ASCII-numerieke waarde is. Als een slecht teken wordt ontvangen, wordt het bericht weggegooid. Dit kan ook in zeldzame gevallen gebeuren tijdens normaal gebruik, vooral als de communicatie via de seriële poort een beetje wegvalt. Ik heb dit maar één keer gezien en het enige dat is gebeurd, is dat de tijd een seconde pauzeerde en vervolgens twee seconden sprong in plaats van één.

Als de software is geconfigureerd om alleen tijd weer te geven, zal de eerste regel van het LCD-scherm de lokale tijd weergeven en de tweede regel UTC. Voor UTC stuurt de software de ASCII-tekens rechtstreeks naar de weergaveroutine, met de juiste dubbele punten (:).

Om de UTC om te rekenen naar lokale tijd, moet de UTC-offset (tijdzone) worden toegepast. Omdat de UTC-tijd van de GPS in ASCII-indeling is, converteert de software de ASCII-uurtekens naar decimaal en voegt vervolgens de UTC-offset toe. De UTC-offset wordt opgeslagen als een positieve BCD-waarde met een tekenbit, zodat deze eerst wordt geconverteerd naar een geheel getal en vervolgens teniet wordt gedaan als het tekenbit is ingesteld. Nadat de lokale tijd-uurwaarde is berekend, wordt een opzoektabel gebruikt om deze naar BCD te converteren, en vervolgens wordt de BCD terug geconverteerd naar ASCII voor weergave. De opzoektabel moet het 24-uurs UTC-formaat kunnen verwerken, evenals +/- 12 tijdzones. Om dit te doen, nemen de UTC-tijden van 0000 tot 2300 de middelste 24 vermeldingen in de tabel in beslag met 12 vermeldingen ervoor en 12 vermeldingen erna om rekening te houden met de tijdzones. Eén tabel heeft een 12-uurs formaat, dus ik heb ook een opzoektabel toegevoegd voor het AM/PM-gedeelte van het scherm. De andere tabel is in 24-uurs formaat. Zoals eerder vermeld, maakt een aan/uit-schakelaar het mogelijk om het 12-uurs of 24-uurs formaat te selecteren.

De tijdzone wordt tijdens de initialisatie uit de EEPROM gehaald en kort weergegeven. Als het niet minstens één keer is ingesteld, wordt de instelroutine aangeroepen. De instelroutine kan ook op elk moment worden opgeroepen door op de tijdelijke contactschakelaar te drukken. De instellingsroutine initialiseert het display naar "UTC OFFSET +77". Een korte druk op de schakelaar verandert de waarde in “-00”. Als een positieve tijdzone vereist is, zal nogmaals kort drukken de waarde veranderen in “+00”. Lang indrukken (> 1 seconde) zal de instelmodus naar de volgende stap verplaatsen. Op dit punt zal elke korte druk de tijdswaarde verhogen tot een maximum van 12. Nadat u de gewenste tijdzone heeft bereikt, houdt u de schakelaar langer dan 1 seconde ingedrukt en laat u deze vervolgens los. De software slaat dan de UTC-waarde op in EEPROM en geeft kort “OFFSET SAVED” weer. Als u een fout maakt tijdens het invoeren, verlaat u het gewoon en drukt u opnieuw op de schakelaar om het te resetten.

De NEO-6M heeft geen goede positiebepaling nodig om de tijd uit te voeren, dus hij zou berichten moeten uitzenden zodra hij een satelliet ontvangt. Tot die tijd zal het display “NO DATA” weergeven.

Stap 10: Weersoftware

De PIC-microcontroller heeft de mogelijkheid om een timer aan/uit te zetten met behulp van een externe puls. Diezelfde ingangspuls kan ook worden gebruikt als een externe interrupt om een uitlezing van de duur van de puls te signaleren. De Arduino heeft die exacte mogelijkheid niet, dus ik heb de functie interrupt-on-change gebruikt. Op één rand van de RF-berichtpuls wordt de huidige microseconde tijd opgeslagen door de interrupt-handler. Op de tegenoverliggende rand wordt de verstreken tijd berekend om de pulsduur te bepalen.

De software heeft een "DEBUG"-definitie waarmee het ruwe gegevensformaat van de ontvangen berichten kan worden weergegeven. Er is ook een definitie om de Arduino-invoerpin voor de seriële stream van de RF-ontvanger te specificeren. De software is ingesteld om de juiste registerinstellingen voor onderbrekingen bij wijziging te berekenen op basis van deze definitie. De berekening werkt alleen voor de Arduino digitale pinnen. In plaats daarvan zou een analoge pin kunnen worden gebruikt, maar daarvoor zou een harde codering van de registerwaarden nodig zijn.

De interrupt-handler bepaalt of de vastgelegde telling lang genoeg is om een startpuls te zijn. Zoals eerder vermeld, is de kloof tussen meerdere berichten 2 ms, dus daar zoekt de software naar. Vanwege al het 433 MHz-verkeer zorgt de initiële screening in de software ervoor dat de gemeten tijd minimaal 1,8 ms maar niet groter dan 2,4 ms is. Nadat de start is gedetecteerd, zoekt de software naar de synchronisatiebits (600us) en telt om ervoor te zorgen dat er vier worden ontvangen. Zodra deze tests zijn geslaagd, zoekt de software naar de juiste bittijden van 200us en 400us.

Ontvangen bits worden gevormd tot bytes en elke byte wordt opgeslagen. Nadat zeven bytes zijn ontvangen, wordt de controlesom van het bericht geverifieerd voordat verdere verwerking wordt toegestaan. Als onbewerkte bytes moeten worden uitgevoerd (foutopsporingsmodus), worden de bytes geconverteerd naar ASCII-tekens en naar het LCD-scherm verzonden. Als vocht- en temperatuuruitgangen gewenst zijn, worden de juiste conversies uitgevoerd.

De twee bytes aan Celsius-gegevens in het RF-bericht worden samengevoegd tot een 11-bits waarde. Het onderste gedeelte wordt één bit naar links verschoven om het pariteitsbit te elimineren en om het uit te lijnen met de bits in het bovenste gedeelte. De twee bytes worden gevormd tot een 16-bits woordvariabele en dan wordt het geheel een bit naar rechts verschoven om de laatste bituitlijning te krijgen. De woordvariabele wordt vervolgens geconverteerd naar een variabele met drijvende komma voor de wiskundige berekeningen.

Een groot voordeel van het gebruik van C++ op de Arduino versus assembleertaal op de PIC is dat het de wiskundige berekeningen vereenvoudigt. Zoals eerder vermeld is de Celsius-conversie (C / 10) -100. Het resultaat wordt geconverteerd naar een string en naar het LCD-scherm gestuurd voor weergave. De Fahrenheit-berekening is (C * 1.8) + 32. Het resultaat wordt opnieuw geconverteerd naar een string en naar het LCD-scherm gestuurd voor weergave. In beide gevallen bevat de String-conversie het minteken (indien van toepassing) en de komma. Er wordt gecontroleerd op het decimaalteken om er zeker van te zijn dat er slechts één teken na het decimaalteken naar het display wordt gestuurd. Die controle is nodig omdat de tekenreeks 3 tot 5 tekens lang kan zijn.

Ik heb twee AcuRite-sensoren, dus ik heb een controle in de software toegevoegd om ervoor te zorgen dat de gegevens voor de ene de gegevens voor de andere niet overschrijven als de software is ingesteld om alleen de weerfunctie uit te voeren. De eerste sensor die na het opstarten wordt ontvangen, wordt weergegeven op regel 1 en de andere wordt weergegeven op regel 2. Door de foutopsporingsmodus te gebruiken, kan ik zien wat de ID is voor elke sensor, zodat ik de code eenvoudig kan controleren als ik alleen gegevens van een van hen wilde verwerken.

De software bewaakt de batterijstatus (byte3) en geeft een bericht weer als deze aangeeft dat de batterij bijna leeg is. Dit bericht overschrijft alle andere gegevens voor die sensor.

Stap 11: Beeldschermen

Displays
Displays
Displays
Displays
Displays
Displays

Hier zijn enkele voorbeeldweergaven voor de verschillende functies. Ik heb een paar andere Instructables, maar de meeste van mijn PIC-microcontrollerprojecten zijn te vinden op mijn website op: www.boomerrules.wordpress.com

Aanbevolen: