Etape 5: Programmation votre Arduino...
Comment installer l’environnement de programmation ?
Vous trouverez tout sur cette page.
http://Arduino.cc/en/guide/Windows
Annonce du programme.
Vous avez besoin d’environnement Arduino 1.0 pour compiler ce programme. Vous devez également quelques bibliothèques supplémentaires.
http://code.google.com/p/bmp085driver/
http://code.google.com/p/Rogue-code/
J’ai fait la programmation long il y a quelque temps (il y a plus de 10 ans) donc ce programme n’est pas parfait. Basé sur ce que j’ai trouvé sur internet, certains d’apprentissage, en train et références de sites Web.
Il y a beaucoup de commentaires pour vous permettre de comprendre comment fonctionne ce programme.
/* Carte Arduino crée NMEA comme protocole avec sortie variomètre et beping sonore. $LK8EX1, pression, altitude, vario, température, batterie, * checksum Terrain 0, pression brute en hPascal:hPA * 100 (exemple pour 1013.25 devient 101325) #include < Wire.h > //i2c bibliothèque
Arduino Vario par Jaros, 2012 (dédié à arduinos atmega328 basé)
Cadre du projet « GoFly »
https://sites.google.com/site/jarosrwebsite/para-NAV
Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier
elle aux termes de la GNU General Public License telle que publiée par
la Free Software Foundation ; soit la version 2 de la licence, ou
(selon votre choix) toute version ultérieure.
Ce programme est distribué dans l’espoir qu’il sera utile,
mais sans aucune garantie ; sans même la garantie implicite de
Qualité marchande ou ADEQUATION a un usage particulier. Voir le
GNU General Public License pour plus de détails.
Vous devriez avoir reçu une copie de la GNU General Public License
avec ce programme ; Si tel n’est pas le cas, écrivez à la Free Software
Foundation, Inc., 51 Franklin St, 5ème étage, Boston, MA 02110-1301 USA
LK8000 INSTRUMENT EXTERNE SÉRIE 1 - PHRASE NMEA : LK8EX1
VERSION A, 110217
sans remplissage (987.25 devient 98725, pas 098725)
Si aucune pression disponible, envoyer 999999 (9 6 fois)
Si la pression est disponible, altitude domaine 1 sera ignoré
Champ 1, altitude en mètres, par rapport au QNH 1013.25
Si la pression brute est disponible, cette valeur sera ignorée (vous pouvez le définir à 99999
mais pas vraiment nécessaire) ! (si vous souhaitez utiliser cette valeur, la valeur brute pression 999999)
Cette valeur est par rapport au niveau de la mer (QNE). Nous partons du principe qu’actuellement à 0m
altitude pression est 1013.25.If standard, vous ne pouvez pas envoyer crus d’altitude, puis envoie
ce que vous avez, mais alors vous ne devez pas ajuster du réglage de base in LC.
Altitude peut être négatif. Si non disponible, altitude et ne pression pas l’Altitude disponible, ensemble
à 99999. LK diront « Baro altitude disponible » si un des champs de 0 et 1 est disponible.
Zone 2, vario en cm/s
Si le vario n’est pas disponible, envoyer 9999. Valeur peut aussi être négative.
Zone 3, c, la température peut être aussi négatif. Si non disponible, envoyer 99
Domaine 4, pourcentage de tension ou de charge de batterie. Ne peut pas être négatif. Si non disponible, envoyer 999.
Tension est envoyée comme valeur de type float comme : 0,1 1,4 2,3 11,2. Pour envoyer un pourcentage, ajoute 1000.
Exemple 0 % = 1000. 14 % = 1014. N’envoyez pas des valeurs float pour les pourcentages.
Pourcentage devrait être de 0 à 100, avec pas de nombres décimaux, ajoutés par 1000 !
Crédits :
(1) Bibliothèque de //bmp085 de http://code.google.com/p/bmp085driver/
(2) http://mbed.org/users/tkreyche/notebook/bmp085-pressure-sensor/ //more sur le filtre bmp085 et moyenne
(3) http://code.google.com/p/rogue-code/ //helpfull bibliothèque de ton faire beau bip sans utiliser de retard
(4) http://www.daqq.eu/index.php?show=prj_sanity_nullifier //how faire haut-parleur piézo forte
(5) http://lk8000.it //everything à cause de cela
(6) http://taturno.com/2011/10/30/variometro-la-rivincita/ //huge Merci pour l’algorithme de Vario
(7) //how http://code.google.com/p/tinkerit/wiki/SecretVoltmeter pour mesurer le niveau de la batterie à l’aide d’ucontroller AVR
*/
#include < BMP085.h > //bmp085 bibliothèque, téléchargement de lien url (1)
#include < Tone.h > //tone bibliothèque, téléchargement de lien url (3)
#include < stdlib.h > à //we besoin d’utiliser dtostrf() et convertir char en string
/////////////////////////////////////////
variables que vous pouvez tester et essayer
court speaker_pin1 = 8 ; Arduino haut-parleur sortie-
court speaker_pin2 = 9 ; sortie haut-parleur Arduino +
float vario_climb_rate_start = 0,4 ; montée minimale bip valeur (départ ex. escalade bip à 0,4 m/s)
float vario_sink_rate_start = -1,1 ; maximale évier bip valeur (ex. début évier bip à - 1,1 m/s)
#define SAMPLES_ARR 6 //define déplacement filtre moyenne taille de tableau (2 -> 30), signifie plus vario est moins sensible et plus lent
#define UART_SPEED 9600 vitesse de transmision série //define (9600,19200, etc....)
/////////////////////////////////////////
/////////////////////////////////////////
BMP085 bmp085 = BMP085() ; installation capteur bmp085
Ton tone_out1 ;
Ton tone_out2 ;
Température de longue = 0 ;
longue pression = 101325 ;
flotteur d’Altitude ;
int Battery_Vcc = 0 ; variable pour stocker la valeur de SCR de batterie
const float p0 = 101325 ; Pression au niveau de la mer (Pa)
unsigned long get_time1 = millis() ;
unsigned long get_time2 = millis() ;
unsigned long get_time3 = millis() ;
thermique booléen = false ;
int my_temperature = 1 ;
char altitude_arr [6] ; Wee besoin ce tableau flotteur en chaîne de la traduction
char vario_arr [5] ; Wee besoin ce tableau flotteur en chaîne de la traduction
échantillons d’int = 40 ;
int maxsamples = 50 ;
flotteur alt [51] ;
flotteur de tim [51] ;
bip de flotteur ;
float Beep_period ;
public static long k [SAMPLES_ARR] ;
public static Averaging_Filter long (long d’entrée) ;
public static Averaging_Filter long (long d’entrée) / / moving fonction filtre moyenne
{
longtemps la somme = 0 ;
pour (int i = 0; i < SAMPLES_ARR; i ++) {}
k [i] = k [i + 1] ;
}
k [SAMPLES_ARR - 1] = entrée ;
pour (int i = 0; i < SAMPLES_ARR; i ++) {}
Sum += k [i] ;
}
retour (somme / SAMPLES_ARR) ;
}
void play_welcome_beep() //play seul bip une fois bienvenue après avoir tourné sur arduino vario
{
pour (int aa = 300; aa < = 1500; aa = aa + 100)
{
tone_out1.Play(AA,200) ; jouer le bip sur la broche 8 (Remarque, duration)
tone_out2.Play(AA+3,200) ; jouer le bip sur la broche 9 (note, durée), il est plus fort si nous déplaçons aplitude phase
Delay(100) ;
}
pour (int aa = 1500; aa > = 100; aa = aa-100)
{
tone_out1.Play(AA,200) ; jouer le bip sur la broche 8 (Remarque, duration)
tone_out2.Play(AA+3,200) ; jouer le bip sur la broche 8 (Remarque, duration)
Delay(100) ;
}
}
readVcc() long / / fonction pour lire la valeur de batterie - toujours en phase de développement
{
résultat de long ;
Référence de lecture 1.1V contre AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) ;
Delay(2) ; Attendez la Vref à régler
ADCSRA | = _BV(ADSC) ; Convert
tandis que (bit_is_set(ADCSRA,ADSC)) ;
résultat = ADCL ;
résultat | = ADCH << 8 ;
résultat = 1126400L / en résulter ; Rétrocalcul AVcc en mV
retourner le résultat ;
}
void setup() / / setup() fonction de configurer tous les paramètres nécessaires avant de passer à la fonction loop() sans fin
{
Serial.Begin(UART_SPEED) ; mettre en place l’arduino serial port
Wire.Begin() ; permet le protocole i2c init
tone_out1.Begin(speaker_pin1) ; piézo orateur sortie pin8-
tone_out2.Begin(speaker_pin2) ; sortie de haut-parleur piézo pin9 +
BMP085.init (MODE_ULTRA_HIGHRES, p0, false) ;
BMP085 mode ultra-high-res, 101325Pa = 1013.25hPa, = false à l’aide d’unités de Pa
cette initialisation est utile pour normaliser la pression de référence spécifique.
OU la définition actuelle d’informations locale hPa vers un aéroport de la station météo/local (QNH).
play_welcome_beep() ; tout est prêt, lire son « Bienvenue »
}
Sub loop(void)
{
float tempo=millis() ;
flotteur vario = 0 ;
flotteur N1 = 0 ;
flotteur N2 = 0 ;
flotteur N3 = 0 ;
flotteur D1 = 0 ;
D2 de flotter = 0 ;
BMP085.calcTruePressure(&Pressure) ; obtenir un échantillon de BMP085 dans chaque arceau
long average_pressure = Averaging_Filter(Pressure) ; mettre dans le filtre et prendre la moyenne
Altitude = (float) 44330 * (1 - pow(((float)Pressure/p0), 0.190295)) ; prendre la nouvelle altitude en mètres
Serial.println(Battery_Vcc) ;
pour (int cc = 1; cc < = maxsamples; cc ++) {//samples moyenne et vario algorithme
Alt[(CC-1)] = alt [cc] ;
Tim[(CC-1)] = tim [cc] ;
};
Alt [maxsamples] = Altitude ;
Tim [maxsamples] = tempo ;
flotteur stime = tim [maxsamples-samples] ;
pour (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) ;
Si ((tempo-beep) > Beep_period) / / faire un bip
{
bip = tempo ;
Si (vario > vario_climb_rate_start & & vario < 15)
{
Beep_period=350-(Vario*5) ;
tone_out1.Play((1000+(100*Vario)),300-(Vario*5)) ; Quand vous faites plus rapides et plus courts bips
tone_out2.Play((1003+(100*Vario)),300-(Vario*5)) ;
thermique = true ; OK, nous avons thermall dans nos mains
} ElseIf ((vario < 0) & & (thermique == true)) //looks comme on saute par la thermall
{
Beep_period = 200 ;
play_siren() ; Oo, nous avons perdu thermall jeu alarme
thermique = false ;
} ElseIf (vario < vario_sink_rate_start) {//if vous avez haute performace planeur vous pouvez changer couler bip au - 0,95 m/s;)
Beep_period = 200 ;
tone_out1.Play(300,340) ;
tone_out2.Play(303,340) ;
thermique = false ;
}
}
Si (millis() > = (get_time2 + 1000)) //every obtenir deuxième niveau de température et de batterie
{
BMP085.getTemperature(&temperature) ; obtenir la température en degrés celsius de temps à autre, il faut diviser par 10 pour obtenir XY. Z
my_temperature = Temperature/10 ;
Battery_Vcc = (readVcc () / 42) + 1000 ; obtenir la tension et de préparer en pourcentage
get_time2 = millis() ;
}
Si (millis() > = (get_time3 + 333)) //every 1/3 seconde envoyer la sortie NMEA sur le port série
{
String str_out = //combine toutes les valeurs et créer le cadre de la sortie de chaîne des données NMEA
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 ; Calcul de checksum pour la chaîne de données
pour (checksum_end = 0, IA = 0; IA < str_out.length() ; IA ++)
{
BI = (unsigned char) str_out [IA] ;
checksum_end ^ = bi ;
}
créer maintenant sortie NMEA pour LK8000. Format de protocole de LK8EX1 :
$LK8EX1, pression, altitude, vario, température, batterie, * checksum
Serial.Print("$") ; imprimer le premier signe du protocole NMEA
Serial.Print(str_out) ; chaîne de données d’impression
Serial.Print("*") ; fin de chaîne de protocole
Serial.println(checksum_end,hex) ; imprimer la somme de contrôle calculée sur la fin de la chaîne en hexadécimal
get_time3 = millis() ;
}
}
La fin