GoFly - parapente/hangliding/glijden hoogtemeter-variometer van uw autonavigatie (5 / 8 stap)

Stap 5: Programmering je Arduino...


Dus uiteindelijk we hebben project klaar om sommige code binnen zetten.

Hoe te opstelling programmeeromgeving?
Op deze pagina vindt u alles.
http://Arduino.CC/en/Guide/Windows

Programma overzicht.
Je moet de Arduino 1.0 milieu om dit programma te compileren. Daarnaast moet u ook enkele extra bibliotheken.
http://code.Google.com/p/bmp085driver/
http://code.Google.com/p/Rogue-code/
Ik heb enige programmering lange tijd geleden (meer dan 10 jaar geleden), zodat dit programma niet perfect is. Gebaseerd op wat ik gevonden heb op het internet, sommige leren, proberen en verwijzingen naar websites.
Er is een heleboel reacties te laten u begrijpen hoe dit programma werkt.

/*
Arduino Vario door Jaros, 2012 (opgedragen aan atmega328 gebaseerd arduinos)
Onderdeel van het project "GoFly"
https://sites.Google.com/site/jarosrwebsite/para-NAV
Dit programma is vrije software; u kunt het herdistribueren en/of wijzigen
het onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
de Free Software Foundation; ofwel versie 2 van de licentie, of
(naar uw keuze) een latere versie.
Dit programma is gedistribueerd in de hoop dat het bruikbaar,
maar zonder enige garantie; zelfs zonder de impliciete garantie van
VERKOOPBAARHEID of geschiktheid voor een bepaald doel.  Zie de
GNU General Public License voor meer details.
U moet hebt ontvangen een kopie van de GNU General Public License
along with this program; Als dit niet het geval is, schrijven aan de Vrije Software
Foundation, Inc., 51 Franklin St, vijfde verdieping, Boston, MA 02110-1301 USA

Arduino board creëert NMEA zoals protocol met variometer uitvoer en beping geluid.
LK8000 EXTERNE INSTRUMENT SERIE 1 - NMEA ZIN: LK8EX1
VERSIE A, 110217

$LK8EX1, druk, hoogte, vario, temperatuur, batterij, * controlesom

Veld 0, ruwe druk in hPascal:hPA * 100 (voorbeeld voor 1013.25 wordt 101325)
geen opvulling (987.25 wordt 98725, niet 098725)
Als geen druk beschikbaar, stuur 999999 (6 keer 9)
Als het druk is beschikbaar, veld 1 hoogte genegeerd
Veld 1, hoogte in meter, ten opzichte van QNH 1013.25
Als ruwe druk beschikbaar is, deze waarde wordt GENEGEERD (u kunt instellen naar 99999
maar niet echt nodig)! (als u gebruik wilt maken deze waarde, instellen rauwe druk op 999999)
Deze waarde is ten opzichte van de zeespiegel (QNE). Wij zijn veronderstelling dat momenteel op 0m
druk van de hoogte is standaard 1013.25.If u kan niet verzenden van onbewerkte hoogte en vervolgens verzenden
wat je hebt, maar dan moet u het van fundamentele instelling in LK niet aanpassen.
Hoogte kunnen negatief zijn. Als de hoogte niet beschikbaar is, en druk niet beschikbaar, instellen hoogte
tot 99999. LK zal zeggen "BÄRO hoogte beschikbaar" als een van de velden 0 en 1 beschikbaar is.
Veld 2, vario in cm/s
Als vario niet beschikbaar, stuur 9999. Ook kan waarde negatief zijn.
Veld 3, temperatuur in C, mag ook negatief zijn. Indien niet beschikbaar, stuur 99
Veld 4, spanning of heffing percentage van de batterij. Niet negatief kan zijn. Indien niet beschikbaar, stuur 999.
Spanning wordt verzonden als drijvende-kommawaarde zoals: 0.1 1.4 2.3 11.2. Toevoegen om te verzenden percentage, 1000.
In het volgende voorbeeld 0% = 1000. 14% = 1014. Stuur geen float waarden voor percentages.
Percentage moet 0 tot 100, met geen decimalen, toegevoegd door 1000!
Credits:
(1) http://code.google.com/p/bmp085driver/ //bmp085 bibliotheek
(2) http://mbed.org/users/tkreyche/notebook/bmp085-pressure-sensor/ //more over bmp085 en gemiddelde filter
(3) http://code.google.com/p/rogue-code/ //helpfull Toon bibliotheek om mooie piepen zonder gebruik te maken van vertraging
(4) http://www.daqq.eu/index.php?show=prj_sanity_nullifier //how te maken van luid piëzo spreker
(5) http://lk8000.it //everything vanwege dat.
(6) http://taturno.com/2011/10/30/variometro-la-rivincita/ //huge Bedankt voor Vario algoritme
(7) http://code.google.com/p/tinkerit/wiki/SecretVoltmeter //how voor het meten van batterijniveau met behulp van AVR ucontroller
*/

