GoFly - parapente/muchos/deslizamiento altímetro-variómetro de su navegación para automóviles (4 / 7 paso)

Paso 5: Programar tu Arduino...

Así que por fin tenemos listo para poner algo de código dentro del proyecto.

¿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.

/*
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

Placa Arduino crea NMEA como protocolo con salida de variómetro y beping sonido.
LK8000 SERIE DE INSTRUMENTOS EXTERNOS 1 - SENTENCIA NMEA: LK8EX1
VERSIÓN A, 110217

$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)
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 < Wire.h > //i2c biblioteca
#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

Artículos Relacionados

Interfaz MS5067 altímetro con Linkit

Interfaz MS5067 altímetro con Linkit

MS50XX serie es la serie de altímetros Meas-Specs, utiliza mediciones para estimar la altura de aire. Aquí voy a utilizar la unidad de MS5607Hoja de datos: http://www.meas-spec.com/downloads/MS5607-02BA03.pdfPaso 1: conexionesMS5607: LinkitGND: tierr
Un compacto, altímetro de Arduino para aviones RC

Un compacto, altímetro de Arduino para aviones RC

Por favor voten por este Instructable si crees que se merece! ¡ Gracias!El Altímetro Ultimate es un altímetro de Arduino controlado súper compacto, capaz de medir la altura con una precisión de 0,3 metros y guardar los valores mayores y menor que ha
Cohete altímetro registrador

Cohete altímetro registrador

Usando nuestras SD card y presión sensor escudos, creamos un registrador de datos que rastrea la altitud de un objeto, como un cohete modelo! Si quieres ver imágenes de nuestros lanzamientos de cohete, revisa el video aquí!Paso 1: materialesComponent
Partícula fotón - Tutorial de Sensor altímetro de precisión MPL3115A2

Partícula fotón - Tutorial de Sensor altímetro de precisión MPL3115A2

El MPL3115A2 emplea un sensor de presión MEMS con una interfaz I2C para proporcionar los datos exactos de la presión/altitud y la temperatura. Las salidas del sensor son digitalizadas por un ADC de 24 bits de alta resolución. Procesamiento interno el
Frambuesa Pi - MPL3115A2 altímetro de precisión Sensor Python Tutorial

Frambuesa Pi - MPL3115A2 altímetro de precisión Sensor Python Tutorial

El MPL3115A2 emplea un sensor de presión MEMS con una interfaz I2C para proporcionar los datos exactos de la presión/altitud y la temperatura. Las salidas del sensor son digitalizadas por un ADC de 24 bits de alta resolución. Procesamiento interno el
Frambuesa Pi - MPL3115A2 altímetro de precisión Sensor Java Tutorial

Frambuesa Pi - MPL3115A2 altímetro de precisión Sensor Java Tutorial

El MPL3115A2 emplea un sensor de presión MEMS con una interfaz I2C para proporcionar los datos exactos de la presión/altitud y la temperatura. Las salidas del sensor son digitalizadas por un ADC de 24 bits de alta resolución. Procesamiento interno el
Arduino Nano - MPL3115A2 altímetro de precisión Sensor Tutorial

Arduino Nano - MPL3115A2 altímetro de precisión Sensor Tutorial

El MPL3115A2 emplea un sensor de presión MEMS con una interfaz I2C para proporcionar los datos exactos de la presión/altitud y la temperatura. Las salidas del sensor son digitalizadas por un ADC de 24 bits de alta resolución. Procesamiento interno el
Independiente Arduino altímetro

Independiente Arduino altímetro

Aquí es un altímetro independiente trabajando con Arduino que se puede utilizar en proyectos RC, senderismo, coches... donde quieras :)Demuestra en la primera pantalla de la altitud, la temperatura y la presión de aire, y en el segundo, llegó a la al
Cronómetro de basados en Arduino para pistas de carreras de coches eléctricas

Cronómetro de basados en Arduino para pistas de carreras de coches eléctricas

En este proyecto que estoy utilizando un sensor de proximidad infrarrojo a medida conectada a una placa Arduino el tiempo de las vueltas en un coche eléctrico circuito de carreras. El sensor detecta el coche cuando pasa delante de ella y mide el tiem
PropVario, un variómetro/altímetro DIY con salida de voz para planeadores RC

PropVario, un variómetro/altímetro DIY con salida de voz para planeadores RC

este instructables le mostrará cómo construir un Vario barato, que pudiera hablar la altitud ypor supuesto enviar tonos diferentes al cambiar la altura de su vuelo.Algunas características:-voz y tono-utilizar sus propias muestras (onda-) en su idioma
Arduino Monitor portátil de tiempo, altímetro, temperatura, humedad, con LCD con sólo 3 pines DHT11 y BMP85

Arduino Monitor portátil de tiempo, altímetro, temperatura, humedad, con LCD con sólo 3 pines DHT11 y BMP85

hice este proyecto ya que a menudo escalar montañas como el de la foto y necesito saber la altitud, la temperatura y también cambios en el clima, a veces en cuestión de minutos el tiempo que muy mala, con granizo, la nieve y una niebla muy densa.Todo
Caja de madera para multímetro digital - Caixa de madeira para multímetro digital

Caja de madera para multímetro digital - Caixa de madeira para multímetro digital

Este projeto apresenta una para confecção de uma caixa de madeira um multímetro digital, em substituição à frágil embalagem de papelão protegia o equipamento.Para la assoalho Foram utilizadas sobras de madeira de una feitura da caixa.Una tampa é em m
Alcoholímetro Sensor

Alcoholímetro Sensor

Mientras que ya hay sistemas de interbloqueo de ignición para automóviles, son extremadamente caros y difícil de instalar en los vehículos, debido a la falta de universalidad en su diseño. Nuestro proyecto abordará estos temas, proporcionando al usua
El nuevo y mejorado sin cepillo eléctrico Scooter sistema Guía de alimentación

El nuevo y mejorado sin cepillo eléctrico Scooter sistema Guía de alimentación

en 2008, armé una guía en Instructables acerca de cómo actualizar el sistema de alimentación de su pequeño vehículo eléctrico personal. Fue una cartilla sobre los fundamentos de un sistema eléctrico de vehículo eléctrico y ofrece recursos y consejos