Stap 5: Programmering je Arduino...
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 board creëert NMEA zoals protocol met variometer uitvoer en beping geluid. $LK8EX1, druk, hoogte, vario, temperatuur, batterij, * controlesom Veld 0, ruwe druk in hPascal:hPA * 100 (voorbeeld voor 1013.25 wordt 101325) #include < Wire.h > //i2c bibliotheek
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
LK8000 EXTERNE INSTRUMENT SERIE 1 - NMEA ZIN: LK8EX1
VERSIE A, 110217
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 < 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