#include < Wire.h > //i2c bibliotheek
#include < BMP085.h > //bmp085 bibliotheek, downloaden van url-koppeling (1)
#include < Tone.h > //tone bibliotheek, downloaden van url-koppeling (3)
#include < stdlib.h > //we dat nodig om te gebruiken dtostrf() en float converteren naar tekenreeks
/////////////////////////////////////////
variabelen die u kunt testen en uitproberen
korte speaker_pin1 = 8;                Arduino luidspreker uitgang-
korte speaker_pin2 = 9;                Arduino luidsprekeruitgang +
zweven vario_climb_rate_start = 0. 4;    minimale klim piepen waarde (bijv. begin klimmen piepen op 0.4 m/s)
zweven vario_sink_rate_start =-1.1;    maximale wastafel piepen waarde (ex. start wastafel beep op - 1.1 m/s)
#define SAMPLES_ARR 6 //define bewegende gemiddelde filter matrixgrootte (2 -> 30), meer betekent vario is minder gevoelig en langzamer
#define UART_SPEED 9600 //define seriële transmissie snelheid (9600,19200, enz...)
/////////////////////////////////////////
/////////////////////////////////////////
BMP085 bmp085 = BMP085();            instellen van bmp085 sensor
Toon tone_out1;
Toon tone_out2;
lange temperatuur = 0;
lang druk = 101325;
float hoogte;
int Battery_Vcc = 0;             variabele voor de waarde van de Vcc van batterij
Const float p0 = 101325;              Druk op zeeniveau (Pa)
unsigned long get_time1 = millis();
unsigned long get_time2 = millis();
unsigned long get_time3 = millis();
Boole thermalling = false;
int my_temperature = 1;
char altitude_arr [6];            Wee moet deze array te vertalen van zweven naar tekenreeks
char vario_arr [5];               Wee moet deze array te vertalen van zweven naar tekenreeks
int monsters = 40;
int maxsamples = 50;
float alt [51];
zweven tim [51];
float pieptoon;
float Beep_period;
statische lange k [SAMPLES_ARR];

statische lange Averaging_Filter (lang ingang);
statische lange Averaging_Filter (lang ingang) / / bewegende gemiddelde filterfunctie
{
lang som = 0;
for (int i = 0; ik < SAMPLES_ARR; i ++) {}
k [i] = k [i + 1];
}
k [SAMPLES_ARR - 1] = de input;
for (int i = 0; ik < SAMPLES_ARR; i ++) {}
som += k [i];
}
retourneren (som / SAMPLES_ARR);
}

VOID play_welcome_beep() //play enige keer welkom piep na inschakeling van arduino vario
{
voor (int aa = 300; aa < = 1500; aa = aa + 100)
{
tone_out1.Play(AA,200);             beep op pin 8 (opmerking, duur) spelen
tone_out2.Play(AA+3,200);           pieptoon spelen op pin 9 (opmerking, duur), het is harder als we gaan aplitude fase
delay(100);
}
voor (int aa = 1500; aa > = 100; aa = aa-100)
{
tone_out1.Play(AA,200);             beep op pin 8 (opmerking, duur) spelen
tone_out2.Play(AA+3,200);           beep op pin 8 (opmerking, duur) spelen
delay(100);
}
}

lange readVcc() / / functie om te lezen van de waarde van de batterij - nog steeds in ontwikkeling fase
{
lange resultaat;
Lees 1.1V referentie tegen AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(2); Wachten op Vref te regelen
ADCSRA | = _BV(ADSC); Converteren
terwijl (bit_is_set(ADCSRA,ADSC));
resultaat = ADCL;
resultaat | = ADCH << 8;
resultaat = 1126400L / resulteren; Rug-Bereken AVcc in mV
resultaat;
}

void setup / / setup functie Setup alle vereiste parameters voordat we naar eindeloze loop functie
{
Serial.begin(UART_SPEED);       instellen van de seriële poort van de arduino
Wire.begin();             laat init i2c protocol
tone_out1.begin(speaker_pin1);       piëzo luidspreker uitgang pin8-
tone_out2.begin(speaker_pin2);       piëzo-luidspreker uitgang pin9 +
bmp085.init (MODE_ULTRA_HIGHRES, p0, false);
BMP085 ultra-hoog-res modus, 101325Pa = 1013.25hPa, false = met behulp van Pa eenheden
Deze initialisatie is handig voor het normaliseren van de druk om een specifieke datum.
OF huidige lokale hPa instellingsgegevens van een weerstation/lokale luchthaven (QNH).
play_welcome_beep();      alles is klaar, "Welkom" geluid afspelen
}

