Paso 5: Programar tu Arduino...
¿Cómo configurar el entorno de programación?
Todo lo encontrarás en esta página.
http://Arduino.CC/en/Guide/Windows
Listado del programa.
Necesita medio ambiente Arduino 1.0 para compilar este programa. También necesita algunas bibliotecas adicionales.
http://code.Google.com/p/bmp085driver/
http://code.Google.com/p/Rogue-Code/
Programación larga hace algún tiempo (más de 10 años), lo hice este programa no es perfecto. Basado en lo que he encontrado en internet, algún aprendizaje, tratando y referencias de sitios Web.
Hay un montón de comentarios para que pueda entender cómo funciona este programa.
/* Placa Arduino crea NMEA como protocolo con salida de variómetro y beping sonido. $LK8EX1, presión, altitud, vario, temperatura, batería, * suma de comprobación Campo 0, presión cruda en hPascal:hPA * 100 (ejemplo de 1013.25 se convierte 101325) #include < Wire.h > //i2c biblioteca
Arduino Vario por Jaros, 2012 (dedicado a arduinos atmega328 base)
Parte del proyecto "GoFly"
https://sites.Google.com/site/jarosrwebsite/para-NAV
Este programa es software libre; Usted puede redistribuirlo y/o modificar
bajo los términos de la GNU General Public License publicada por
la Free Software Foundation; sea versión 2 de la licencia, o
(a su opción) cualquier versión posterior.
Este programa se distribuye con la esperanza de que sea útil,
pero sin ninguna garantía; ni siquiera la garantía implícita de
COMERCIABILIDAD o aptitud para un propósito PARTICULAR. Ver la
GNU General Public License para más detalles.
Usted debe han recibido una copia de la Licencia Pública General de GNU
junto con este programa; Si no, escriba a la Free Software
Foundation, Inc., 51 Franklin St, quinto piso, Boston, MA 02110-1301 USA
LK8000 SERIE DE INSTRUMENTOS EXTERNOS 1 - SENTENCIA NMEA: LK8EX1
VERSIÓN A, 110217
sin relleno (987.25 se convierte 98725, no 098725)
Si no hay presión disponible, enviar a 999999 (6 veces 9)
Si la presión está disponible, se ignorará la altitud de campo 1
Campo 1, altitud en metros, en relación con QNH 1013.25
Si existe presión de crudo, se OMITIRÁ este valor (se puede fijar a 99999
pero no realmente necesario). (si desea utilizar este valor, ajuste presión de raw a 999999)
Este valor corresponde al nivel del mar (FIR). Suponemos actualmente en m 0
presión de altitud es 1013.25.If estándar no puede enviar crudo altitud, luego enviar
lo que tienes pero entonces usted no debe ajustarlo de ajuste básico en LK.
Altitud puede ser negativa. Si no está disponible, de la altitud y la presión de altitud no disponible, establecer
a 99999. LK dirá "Altitud Baro disponible" si se dispone de uno de los campos de 0 y 1.
Campo 2, vario en cm/s
Si vario no disponible, enviar a 9999. Valor también puede ser negativo.
Campo 3, temperatura en C, puede ser también negativo. Si no disponible, enviar la 99
Campo 4, el porcentaje de tensión o carga de batería. No puede ser negativo. Si no disponible, enviar a 999.
Voltaje se envía como valor flotante como: 1.4 0.1 2,3 11.2. Para enviar el porcentaje, añadir 1000.
Ejemplo 0% = 1000. 14% = 1014. Enviar valores flotantes para porcentajes.
Porcentaje debe ser de 0 a 100, sin decimales, añadidas por 1000!
Créditos:
(1) Biblioteca de //bmp085 http://code.google.com/p/bmp085driver/
(2) http://mbed.org/users/tkreyche/notebook/bmp085-pressure-sensor/ //more bmp085 y media Filter
(3) http://code.google.com/p/rogue-code/ //helpfull biblioteca de tono para hacer agradable pitido sin utilizar retardo
(4) http://www.daqq.eu/index.php?show=prj_sanity_nullifier //how hacer altavoz piezoeléctrico ruidoso
(5) http://lk8000.it //everything debido a
(6) http://taturno.com/2011/10/30/variometro-la-rivincita/ //huge gracias por Vario algoritmo
(7) http://code.google.com/p/tinkerit/wiki/SecretVoltmeter //how para medir el nivel de batería usando el ucontroller AVR
*/
#include < BMP085.h > //bmp085 biblioteca, descarga de enlace de url (1)
#include < Tone.h > //tone biblioteca, descarga de enlace url (3)
#include < stdlib.h > //we necesita que usar dtostrf() y convierte flotante a cadena
/////////////////////////////////////////
variables que usted puede probar y probar
speaker_pin1 corto = 8; altavoz de Arduino de la salida-
speaker_pin2 corto = 9; salida de altavoz de Arduino +
Float vario_climb_rate_start = 0.4; mínima subida pitido valor (comienzo ej. escalada sonando a 0,4 m/s)
Float vario_sink_rate_start = -1,1; máximo fregadero pitido valor (ej. Inicio fregadero un pitido a - 1.1 m/s)
#define SAMPLES_ARR 6 //define mover el tamaño de la matriz de filtro de media (2 -> 30), significa más vario es menos sensible y más lento
#define UART_SPEED 9600 //define velocidad de transmisión serial (9600,19200, etc...)
/////////////////////////////////////////
/////////////////////////////////////////
BMP085 bmp085 = BMP085(); configurar sensor bmp085
Tono tone_out1;
Tono tone_out2;
largo temperatura = 0;
Presión larga = 101325;
flotador de altitud;
int Battery_Vcc = 0; variable que contenga el valor de Vcc de la batería
const float p0 = 101325; Presión a nivel del mar (Pa)
get_time1 largo sin signo = millis();
get_time2 largo sin signo = millis();
get_time3 largo sin signo = millis();
térmica boolean = false;
int my_temperature = 1;
char altitude_arr [6]; Wee necesita esta matriz para traducir float a string
char vario_arr [5]; Wee necesita esta matriz para traducir float a string
muestras de int = 40;
int maxsamples = 50;
flotador alt [51];
flotador de tim [51];
pitido de flotador;
Float Beep_period;
k largo estático [SAMPLES_ARR];
estática Averaging_Filter largo (tiempo de entrada);
estática Averaging_Filter largo (tiempo de entrada) / / función de filtro de promedio de movimiento
{
tiempo suma = 0;
para (int i = 0; i < SAMPLES_ARR; i ++) {}
k [i] = k [+ 1];
}
k [SAMPLES_ARR - 1] = entrada;
para (int i = 0; i < SAMPLES_ARR; i ++) {}
suma += k [i];
}
volver (suma / SAMPLES_ARR);
}
void play_welcome_beep() //play sólo pitido una vez Bienvenido después de dar vuelta a vario de arduino
{
para (int aa = 300; aa < = 1500; aa = aa + 100)
{
tone_out1.Play(AA,200); reproducir sonido al pin 8 (nota, duración)
tone_out2.Play(AA+3,200); jugar bip en el pin 9 (nota, duración), es más fuerte si nos movemos amplitud fase
Delay(100);
}
para (int aa = 1500; aa > = 100; aa = aa-100)
{
tone_out1.Play(AA,200); reproducir sonido al pin 8 (nota, duración)
tone_out2.Play(AA+3,200); reproducir sonido al pin 8 (nota, duración)
Delay(100);
}
}
readVcc() largo / / función para leer el valor de la batería - todavía en fase de desarrollo
{
resultado largo;
Referencia de la lectura 1.1V contra AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
Delay(2); Espere que Vref resolver
ADCSRA | = _BV(ADSC); Convertir
mientras (bit_is_set(ADCSRA,ADSC));
resultado = ADCL;
resultado | = ADCH << 8;
resultado = 1126400L / resultado; Espalda-calcular AVcc en mV
volver a resultado;
}
void setup() / / función setup() para configurar todos los parámetros necesarios antes de pasar a la función loop() sin fin
{
Serial.Begin(UART_SPEED); Configurar puerto serie de arduino
Wire.Begin(); permite protocolo i2c de init
tone_out1.Begin(speaker_pin1); pin8 de salida de altavoz Piezo-
tone_out2.Begin(speaker_pin2); altavoz piezoeléctrico de salida pin9 +
bmp085.init (MODE_ULTRA_HIGHRES, p0, false);
Modo de ultra alta resolución BMP085, 101325Pa = 1013.25hPa, false = uso de unidades de Pa
esta inicialización es útil para normalizar la presión de referencia específico.
O información de hPa local actual desde un aeropuerto de la estación meteorológica local (QNH).
play_welcome_beep(); ya está todo listo, reproducir sonido de "Bienvenido"
}
void loop(void)
{
Float tempo=millis();
vario del flotador = 0;
Float N1 = 0;
Float N2 = 0;
flotador N3 = 0;
flotador de D1 = 0;
flotador D2 = 0;
bmp085.calcTruePressure(&pressure); obtener una muestra de BMP085 en cada bucle
average_pressure largo = Averaging_Filter(Pressure); poner en el filtro y tomar media
Altitud = (float) 44330 * (1 - pow(((float)Pressure/p0), 0.190295)); tomar nueva altitud en metros
Serial.println(Battery_Vcc);
para (int cc = 1; cc < = maxsamples; cc ++) {//samples promedio y vario algoritmo
Alt[(CC-1)] = alt [cc];
Tim[(CC-1)] = tim [cc];
};
Alt [maxsamples] = altitud;
Tim [maxsamples] = tempo;
flotador de stime = tim [muestras de maxsamples];
para (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) / / hace algún pitido
{
sonido = tempo;
Si (vario > vario_climb_rate_start & & vario < 15)
{
Beep_period=350-(vario*5);
tone_out1.Play((1000+(100*vario)),300-(vario*5)); al subir hace más rápidos y más cortos pitidos
tone_out2.Play((1003+(100*vario)),300-(vario*5));
térmica = true; OK, tenemos thermall en nuestras manos
} else if ((vario < 0) & & (térmica == true)) //looks como saltan lo thermall
{
Beep_period = 200;
play_siren(); OO, hemos perdido thermall juego alarma
térmica = false;
} else if (vario < vario_sink_rate_start) {//if tienes planeador de alto rendimiento puede cambiar lavabo pitido a - 0,95 m/s ;)
Beep_period = 200;
tone_out1.Play(300,340);
tone_out2.Play(303,340);
térmica = false;
}
}
Si (millis() > = (get_time2 + 1000)) //every en segundo lugar obtener el nivel de temperatura y batería
{
bmp085.getTemperature(&Temperature); obtener la temperatura en grados celsius de vez en cuando, tenemos que dividir por 10 para obtener XY. Z
my_temperature = temperatura/10;
Battery_Vcc = (readVcc () / 42) + 1000; lograr una tensión y preparar en porcentaje
get_time2 = millis();
}
Si (millis() > = (get_time3 + 333)) //every 1/3 segundo enviar salida NMEA sobre puerto serie
{
String str_out = //combine todos los valores y crear la parte de salida de secuencia de datos 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; Cálculo de suma de comprobación de cadena de datos
para (checksum_end = 0, ai = 0; ai < str_out.length(); ai ++)
{
BI = (unsigned char) str_out [ai];
checksum_end ^ = bi;
}
crear ahora la salida serie NMEA para LK8000. Formato de protocolo de LK8EX1:
$LK8EX1, presión, altitud, vario, temperatura, batería, * suma de comprobación
Serial.Print("$"); imprimir la primera señal de protocolo NMEA
Serial.Print(str_out); cadena de datos de impresión
Serial.Print("*"); final de secuencia de protocolo
Serial.println(checksum_end,HEX); imprimir la suma de comprobación calculado en el extremo de la cadena en hexadecimal
get_time3 = millis();
}
}
Fin