Stap 5: Arduino programmering
1. LCD Driver
Eerst en vooral, zocht ik naar een eenvoudige en kleine bibliotheek voor het LCD-scherm, de Nokia 5110. Er waren een paar verschillende bibliotheken voor dit LCD: Adafruit, Sparkfunen Henning Karlsen' s. Onder deze bibliotheken koos ik Henning Karlsen van omdat ik nodig alleen eenvoudige tekst weer te geven met een paar verschillende lettergroottes. Henning Karlsen heeft aparte bibliotheek voor afbeeldingen zo goed. Ik bedank Henning voor zijn delen zijn nice work op de bibliotheek. Henning van bibliotheek ondersteunt 3 verschillende lettergroottes: SmallFont (tekst en nummer, 6 × 8), MediumNumber (alleen nummer, 12 × 16) en BigNumber (nummer enkel, 14 x 24). Slechts aan de onderkant van deze bibliotheek is dat de middelgrote en grote lettertypen geen teksten, maar alleen getallen ondersteunen. Maar ik zou alleen getallen weer te geven met grotere lettertypes nodig, was deze beperking geen probleem mee.
2. de afstand berekenen tussen twee locaties
Er zijn aantal websites tonen hoe Bereken afstand tussen twee locaties van breedtegraden en posities. Movable Type Scripts bevat diverse berekeningen van afstand, peiling en andere nuttige conversies met behulp van de Haversine formule en BlueMM geboekt de Excel formule voor het berekenen van de afstand die is in principe op dezelfde manier als Haversine.
De berekening is vrij eenvoudig, maar ik vond dat er een probleem was: Arduino (Atmega328p) niet overweg kan met meer dan 6-7e decimalen dat is heel belangrijk in trigonometrische berekening voor korte afstand.
Arduino referentie pagina zegt "Floats hebben 6-7 alleen decimale cijfers van precisie. Dat betekent dat het totale aantal cijfers, niet het nummer rechts van de decimale komma. In tegenstelling tot andere platforms, waar kunt u nauwkeuriger met behulp van een double (bijvoorbeeld maximaal 15 cijfers), op de Arduino, is dubbele hetzelfde formaat als zweven."
Laat me u een voorbeeld geven. Stel dat we begonnen vanuit een positie A (lat: 40,00, lange: 80) naar een positie B (lat: 40.01, lange: 80,00). Dat wil zeggen, zijn we verhuisd 0,01 graden in latitude alleen. Als u berekenen van de afstand met behulp van de Haversine formule op uw PC, krijgt u ongeveer 1,111.9m. Echter, Arduino wordt berekend door het 3,110.8m. Grote fout! Meer interessante ding is dat zelfs als je het verschil van de latitude 0,001 of 0.0001 graden verminderen, u dezelfde resultaten, 3,110.8m krijgt. Dus onderzoeken ik verder wat precies deze fout veroorzaken. Natuurlijk weet ik dat de boosdoener is de float precisie beperking zoals gezegd hierboven. Maar ik wilde graag weten welk deel van de berekening door Arduino deze grote fout veroorzaken. In de formule van Haversine zijn er COS, SIN en ACOS functies gebruikt. Ik getest een paar verschillende berekeningen met behulp van deze functies en de berekening van COS en SIN functies minimaal beïnvloeden maar het probleem was de ACOS. Als u de formule op uw PC alleen binnenkant ACOS beugel berekenen, zult u 0.9999999848 krijgen. Zie mijn punt? Het aantal decimalen hieronder 6e in functie ACOS is eigenlijk belangrijk het hoekige verschil voor kleine afstand wilt berekenen, maar helaas Arduino niet overweg kan met dit. Niet alleen voor kleine afstand maar voor zelfs relatief lange afstand (zeg meer dan 1 graad bijvoorbeeld) er is fout tussen de resultaten op de PC en Arduino.
Nou, dus ik begon te denken over hoe om te voorkomen dat de berekening van de goniometrische functie als hij zich in 6e decimalen zijn belangrijk. En ik vond een oplossing! In plaats van hoekige verschil tussen twee posities te berekenen en vervolgens de afstand berekend door te vermenigvuldigen met de gemiddelde aarde straal, berekening van een ratio van de hoek tussen twee posities (lengte- en breedtegraad afzonderlijk) meer dan 360 graden en verdeel de omtrek van de aarde door deze verhouding. Met andere woorden, de nummers groot terwijl berekening te houden. De Arduino float type heeft een beperking op het kleine aantal decimalen, maar relatief grote getallen kan omgaan!
Hier is mijn formule:
De gemiddelde omtrek van de aarde is 2 x 6,371,000m x π = 40,030,170 m
Δd (lat) = 40,030,170 x ΔΘ (lat) / 360 (ervan uitgaande dat ΔΘ is klein)
Δd(Long) = 40,030,170 x ΔΘ(long) x cosΘm / 360 (Θm: bedoel latitude tussen twee posities)
Nu, de afstand is √ [Δd (lat) ^ 2 Δd (lang) ^ 2]
Ik heb deze methode getest door het meten van afstand van huis naar mijn werk en het werkte boete. Eerst en vooral, ik heb de coördinaten van mijn huis en mijn werk en vervolgens de afstand door Haversine methode en mijn bovenstaande formule berekend. Er is een verschil in de resultaten, maar negligeable.
Schets van de Arduino is aangesloten. De LCD-bibliotheek kan worden gedownload van hier.
Dank u voor het lezen van mijn Instructable. Hoop iemand vindt dit nuttig.