//--------------------------------------------------------
// EINFACHES ARDUINO VARIO V1.3
// von I3ull3t (RC-NETWROK.DE)
// CODE AUSSCHNITTE UND TIPPS VON SIMON_123 RC-NETWORK.DE
// VARIOTONE VORLAGE VON KAPTAINKUK RCGROUP https://www.rcgroups.com/forums/showthread.php?1749208-DIY-simple-and-inexpensive-Arduino-based-sailplane-variometer
//--------------------------------------------------------
// Funktionen: STEIGEN UND SINKEN SIGNALISIEREN ÜBER HANDELSÜBLICHE KOPFHÖRER
// ZURÜCKSETZEN DER REFERENZHÖHE ÜBER ANSCHLUSS EINES HEADSET SCHALTERS
// MESSWERTE DES GY-63 BOARDS ANZEIGEN
// HÖHE,TEMPERATUR,DRUCK,VERTIKALE GESCHWINDIGKEIT,SPANNUNG ZELLE1
// AKKUWARNUNG DURCH MESSEN DER ERSTEN ZELLE AM BALANCER ANSCHLUSS
// ANZEIGEN DER LETZTEN DREI MAXIMAL HÖHEN SEID EINSCHALTEN.
// ANZEIGE VON GPS MESSWERTEN, ALLERDINGS NOCH AUSBAUFÄHIG.
//
#include <SPI.h>
#include <Wire.h>
#include "RF24.h"
#include "U8glib.h"
#include "pitches.h"
U8GLIB_SH1106_128X64 u8g(10, 8 , 9); //ANSCHLÜSSE UND TYP DES DISPLAYS ZUR KOMMUNIKATION MIT DER LIBARY
//Die Noten für die Startmelodie (basiert auf tone-example von arduino.cc) geklaut von SIMON XD
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
float steigen; //Variable für die Frequenz des Steigen Tons
float sinken; //Variable für die Frequenz des Steigen Tons
long vspeedTime; //Variable zum Speichern der Zeit
long vspeedTimeLast; //Variable zum Speichern der Letzten gemessenen Zeit.
int vspeedlast; //Speicher für die letzte Vertikale Geschwindigkeit
float maxHeight = 0.00; //Speicher für die Maximale Höhe der Session
float vWarn1 = 3.70; //Spannungswarnung level 1
float vWarn2 = 3.50; //Spannungswarnung level 2
float vWarn3 = 3.40; //Spannungswarnung level 3
long vMessTime; // Eine Variable in der millis() gespecihert wird
long lastvMessTime; // Zeit der letzten Spannungsmessung
long lastspMessTime; // Zeit der letzten Vertikalen Geschwindigkeits Messung
long spMessTime; // Eine Variable in der millis() gespeichert wird
bool radioNumber = 0; // Festlegung der NRF24 Module, eines muss 1 sein das andere 0
//REFKEY VARIABLEN
int refKey = 700; //analoger Wert des Buttons
bool refFirst = true; //erster Refferenz durchlauf?
long refTime; //Variable in der Millis gespeichert wird
long refTimeSet; //Variable der millis bei jeden durchlauf
float refHeight; //Refferenz Höhe
float relativHeight = 999; //Relative Höhe zum Startpunkt
//--------------------------------------------------------------------
//MAXIMAL HÖHEN VARIABLEN
int maxHeightRun = 0; //Variable für die Menge an MaximalHöhen
float maxHeightArray[3] = {0.00,0.00,0.00}; //Array für die drei letzten Maximal Höhen
int menu = 0; //Variable mit der menu Nummer
int menbtn = 700; //Analoger Wert für den Headset btn
long btnTime; //Variable und länge des drückens zu messen
long btnTimeSet; //Variable und länge des drückens zu messen
bool btnFirst = true; //Erster Durchlauf des Knopfdrucks
RF24 radio(6,7); // Pin Festlegung des NRF24 11/12/13 sind fest in der Libary vorgegeben
byte addresses[][6] = {"1Node","2Node"};
float gpsSpeed; //Variable in der die GPS gemessene geschwindigkeit gespeichert wird
int gpsSatellites; //Variable in der die Anzahl an Verbundenen Sattelieten gespeichert wird
float gpsHeight; //Variable in der die Gemessene Höhe ü NN vom GPS Gemessen wird
float gpsRelHeight; //Variable in der die Relative Höhe abhängig zur Start Referenzhöhe gemessen wird
float gpsRefHeight; //Variable in der die RefferenzHöhe gespeichert wird (Zeitpunkt des Starts oder des zurücksetzens)
//-------------Zu Übertragende Struktur---------
struct dat{
float temp;
double pres;
float height;
float refheight;
int vspeed;
float Voltage;
float gpsSpeed;
float gpsHeight;
int gpsSat;
}daten;
//----------------------------------------------
float toneFreq, toneFreqLowpass, pressure, lowpassFast, lowpassSlow ;
int ddsAcc;
// Startbild
static unsigned char u8g_logo_bits[] U8G_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0xE1, 0xFC, 0x3F, 0xC1, 0xE3, 0xCF, 0x38, 0x38, 0x7F, 0x80,
0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0xC0, 0xC6, 0x18, 0x30, 0xC0, 0x86, 0x1C, 0x10, 0xE1, 0xC0,
0x00, 0x00, 0x00, 0x03, 0xFF, 0x81, 0x20, 0xC6, 0x18, 0x18, 0xC0, 0x86, 0x1E, 0x11, 0xC0, 0x40,
0x00, 0x00, 0x00, 0x03, 0xFF, 0x81, 0x20, 0xC4, 0x18, 0x18, 0xC0, 0x86, 0x17, 0x10, 0x80, 0x60,
0x00, 0x00, 0x00, 0x07, 0xFF, 0x83, 0x70, 0xF8, 0x18, 0x18, 0xC0, 0x86, 0x13, 0x91, 0x80, 0x60,
0x00, 0x00, 0x00, 0x06, 0xFF, 0x82, 0x30, 0xCC, 0x18, 0x18, 0xC0, 0x86, 0x11, 0xD0, 0x80, 0x60,
0x00, 0x00, 0x00, 0x06, 0xFF, 0xC4, 0x18, 0xC6, 0x18, 0x10, 0xC0, 0x86, 0x10, 0xF0, 0xE0, 0xC0,
0x00, 0x00, 0x00, 0x0C, 0xFF, 0x84, 0x18, 0xC3, 0x18, 0x60, 0x61, 0x86, 0x10, 0x70, 0x71, 0x00,
0x00, 0x00, 0x00, 0x0C, 0xFF, 0x8C, 0x1C, 0xE1, 0x1F, 0x80, 0x3F, 0x0F, 0x38, 0x30, 0x3F, 0x80,
0x00, 0x00, 0x00, 0x0C, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x38, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x30, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x30, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x60, 0xEF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x60, 0xE0, 0x2F, 0xE7, 0xC7, 0xF1, 0xE3, 0x8F, 0xEF, 0xFF, 0xF8, 0x79, 0xFC,
0x00, 0x00, 0x00, 0xC0, 0xE0, 0x26, 0x03, 0x03, 0x10, 0xC3, 0x86, 0x09, 0x8D, 0x8C, 0x30, 0xC8,
0x00, 0x00, 0x00, 0x80, 0xE8, 0x86, 0x03, 0x03, 0x01, 0xE7, 0x86, 0x01, 0x81, 0x8C, 0x30, 0xC0,
0x00, 0x00, 0x01, 0x80, 0xF8, 0xC7, 0xE3, 0x03, 0xE1, 0xE5, 0x87, 0xC1, 0x81, 0x98, 0x30, 0xF8,
0x00, 0x00, 0x01, 0x81, 0xF8, 0xC7, 0xE3, 0x03, 0xA1, 0x3D, 0xC6, 0x41, 0x81, 0xF8, 0x30, 0xD8,
0x00, 0x00, 0x03, 0xBF, 0xF8, 0xC6, 0x03, 0x03, 0x01, 0x39, 0xC6, 0x01, 0x81, 0x9C, 0x30, 0xC0,
0x00, 0x00, 0x07, 0xFF, 0xF8, 0xC6, 0x03, 0x13, 0x13, 0x38, 0xC6, 0x01, 0x81, 0x8E, 0x30, 0xC4,
0x00, 0x00, 0x0F, 0x7F, 0xE0, 0x0F, 0xE7, 0xF7, 0xF7, 0x91, 0xEF, 0xE3, 0xE3, 0xE6, 0x79, 0xFC,
0x00, 0x00, 0x0E, 0x01, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1C, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x78, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xF0, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0xE0, 0x01, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x07, 0xF0, 0x01, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0F, 0xF0, 0x07, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3F, 0xF8, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0xFF, 0xF0, 0x07, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x6C, 0x77, 0x36, 0xE7, 0x9D, 0xF0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x28, 0x21, 0x36, 0x42, 0x04, 0x40,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x18, 0x23, 0x36, 0x42, 0x1C, 0x40,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0x21, 0x3E, 0x42, 0x04, 0x40,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x18, 0x77, 0x1C, 0x73, 0x9C, 0x40,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
#define u8g_logo_width 16 //Variable für drawBMP
#define u8g_logo_height 64 //Variable für drawBMP
void setup() {
pinMode(5, OUTPUT); //Output pin fuer das Headset
radioSettings(); //Laden der Settings Funktion des NRF24
vMessTime = millis();
vspeedTime = millis();
u8g.firstPage();
do {
u8g.drawBitmapP( 0, 0, u8g_logo_width, u8g_logo_height, u8g_logo_bits);
} while( u8g.nextPage() );
Startmelody(); //Startmelody zum überprüfen des Headsets
delay(5000); //Wartezeit zur Startlogo anzeige
}
//DRAW FUNKTION FÜR DIE U8GLIB
//____________________________________________________________________________________________________________________________
//DIE ÜBERTRAGENEN DATEN AUF DEM DISPLAY ANZEIGEN
void draw1(void) {
u8g.setFont(u8g_font_10x20);
u8g.setPrintPos(0, 17);
u8g.print("Hoehe:");u8g.print(relativHeight);
u8g.setFont(u8g_font_6x12);
u8g.setPrintPos(0, 30);
u8g.print("Temp:"); u8g.print(daten.temp);
u8g.setPrintPos(0, 40);
u8g.print("vSpeed:"); u8g.print(daten.vspeed);
u8g.setPrintPos(0, 50);
u8g.print("Druck:");u8g.print(daten.pres);
u8g.setPrintPos(0, 60);
u8g.print("Spng:");u8g.print(daten.Voltage);
u8g.setPrintPos(60, 60);
u8g.print("H:");u8g.print(maxHeight);
}
//MENU 2 Die Letzten drei Maximal Höhen
void draw2(void) {
u8g.setFont(u8g_font_10x20);
u8g.setPrintPos(0, 17);
u8g.print("MAX1:");u8g.print(maxHeightArray[0]);
// u8g.setFont(u8g_font_6x12);
// u8g.setPrintPos(90, 17);
// u8g.print("Menu:");u8g.print(menu);
u8g.setFont(u8g_font_10x20);
u8g.setPrintPos(0, 40);
u8g.print("MAX2:"); u8g.print(maxHeightArray[1]);
u8g.setPrintPos(0, 60);
u8g.print("MAX3:"); u8g.print(maxHeightArray[2]);
}
//MENU 3 GPS
void draw3(void) {
u8g.setFont(u8g_font_10x20);
u8g.setPrintPos(0, 15);
u8g.print("Geschw:");u8g.print(daten.gpsSpeed);
u8g.setPrintPos(0, 34);
if(daten.gpsHeight > 800){
gpsHeight = 00.00;
}else{
gpsHeight = daten.gpsHeight;
}
u8g.print("Hoehe:"); u8g.print(gpsRelHeight);
u8g.setPrintPos(0, 51);
if(daten.gpsSat == 255){ //Solange kein GPS FIX anliegt wird 255 vom GPS übertragen, in dem Fall änder ich die ausgabe auf 0
gpsSatellites = 0;
}else{
gpsSatellites = daten.gpsSat;
}
u8g.print("Sat:"); u8g.print(gpsSatellites);
u8g.setFont(u8g_font_5x7);
u8g.setPrintPos(0, 60);
u8g.print("rawHeight:"); u8g.print(gpsHeight);
}
//MENU 4 Akkuwarnungsanzeige
void draw4(void) {
u8g.setFont(u8g_font_10x20);
u8g.setPrintPos(0, 15);
u8g.print("Volt:");u8g.print(daten.Voltage);
u8g.setFont(u8g_font_8x13);
u8g.setPrintPos(0, 32);
u8g.print("Stufe1:"); u8g.print(vWarn1);
u8g.setPrintPos(0, 47);
u8g.print("Stufe2:"); u8g.print(vWarn2);
u8g.setPrintPos(0, 62);
u8g.print("Stufe3:"); u8g.print(vWarn3);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//LOOP
void loop() {
sendReturn();
VoltageWarning(); //Befindet sich noch im Testmodus, Die Warntöne müssen noch genauer definiert werden.
MaxHeight(); //Die Maximale Flughöhe speichern
refKey = analogRead(A1); //Einlesen des Resetbuttons vom Headset
if (refKey <= 300){
refKeySet();
}else{
refFirst = true;
}
if(relativHeight == 999){ //Kein schöner Code erfüllt aber seinen Zweck Sofern die Empfangseinheit nach der Sendeeinheit eingeschaltet wird.
relativHeight = daten.height - daten.refheight;
refHeight = daten.refheight;
}else{
relativHeight = daten.height - refHeight; //Wird die Sendeheinheit nach der Empfangseinheit eingeschalten, kommt es zu einer Falschen darstellung und man muss Manuell Resseten über den Knopf am Headset. Wird noch überarbeitet
gpsRelHeight = daten.gpsHeight - gpsRefHeight;
}
menuSet();
if(menu == 0){
u8g.firstPage();
do {
draw1();
} while( u8g.nextPage() );
}else if(menu == 1){
u8g.firstPage();
do {
draw2();
} while( u8g.nextPage() );
}else if(menu == 2){
u8g.firstPage();
do {
draw3();
} while( u8g.nextPage() );
}else if(menu == 3){
u8g.firstPage();
do {
draw4();
} while( u8g.nextPage() );
}
vspeedTime = millis();
varioTone();
}
//END LOOP
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//FUNKTION ZUM EMPFANGEN DER DATEN
//____________________________________________________________________________________________________________________________
void sendReturn(){
if( radio.available()){
while (radio.available()) {
radio.read( &daten, sizeof(daten) ); // DATEN ABFRAGEN
}
}
}
//FUNKTION UM DIE REFFERENZ HOEHE NEU ZU SETZEN
//____________________________________________________________________________________________________________________________
//RELATIVE HÖHE AUF 0 Setzen.
void refKeySet(){
refTime = millis();
if (refFirst == true){
refTimeSet = millis();
refFirst = false;
}
if ((refTime - refTimeSet) >= 3000){ //Überprüfen ob der Ref Key am Headset länger als 3sec gedrückt wurde
refHeight = daten.height; //Setzen der Refferenz Höhe vom Baro
gpsRefHeight = daten.gpsHeight; //Setzen der Refferenz Höhe vom GPS
if (maxHeightRun <= 2){
maxHeightArray[maxHeightRun]= maxHeight; //Speichern der Baro Maximalhöhe in dem MaxHeight Array
if (maxHeightRun == 2){
maxHeightRun = 0;
}else{
maxHeightRun++;
}
}
maxHeight = 0;
refFirst = true;
}
}
//Ausgabe des Variotones. Keine Eigenentwicklung eher eine anpassung auf meine Bedürnisse. Für mich die beste Art die Töne wieder zu geben
//____________________________________________________________________________________________________________________________
void varioTone(){
pressure = daten.vspeed / 2;
lowpassFast = lowpassFast - (pressure + lowpassFast) * 0.1;
lowpassSlow = lowpassSlow - (pressure + lowpassSlow) * 0.05;
toneFreq = (lowpassSlow - lowpassFast) * 50;
toneFreqLowpass = toneFreqLowpass + (toneFreq - toneFreqLowpass) * 0.1;
toneFreq = constrain(toneFreqLowpass, -500, 500);
ddsAcc += toneFreq * 100 + 2000;
if (toneFreq < 0 || ddsAcc > 0)
{
tone(5, toneFreq + 510);
}else{
noTone(5);
}
}
//SETTINGS FUNKTIONEN
//____________________________________________________________________________________________________________________________
//EINSTELLUNGEN FÜR DAS NRF24
void radioSettings(){
radio.begin();
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_250KBPS);
radio.enableAckPayload();
radio.setChannel(115);
if(radioNumber){
radio.openWritingPipe(addresses[1]);
radio.openReadingPipe(1,addresses[0]);
}else{
radio.openWritingPipe(addresses[0]);
radio.openReadingPipe(1,addresses[1]);
}
radio.startListening();
}
//STARTMELODI ZUM FUNKTIONSTEST
//____________________________________________________________________________________________________________________________
//GEKLAUT VON SIMON
void Startmelody(){
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(5, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(5);
}
}
//VOLTAGE CHECK AND WARNING
//____________________________________________________________________________________________________________________________
void VoltageWarning(){
vMessTime = millis();
if(vMessTime-lastvMessTime > 10000 || lastvMessTime == 0){ //Alle 10sec die Spannung überprüfen und ggf. Warnung raus geben
if(daten.Voltage < vWarn3){
tone(5,900,100);
delay(100);
tone(5,1800,100);
delay(100);
tone(5,900,100);
delay(100);
tone(5,1800,100);
delay(100);
tone(5,900,100);
}else if(daten.Voltage < vWarn2){
tone(5,900,100);
delay(100);
tone(5,1800,100);
delay(100);
tone(5,900,100);
}else if(daten.Voltage < vWarn1){
tone(5,900,100);
delay(100);
tone(5,1800,100);
}
lastvMessTime = vMessTime;
}
}
//MAXIMALE HÖHE
//____________________________________________________________________________________________________________________________
void MaxHeight(){
if(maxHeight == 0.00 && relativHeight != 999){
maxHeight = relativHeight;
}else if (relativHeight > maxHeight && relativHeight != 999){
maxHeight = relativHeight;
}
}
//Funktion um zu üerpüfen wie lange der Knopf gedrückt wird
//_____________________________________________________________________________________________________________________________
void menuSet(){
menbtn = analogRead(A1);
btnTime = millis();
if (menbtn <= 300){
if (btnFirst == true){
btnTimeSet = millis();
btnFirst = false;
}
if ((btnTime - btnTimeSet) <= 100 && (btnTime - btnTimeSet) >= 50){
if (menu <= 2){
menu++;
}else{
menu = 0;
}
}
}else{
btnFirst = true;
}
}