Здравейте,
и аз си направих такава джаджа около 2014, до сега съм добавил и малко екстри BT с "PLXVS - NMEA SENTENCE" за да мога да си използвам барометъра и на телефона където съм инсталирал "XCТrack" и "XCSoar".
Надявам се да е от полза на някой.
Схема:
https://drive.google.com/open?id=0BzGomicB3bezWmhrd0dEU0wtc28кодът:
Код:
/
/****************************************************
Mini Vario mit Bluetooth
* Bluetooth Modul ist H-06
* Barometer Modul ist MS5611
* Mini PRO 3.3V 8 MHz
Auf der Misst von Ivaylo gewachsen.
2017-03-15 n
****************************************************/
#include <Wire.h>
#include <MS5611.h>
MS5611 bpm;
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Variablen die man aendern kann! /////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
float min_steigen = 0.20; //Minimale Steigen (Standart Wert ist 0.4m/s).
float max_sinken = -3.50; //Maximales Sinken (Standart Wert ist - 1.1m/s).
int leseZeit = 200; // Interval zum lesen vom Baro, Standart(min) ist 150.
unsigned int konst_frqz = 150; //Minimale Audio Frequez.
unsigned int max_frqz = 1900; //Maximale Audio Frequenz.
short a_pin1 = 6; //Lautsprecher Pin definieren!
//short a_pin1 = 5; //Lautsprecher Pin definieren! <<= fuer Micro Vario
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
double Hoehe, Temp, Temp0, HoeheB, TempB;
long Druck, Druck0, DruckB;
short startCH = 0;
int PinBT, XOR, c;
float FehlerV = 1.200 * min_steigen; //Fehler fuer Vario Filter berechnen.
float ZeitS = millis();
float kal[6], Vario, VarioR, dZeit, ZeitA, ZeitE, ZeitPipA, ZeitPipE;
void setup() {
leseZeit = leseZeit -33;
Serial.begin(9600);
pinMode(2, INPUT); // Definiert den Pin für der BT Schalter.
PinBT = digitalRead(2); // Definiere Schalter Zustand fuer BT.
//PinBT = 0; // Wenn keine BT-Modul eingebaut ist.
pinMode(7, OUTPUT); // Pin zum BT Versorgung.
pinMode(8, OUTPUT); // Pin zum BT Versorgung.
// Initialize the sensor (it is important to get calibration values stored on the device).
// Initialize MS5611 sensor
// Ultra high resolution: MS5611_ULTRA_HIGH_RES
// (default) High resolution: MS5611_HIGH_RES
// Standard: MS5611_STANDARD
// Low power: MS5611_LOW_POWER
// Ultra low power: MS5611_ULTRA_LOW_POWER
while(!bpm.begin(MS5611_ULTRA_HIGH_RES))
{
delay(750);
}
//BT umbenenen START
if (PinBT == 1)
{
digitalWrite(7, HIGH); // BT Versorgung einschalten.
digitalWrite(8, HIGH); // BT Versorgung einschalten.
delay(1000);
Serial.begin(9600);
/*Serial.println("AT");
delay(1500);
Serial.println("AT+NAMEivkos_miniVARIO");
delay(500);*/
// PIN ist 1234 <= ##############################################################################
}
else
{
digitalWrite(7, LOW); // BT Versorgung einschalten.
digitalWrite(8, LOW); // BT Versorgung einschalten.
}
//BT umbenenen ENDE */
//welcome_beep(); // Spielt den Start Tonfolge.
tone(a_pin1 , 300, 150);
delay(175);
tone(a_pin1 , 200, 150);
delay(175);
tone(a_pin1 , 100, 150);
delay(250);
// */
}
void loop()
{
dZeit=(ZeitE-ZeitS);
if (dZeit >= leseZeit )
{
if(PinBT==0)
{
SteigenBerechnen();
}
else
{
Bloetooth();
}
}
else
{
PipserX();
ZeitE = millis();
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
// Unterfunktionen und Programme //////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
// Luftdrucksensor auslesen #########################################################################
// ##################################################################################################
void BaroAuslesen()
{
Temp = bpm.readTemperature();
Druck = bpm.readPressure();
Hoehe = bpm.getAltitude(Druck);
}
// ##################################################################################################
// ##################################################################################################
// Steigen berechnen ################################################################################
// ##################################################################################################
void SteigenBerechnen()
{
// Barometrischehoehe - Vario(Steigen) berechnungen - START ========================================
BaroAuslesen();
ZeitE = millis();
dZeit=(ZeitE-ZeitS);
if(startCH==0)
{
kal[0] = Hoehe;
kal[1] = 0.00;
startCH=1;
}
//* Steigwerte berechnen.
Vario=((Hoehe - kal[0]) / (dZeit/1000));
//VarioR=Vario;
kal[0]=Hoehe;
if (FehlerV > 0.5) FehlerV = 0.5;
// Filter fuer die Steugung anwenden.
kal[1]=Vario;
Vario = FehlerV*(kal[1] + kal[2] + kal[3])/3 + (1-FehlerV)*(kal[5] + kal[4])/2;
kal[4] = kal[5];
kal[3] = kal[2];
kal[2] = kal[1];
kal[5] = Vario; // */
/*/ Zum Testen ueber Serial-Port
//Temperatur in °C
Serial.print(Temp, 2);
Serial.print("; ");
Serial.print(Druck);
Serial.print("; ");
Serial.print(Hoehe, 2);
Serial.print("; ");
Serial.print(dZeit);
Serial.print("; ");
Serial.print(Vario, 2);
Serial.print("; ");
Serial.print(VarioR, 2);
Serial.print("; ");
Serial.print(PinBT);
Serial.println(); //*/
ZeitS = ZeitE;
// Barometrischehöhe - Vario(Steigen) berechnungen - ENDE ==========================================
}
// ##################################################################################################
// ##################################################################################################
// Bloetooth ########################################################################################
// ##################################################################################################
void Bloetooth()
{
BaroAuslesen();
// Ausgabe im BlueFlyVario Format.
// The standard BlueFlyVario outp ut mode. This sends raw pressure measurements in the form:
// "PRS XXXXX\n"
// : XXXXX is the raw (unfiltered) pressure measurement in hexadecimal pascals.
Serial.print("PRS "); //Ausgabe an der
Serial.println( Druck, HEX); //BT-Serial schnitstelle ungefiltert. */
/* Send LXWP0 output mode for use with a range of apps:
//"$LXWP0,loger_stored (Y/N), IAS (kph), baroaltitude (m), vario (m/s),,,,,,heading of plane,windcourse (deg),windspeed (kph)*checksum \r\n"
String s = "LXWP0,N,,";
s = String(s+ String(Hoehe,2) + ",,,,,,,," );
// Checksum berechnen und als int ausgeben
// wird als HEX benötigt im NMEA Datensatz
// zwischen $ und * rechnen
int i, XOR, c;
XOR = 0;
for (i = 0; i < s.length(); i++) {
c = (unsigned char)s.charAt(i);
if (c == '*') break;
if (c!='$') XOR ^= c;
}
// Checksum berechnen
Serial.print("$");
Serial.print(s);
Serial.print("*");
Serial.println(XOR,HEX); // */
delay(175);
}
// ##################################################################################################
// ##################################################################################################
// Pipser ###########################################################################################
// ##################################################################################################
void PipserX()
{
double frequency = max_frqz / (1.00 + pow((Vario - 11.30) / -6.80, 5.10));
double duration = (-60.00*Vario + 500)*0.75; // Variable Pause
frequency = int(frequency);
duration = int(duration);
// Wenn Steigen groesser als min_steigen
if ( Vario >= min_steigen)
{
if ( Vario <= 7 )
{
if ( (ZeitPipE - ZeitPipA) >= (2*duration) || 2*duration <= leseZeit-35 )
{
ZeitPipA = millis();
tone(a_pin1 , frequency, duration);
}
else
{
ZeitPipE = millis();
}
if ( Vario > 7)
{
if ( Vario > 9) noTone(a_pin1);
else tone(a_pin1 , max_frqz/2);
delay(0);
}
}
}
// Wenn Sinken kleiner als max_sinken
if ( Vario < max_sinken)
{
tone(a_pin1 , 300, 150);
delay(125);
tone(a_pin1 , 200, 150);
delay(150);
tone(a_pin1 , 100, 150);
delay(175);
}
}
// ##################################################################################################
// ##################################################################################################
П.С.: Коментарите са на немски за съжаление. Но не би трябвало да е трудно да се преведат с Google.
Говорителчето или пищялката са на пин 6.
2017-08-22 - 15:45 : Промяна на протокола за изпращане на данните. Мерси Viper_Weasel
# Сега изпраща вър формата на "BlueFlyVario" само необработеното атмосферно налягане в Pa ("PRS XXXXX\n" - XXXXX is the raw (unfiltered) pressure measurement in hexadecimal pascals.) Така с този протокол съм го използвал повече от година и работеше супер.
# Но съм програмирал и LXWP0 протокола, който иска да използва него трябва само да го от коментира и да коментира другият. За съжаление не съм го тествал още не остана време в обедната почивка.
2017-08-23 - 12:45 : Използваната библиотека е от тук:
https://github.com/jarzebski/Arduino-MS5611