void loop(void)
{
float tempo=millis();
zweven vario = 0;
zweven N1 = 0;
zweven N2 = 0;
zweven N3 = 0;
zweven D1 = 0;
zweven D2 = 0;
bmp085.calcTruePressure(&Pressure);                                   krijg een monster van BMP085 in elke lus
lange average_pressure = Averaging_Filter(Pressure);                   Zet het in de filter en het gemiddelde nemen
Hoogte = (float) 44330 * (1 - pow(((float)Pressure/p0), 0.190295));  nemen nieuwe hoogte in meter
Serial.println(Battery_Vcc);
voor (int cc = 1; cc < = maxsamples; cc ++) {//samples gemiddeld en vario algoritme
Alt[(CC-1)] = alt [cc];
Tim[(CC-1)] = tim [cc];
};
Alt [maxsamples] = hoogte;
Tim [maxsamples] = tempo;
zweven stime = tim [maxsamples-samples];
voor (int cc =(maxsamples-samples); cc < maxsamples; cc ++) {}
N1 += (tim [cc]-stime) * alt [cc];
N2 += (tim[cc]-stime);
N3 += (alt[cc]);
D1 += (tim[cc]-stime)*(tim[cc]-stime);
D2 += (tim[cc]-stime);
};

Vario=1000*((samples*N1)-N2*N3)/(samples*D1-D2*D2);
Als ((tempo-beep) > Beep_period) / / maken enkele pieptoon
{
pieptoon = tempo;
Als (vario > vario_climb_rate_start & & vario < 15)
{
Beep_period=350-(Vario*5);
tone_out1.Play((1000+(100*Vario)),300-(Vario*5)); Wanneer make sneller en kortere klimmen piept
tone_out2.Play((1003+(100*Vario)),300-(Vario*5));
thermalling = true;                               OK, hebben we thermall in onze handen
} else if ((vario < 0) & & (thermalling == true)) //looks zoals we uit de thermall springen
{
Beep_period = 200;
play_siren();                                   oo, we verloren thermall spelen alarm
thermalling = false;
} else if (vario < vario_sink_rate_start) {//if hebt hoge performace zweefvliegtuig kunt u zinken pieptoon tot - 0.95 m/s ;)
Beep_period = 200;
tone_out1.Play(300,340);
tone_out2.Play(303,340);
thermalling = false;
}
}

Als (millis() > = (get_time2 + 1000)) //every krijgen tweede temperatuur en batterij niveau
{
bmp085.getTemperature(&Temperature); krijgen van de temperatuur in celsius van tijd tot tijd, we moeten dat delen door 10 om XY. Z
my_temperature = temperatuur/10;
Battery_Vcc = ((readVcc) / 42) +1000;    spanning krijgen en voor te bereiden in procenten
get_time2 = millis();
}

Als (millis() > = (get_time3 + 333)) //every 1/3 tweede NMEA uitvoer verzenden via seriële poort
{
Str_out koord = //combine alle waarden en maken deel uit van tekenreeksuitvoer NMEA-gegevens
String("LK8EX1"+string(",")+string(average_pressure,DEC) + String(",")+String(dtostrf(Altitude,0,0,altitude_arr))+String(",") +
String(dtostrf((Vario*100),0,0,vario_arr))+string(",")+string(my_temperature,DEC)+string(",")+string(Battery_Vcc,DEC)+string(","));
unsigned int checksum_end, ai, bi;                                                 Berekening van de controlesom voor de gegevensreeks
voor (checksum_end = 0, ai = 0; ai < str_out.length(); ai ++)
{
BI = (unsigned char) str_out [ai];
checksum_end ^ = bi;
}
het creëren van nu NMEA uitgang voor seriële voor LK8000. LK8EX1 protocol formaat:
$LK8EX1, druk, hoogte, vario, temperatuur, batterij, * controlesom
Serial.Print("$");                     eerste teken van NMEA protocol afdrukken
Serial.Print(str_out);                 afdrukreeks gegevens
Serial.Print("*");                     einde van de tekenreeks protocol
Serial.println(checksum_end,hex);      afdrukken van de berekende controlesom op het einde van de tekenreeks in HEX
get_time3 = millis();
}
}
Het einde

Gerelateerde Artikelen

Maken van een Flat Pack Dollhouse

Maken van een Flat Pack Dollhouse

Ik ben het delen van de plannen voor een eenvoudige en stevige flat pack poppenhuis dat ik ontwierp een paar jaar geleden. Het is een twee verhaal-structuur met 8 kamers, en zodra de stukken zijn gesneden zij gemakkelijk kunnen worden gemonteerd (zon
Moldover van licht-Theremin CD (DIY versie)

Moldover van licht-Theremin CD (DIY versie)

Hallo! Ik ben Moldover. Ik maak muziek en ik maken muziekinstrumenten.Ik bracht mijn eerste originele album (zelfbetiteld) als Moldover in 2009. De ontzagwekkende uitgave van dit album kwam op een CD die is gemonteerd op een speciaal ontworpen circui
Bouwen van een Paintball-mijn

Bouwen van een Paintball-mijn

mijn vrienden en ik genieten van het spelen van paintball in de woestijn van Arizona bij gelegenheid. Het is geweldig leuk, maar soms het bekogelen van iemand met een paar honderd paintballs reizen op 300 feet per seconde slechts niet voldoende. Soms
Standbeeld van Liberty Snowglobe

Standbeeld van Liberty Snowglobe

Onze familie houdt een bezoek aan New York City. We dachten wat een betere manier ter ere van een van onze favoriete plaatsen dan door een van de kinderen in een gigantische Statue of Liberty-sneeuwbol?Stap 1: De hele wereld Eerst en vooral, krediet
Paracord & 3D afgedrukt de beschermer van de sleutel

Paracord & 3D afgedrukt de beschermer van de sleutel

Hebben mijn eerste auto kocht, mijn enige set sleutels voor het keek vrij kaal, hoewel de sleutels/multi-tools dat heb ik ingediend om de kwestie van het krabben iets anders in mijn zak (telefoon gevallen, bankkaarten, mijn hand... enz). Ik wil rijde
Bouwen van een richel Vardo

Bouwen van een richel Vardo

Welkom bij mijn 1ste richel Vardo lichaamsbouw.Mijn naam is David en mijn vrouw Martha is. We zijn uit noordelijke Indiana.We kijken uit naar de eerste reis met onze richel Vardo.Ik had dit chassis gebouwd voor dit doel. $2600Het is 12 ft lang en 6 f
Het verwijderen van Popcorn plafonds!

Het verwijderen van Popcorn plafonds!

ik mijn vrouw verrast doordat haar lopen van een lange dag op het werk te vinden me bedekt met slordig natte havermout-achtige popcorn plafond gips en de meubels overal in huis, maar ze was niet boos en bleek te zijn een zeer eenvoudig DIY project!((
Laminaat van Mixed Media Bangle

Laminaat van Mixed Media Bangle

Ik aanbid absoluut het weven van verschillende materialen. Onlangs heb ik het in gedachten om te proberen samen lamineren van hout en kunststof en vervolgens het nemen van het aan een tabel CNC-router. Dit instructable is mijn eerste ronde testen exp
Bouwen een groot zelf drenken de tuin & broeikasgassen van hergebruikte materialen

Bouwen een groot zelf drenken de tuin & broeikasgassen van hergebruikte materialen

Dit instructable toont hoe ik een veelzijdige en lage onderhoudskosten boven grond tuin & serre gebouwd. Deze tuin plantenbak is Self-Watering, vocht reguleren, zelf vullen zelf beschermde en draagbare (met help of apparatuur). Hoewel niet geheel gra
Werkbank vise van geregenereerde scissor jack

Werkbank vise van geregenereerde scissor jack

Materialen:1 teruggewonnen scissor jack hoe groter hoe beter. De langere en grotere de ankerstang hoe beter uw bankschroef zal worden. Ik heb de mijne uit het autokerkhof/auto berging werf voor $52 teruggewonnen eiken valse lade fronten. Mijn bedrijf
Zware plicht Workbench met ladingen van opslag

Zware plicht Workbench met ladingen van opslag

heb ik uiteengezet met de bedoeling een robuuste, betrouwbare en meestal eenvoudig werkbank. Zoals ik moe was van het niet hebben van een juiste locatie te werken aan projecten, brainstormen over creatieve oplossingen voor bestaande problemen.Een paa
Bouwen van een schrijnwerker Toolbox

Bouwen van een schrijnwerker Toolbox

als je een monteur, vinden een werkset is geen probleem - er zijn tientallen op de markt, van enorme roll-rond winkel gevallen aan kleine metalen dozen. Opstellers, loodgieters en elektriciens zijn goed bediend, ook met alles van pick-up opslag aan t
Bouw van Bastet

Bouw van Bastet

zoals beloofd, hier is de oude Egyptische godin Bastet, het kostuum van de metgezel aan het kostuum van Anubis (afgebeeld) die vindt u hier:Bouw van Anubis InstructableWaarschuwing: de oprichting van dit kostuum maakt gebruik van scherpe instrumenten
Conversie van de fiets in evenwicht

Conversie van de fiets in evenwicht

Ik besef dat er andere instructables op dit onderwerp, maar hoop dat dit voegt iets aan iemand te pakken van dit project.Het hoofddoel van dit ' ible is een antwoord te bieden op de vraag "Is het mogelijk om een regelmatige kids fiets omzetten in een