Arduino Vario

I3uLL3t

User
Die Bilder Stören mich nicht es ist ja eine offene Diskusion hier :)

Was den Sound angeht habe ich nach mehreren gescheiterten versuchen, mich dafür entschieden den Code Hier ein wenig abzuändern und auf meine Bedürfnisse anzupassen.
Ich denke er hat schon echt die beste Lösung für das ganze gefunden und stellt es zur verfügung :)


Der nächste Schritt
-Das GPS schneller zu bekommen.
-Ein Sprachmodul nachzurüsten welches mir gewisse Höhen als wav File wiedergibt und ansagt.
-Wenn dann endlich mal alles Hardwaretechnisch fertig ist geht es daran es kleiner werden zu lassen. Speziell die Sendeeinheit im Flieger.

Ich Persönlich habe nicht gedacht das ich überhaupt so weit komme :D umso besser waren die ersten Paar Flüge mit erfolgreicher Thermiksuche.

LG Marcel
 

PeGru

User
Danke für die Infos.
Kenne das Vario von kapteinkuk, habe damit auch schon experimentiert.
Hast du vor deine Erweiterungen (Oled?) und Code zu veröffentlichen?
Denke es sind einige hochinteressiert, ich auch.

Finde übrigens die Variotöne vom Zander https://www.youtube.com/watch?v=NKvno-3Wwhw
und vom Ilec https://www.youtube.com/watch?v=3hiqBMalxcw recht gut.
Ist vermutlich sehr schwierig in einen Arduino einzupflanzen.
Besonders bei langen Flügen finde ich die nicht so nervig, ist aber alles Ansichtssache.

Weiterhin viel Erfolg!
 

I3uLL3t

User
Sobald ich den Code aufgeräumt habe und ein wenig mehr Kommentiert, wird er natürlich auch freigegeben.
Aktuell sitze ich dabei mit Fritzing die Pläne zu zeichnen wie ich das ganze zusammen geschlossen habe. Wie es aber nun mal immer so ist, kommen einem immer neue Ideen.
Ich werde nun Kurzfristig noch einen Anschluss zum RC Empfänger Herstellen, den ich über einen Analogen Eingang abfrage um über die Fernsteuerung gewisse Sachen an bzw. aus zu schalten.
Was genau weiß ich aber noch nicht. Es soll aber definitiv optional bleiben, sodass man nicht gezwungen ist das Telemetrie Modul mit dem Empfänger zu verbinden.
Mir schwebt halt vor das ich damit die Tonwiedergabe für Steigen und Sinken stoppe....wie du schon sagst manchmal ist es echt nervig. Zum glück kann ich aber an meiner Empfangseinheit die Lautstärke über ein Poti regeln. :)
Warum Analog?! Weil ich dann auch die Möglichkeit habe einen dreistufen Schalter bzw. ein Drehregler der Fernsteuerung abzufragen.

Ideen über Ideen :D Solangsam komme ich aber auch an die grenzen des kleinen ProMini Arduino.
Das könnte aber auch daran liegen das ich beim Code schreiben eher wert drauf lege das andere ihn besser verstehen können als darauf das er so klein wie möglich ist.

LG Marcel
 

I3uLL3t

User
Arduino Telemetrie V1.3

Arduino Telemetrie V1.3

Es ist so weit...
Die Version 1.3 ist nun so weit, dass ich sagen kann es reicht nicht, wenn nur ich sie teste. Viele Augen sehen ja bekanntlich auch mehr als nur zwei.
Der Code ist mit Sicherheit nicht perfekt und man könnte vieles Optimieren aber das Ziel war es auch eher, dass sich schnell in den Code eingearbeitet werden kann.
Ich habe mit Fritzing ein Paar Verdrahtungspläne erstellt leider gab es aber nich alle Bauteile die ich verwendet habe von daher ist es nicht so 100%ig geworden.
Wer aber ernsthaftes Interesse hat es mal nachzubauen, der kann natürlich auch fragen. Ich werde jede Frage schnellstmöglich beantworten.
Der Code kann http://peschi.info/diverses/arduino-telemetrie/V1.3.zip als Zip runter geladen werden. (Das Zip liegt auf meinem FTP und beinhaltet keine dämlichen Viren, Werbung oder sonst irgend nen Quatsch, ich habe leider keine Möglichkeit gefunden das Zip hier im Forum hoch zu laden.
Einfach die darin befindlichen Ordner in das Arduino Verzeichniss Packen und ggf. die Bibliotheken downloaden. Auf Wunsch kann ich die Bibliotheken auch noch mit in das Zip packen.


EMPFÄNGER CODE
Code:
//--------------------------------------------------------
// 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;
  }
}


SENDER CODE
Code:
//--------------------------------------------------------
// 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 <Wire.h>
#include <MS5611.h>
#include <SPI.h>
#include "RF24.h"
#include <TinyGPS.h>
#include <AltSoftSerial.h>

//NRF24 UND BARO EINSTELLUNG
bool radioNumber = 1;         // Damit die Module miteinander kommunizieren muss eines als 1 und das andere als 0 deklariert werden.
RF24 radio(6,7);              // Pins an denen das Modul angeschlossen wird. 
byte addresses[][6] = {"1Node","2Node"};
MS5611 ms5611;
//-------------------------------
double pressure;              //Variable zum Speichern des Drucks
float voltage;                //Variable zum Speichern des Analogen Spannungwertes

const int updateATemp=100;
const int updateAlt=100;
const int updateVario=100;
const int updateVoltage=100;

float filtered = 0;             //Variable um den Höhenwert zu glätten.
long lastATempMeasurement;      //zeit (millis) bei der letzten temperatur-messung: if((millis()-lastATempMeasurement)>updateATemp){lastATempMeasurement=millis(); wert der temperatur wird upgedatet;}
float ambientTemprature;        // wert 173 entspricht 17,3 °C //Speicher für die derzeitige temperatur
long lastAltMeasurement;        //zeit (millis) bei der letzten Altitude-messung: if((millis()-lastATempMeasurement)>updateAlt){lastATempMeasurement=millis(); wert der Höhe wird upgedatet;}
float refHeight;                //Variable für die Ref Höhe 
int alt;                        //in Metern (Speicher für die relative Höhe zum einschaltpubnkt)
long lastVarioMeasurement;      //variablen für die delta-meter und delta-sekunden der variomessung
long varioTime;
float varioPreviousAlt;
float varioRefaltTrash;
float varioLastValue;           //wert für den lastValue-filter: vorheriger vario wert
int vario;                      //Speicher für den Variowert: 8 entspricht 0,8 Meter/sekunde steigen
float takeoffAlt;


//-------------Zu Übertragende Struktur---------
struct dat{
  float temp;
  double pres;
  float height;
  float refheight;
  int vspeed;
  float Voltage;
  float gpsSpeed;
  float gpsHeight;
  int gpsSat;
}daten;
//----------------------------------------------
//GPS VARIABLEN
static const int RXPin = 4, TXPin = 3;    //Festlegung der RX TX Pins fürs GPS
static const uint32_t GPSBaud = 57600;     //Festlegung der GPS Baudrate
TinyGPS gps;                          // Initialisieren der GPS Libary
AltSoftSerial ss;
float gpsSpeed;                       //Variable zum Speichern der GPS geschwindigkeit
int gpsSatellites;                    //Variable zum Speichern der verfügbaren Satteliten
float gpsHeight;                      //Variable zum Speichern der gemessenen GPS Höhe über NN
//-------------------------------------------------

void setup() 
{
  radioSettings();
  baroSettings();
  checkSettings();
  ss.begin(GPSBaud);                //GPS MODUL über AltSoftSerial Initialisieren
  
  varioLastValue=0.0F;
  lastATempMeasurement=-updateATemp;
  lastAltMeasurement=-updateAlt;
  lastVarioMeasurement=-updateVario;
  varioTime = micros();

  firstRefAlt();
}

void loop()
{
  int voltageValue = analogRead(14);
  voltage = map(voltageValue, 0, 1023, 0 , 808) /100;
  readDatafromBaro();
  daten.temp = ambientTemprature;
  daten.pres = pressure;
  daten.height = varioPreviousAlt;
  daten.refheight = takeoffAlt;
  daten.vspeed = vario;
  daten.Voltage = voltage;

  while (ss.available()){            //GPS Daten einlesen wenn verfügbar
    if (gps.encode(ss.read())){
      displayGPSdata();
    }
  }


////------------------------------------------------------------------------------------------------------------
////SENDEN
////------------------------------------------------------------------------------------------------------------
  if(takeoffAlt > 0){
    radio.stopListening();                                    // Zuerst Tranciever dazu bringen das er Sendet und nicht mehr auf Daten wartet. 
    Serial.println(F("SENDEN....."));
     if (!radio.write(&daten, sizeof(daten) )){
     }
  }

}//LOOP END

void displayGPSdata()
{
  gpsSpeed = (gps.f_speed_kmph());
  gpsSatellites = (gps.satellites());
  gpsHeight = (gps.f_altitude());
  daten.gpsHeight = gpsHeight;
  daten.gpsSpeed = gpsSpeed;
  daten.gpsSat = gpsSatellites;
}

//REFFERENZ HÖHE BESTIMMEN BEIM INITIALISIEREN DER SETUP FUNKTION
//____________________________________________________________________________________________________________________________________________________
void firstRefAlt(){
  varioRefaltTrash=ms5611.getAltitude(ms5611.readPressure());       //MÜLL, DAMIT VOR DER REFFERENZ HÖHE EIN PAAR MESSUNGEN GEMACHT WURDEN
  varioRefaltTrash=ms5611.getAltitude(ms5611.readPressure());       //MÜLL, DAMIT VOR DER REFFERENZ HÖHE EIN PAAR MESSUNGEN GEMACHT WURDEN
  varioRefaltTrash=ms5611.getAltitude(ms5611.readPressure());       //MÜLL, DAMIT VOR DER REFFERENZ HÖHE EIN PAAR MESSUNGEN GEMACHT WURDEN
  varioRefaltTrash=ms5611.getAltitude(ms5611.readPressure());       //MÜLL, DAMIT VOR DER REFFERENZ HÖHE EIN PAAR MESSUNGEN GEMACHT WURDEN
  takeoffAlt=(                                                      //DIE EIGENTLICHE REFFERENZHÖHE BEIM EINSCHALTEN
    ms5611.getAltitude(ms5611.readPressure()) +
    ms5611.getAltitude(ms5611.readPressure()) +
    ms5611.getAltitude(ms5611.readPressure()) +
    ms5611.getAltitude(ms5611.readPressure()) +
    ms5611.getAltitude(ms5611.readPressure()) +
    ms5611.getAltitude(ms5611.readPressure()) +
    ms5611.getAltitude(ms5611.readPressure()) +
    ms5611.getAltitude(ms5611.readPressure()) +
    ms5611.getAltitude(ms5611.readPressure()) +
    ms5611.getAltitude(ms5611.readPressure())
    )/10.0F;
}
//____________________________________________________________________________________________________________________________________________________
//DATEN AUS DEM BARO AUSLESEN UND FILTERN
//____________________________________________________________________________________________________________________________________________________
void readDatafromBaro(){
  long mill=millis();
  if((mill-lastATempMeasurement)>updateATemp){
    ambientTemprature=ms5611.readTemperature();
    lastATempMeasurement=mill;
  }
  
  boolean updateAltduringVario=false;
  if((mill-lastAltMeasurement)>updateAlt){
    updateAltduringVario=true;
  }
  if((mill-lastVarioMeasurement)>updateVario){
    float absoluteAltitude = ms5611.getAltitude(ms5611.readPressure());
    delay(30);                                                                //mit einem kleinen Delay werden die einzelnen Messungen genauer
    absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
     delay(30);
    absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
     delay(30);
    absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
     delay(30);
    absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
     delay(30);
    absoluteAltitude = absoluteAltitude/5.0F;
    pressure = ms5611.readPressure();

    if(filtered != 0){ 
      filtered = filtered + 0.7*(absoluteAltitude-filtered);    //FILTERUNG UM FAKTOR 0.7 HIERMIT KANN GESPIELT WERDEN. JE WEITER ZUR 1 DESTO WENIGER SMOOTH LÄUFT DER FILTER
    } else { 
      filtered = absoluteAltitude;          // GEFILTERTE WERTE, UM EINEN SAUBEREN ÜBERGANG ZU BEKOMMEN UND NICHT SO STARKE SPRÜNGE 
    }
    absoluteAltitude = filtered;
    passVario(1000*(absoluteAltitude-varioPreviousAlt)/(mill-varioTime));
   // für die nächste vario-messung alles abspeichern
    varioPreviousAlt=absoluteAltitude;
    varioTime=mill;
    lastVarioMeasurement=mill;
  }
}
//____________________________________________________________________________________________________________________________________________________

//STEIGEN UND SINKEN UMRECHNEN IN VERTIKALE GESCHWINDIGKEIT dm/s
//____________________________________________________________________________________________________________________________________________________
//KOMPLETT VON SIMON GEKLAUT!!! DANKE DAFÜR!!
void passVario(float value){
  int vspeed;
  
  if(value>=0){             //UMRECHNEN IN DM/s
    vspeed=0.5F+value*10;
  }else{    
    vspeed=value*10-0.5F;
  }  

  if(((vspeed<0&&varioLastValue<0&&vspeed<varioLastValue*0.3F)||(vspeed>0&&varioLastValue>0&&vspeed>varioLastValue*0.3F))||(vspeed>3||vspeed<-3)){
    vario=vspeed;
  }else{
    vario=(vspeed+varioLastValue)/2.0F;
  }
  varioLastValue=vspeed;
}
//____________________________________________________________________________________________________________________________________________________
//SETTINGS FUNKTIONEN
//____________________________________________________________________________________________________________________________________________________
void baroSettings(){
  while(!ms5611.begin(MS5611_ULTRA_HIGH_RES))
  {
    Serial.println("Kein Sensor gefunden");
    delay(500);
  }
}
//____________________________________________________________________________________________________________________________________________________
void checkSettings(){
  Serial.print("Oversampling: ");
  Serial.println(ms5611.getOversampling());
}
//____________________________________________________________________________________________________________________________________________________
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();
}
//____________________________________________________________________________________________________________________________________________________

ÜBERSICHTSBILDER
Empfänger Aufbau
Empfänger_Steckplatine.jpg

Sender Aufbau
Sender_Steckplatine.jpg

Ich Hoffe es finden sich ein paar Leute die sich mir anschließen und das ganze weiter entwickeln. Ich denke das ganze hat viel Potenzial. :)


LG Marcel
 

I3uLL3t

User
So ich melde mich dann mal wieder nach langer Zeit.
Es ist einiges passiert am code und ich habe auch gesehen, das ich in den Schaltbildern ein paar kleine Fehler drinn habe, ich hoffe es hat keiner seine versuche gegrillt :(
Es wird in den Nächsten Tagen hier weiter gehen und ein großes Update geben.

Gibt es zufällig jemanden mit ernsthaftem Interesse mich ein wenig zu unterstützen was die Tests an geht? Ich finde es immer gut wenn es mehrere gibt die Sachen ausprobieren um eventuelle Fehler zu finden.

LG Marcel
 

I3uLL3t

User
Hallo ich mal wieder.

Das meiste was ich verändert habe betrifft das Layout, um alles ein wenig übersichtlicher zu gestalten. Dafür bin ich auf die neue Version der u8glib umgestiegen die mir aber auch gleich ordentlich Speicherprobleme bereitet hat, da doch einiges anders ist und nicht so Copy Paste mäßig implementiert werden kann wie es auf der Entwickler Seite steht bzw. ich verstanden habe.
Außerdem wurden ein paar Händlingsgeschichten speziell mit dem lange drücken und kurz drücken des Knopfes geändert, da vorher beim lange drücken immer einmal das Menu gewechselt wurde.
Bei den Max werten, werden nun immer hinter dem letzten gespeicherten wert ein x geschrieben um sehen zu können welches der letzte ist. Das war vorher umständlich wenn man einfach mal auf null ebene resettet hat.

Bei Verbindungsabbrüchen kommt oben rechts in der ecke nun ein kleines Bild zur Anzeige das keine Verbindung da ist.
Startbildschirm
IMG_20180207_064307.jpg

Höhe in größerer Ansicht als vorher um es besser sehen zu können wenn man mal schnell drauf gucken will
IMG_20180207_065005.jpg


IMG_20180207_065011.jpg

Maximal Höhen (BARO)
IMG_20180207_065014.jpg

GPS Daten
IMG_20180207_065020.jpg

Maximal Geschwindigkeiten (GPS)
IMG_20180207_065023.jpg

Spannung der ersten Zelle und Warnstufen
IMG_20180207_065026.jpg

Akkuwarnung die Aufblinkt, sollte die Spannung zu niedrig sein.
IMG_20180207_064727.jpg


Aktuell ist grade das 3D gedruckte Gehäuse in bearbeitung damit das alles ein wenig besser aussieht.

Den Code und die neuen Schaltpläne werde ich auch veröffentlichen, wenn ich das neue Gehäuse mit Inhalt fertig habe.


Wenn jemand das System testen möchte, würde ich eventuell eins bauen und dann demjenigen zur Verfügung stellen.
 

onki

User
Hallo,

schönes Projekt. Nur eine Frage sei erlaubt.
Warum eine eigene Funkstrecke? Fliegst du noch 35MHz oder ein altes 2G4 System ohne Rückkanal?

Gruß
Onki
 

I3uLL3t

User
Hallo Onki,
danke und fragen sind natürlich immer erlaubt.

Zum einen war mein Grundgedanke das Modul komplett Hersteller unabhängig aufzubauen um jedem die möglichkeit zu geben es zu nutzen auch denen die Preiswerte Systeme verwenden die eventuell nicht oder nur mit viel kosten Telemetriefähig sind. Zum anderen kenne ich mich mit der Benutzung des Rückkanals so garnicht aus. Ich weiß zwar das es irgendwie möglich ist aber ich gehe ungerne in ein System mit meinen Daten wo am ende auch mein Flieger dran hängt.
Ich wüsste auch ehrlich gesagt nicht wo ich anfangen soll und wie ich die Daten über den Kanal bekomme. Das andere ist dann, sofern ich das richtig verstanden habe, muss meine Fernsteuerung auch was mit den Daten anfangen können.
Das würde für meine eventuell mit Spannung und Höhe gehen aber bei GPS, Tonausgabe, Geschwindigkeiten etc. müsste ich eine neue Firmware schreiben um das angezeigt zu bekommen. Dafür fehlt mir das Wissen.
Vielleicht gibt es auch Wege es dann aus der Funke direkt auf ein externes Modul zu bekommen aber damit kenne ich mich noch nicht wirklich aus, vielleicht kannst du mir da ja helfen?

Zusammengefast ist es für mich der Sicherste weg Telemetriedaten zu empfangen und vor allem auch für jemanden der "nur" mit nem Lötkolben umgehen kann umsetzbar und Preisgünstig.


Ich bin immer Dankbar wenn mir jemand Tipps oder Vorschläge gibt, wie man etwas besser machen kann also nur her damit :)
 

onki

User
Hallo nochmal,

also Telemetrieprojekte, die vorhandene Infrastuktur nutzen gibt es doch einige:
https://github.com/openXsensor/openXsensor/wiki/OXS_Build_Vario

Das wohl bekannteste. Unterstützt viele unterschiedliche Fabrikate und damit Übertragungsmodi.

https://github.com/nightflyer88/Jeti_VarioGPS-Sensor
Speziell für Jeti ein universeller Sensor.

Das Problem aus meiner Sicht ist halt der "fremde" Sender im Modell der evtl. den 2G4 Empfänger beeinflussen könnte.
Integrierte Systeme sind da etwas besser weil sie aufeiander abgestimmt sind.

Aber dennoch eine tolle Sache dein Sensorprojekt, speziell für die Retro Fraktion mit 35MHz.
Deinen Ausführungen entnehme ich irgendwie, das du Futaba Fasst nutzt. Das ist in der Tat Müll wenn es um Telemetrie geht.

Gruß
Onki
 
Das Problem aus meiner Sicht ist halt der "fremde" Sender im Modell der evtl. den 2G4 Empfänger beeinflussen könnte.

Hallo zusammen,

der "fremde Sender", der Transceiver nRF24L01 sendet auf einem Kanal. Die Empfänger wie z. B. Futaba FASST oder FrSky
welchseln den Kanal (etwa 80 Kanäle) im Millisekunden takt. Eine Beeinträchtigung ist daher m. E. weitgehends ausgeschlossen. Ich benutze
den Transceiver nRF24L01 seit letztem Jahr in meinen E-Seglern mit Futaba FASST oder dem FrSky DFT Modul im One Way Mode.
Eine Beeinträchtigung konnt ich nicht feststellen. Ich fliege auch mit FrSky Two Way (D8 Empfänger), eine
Beeinflussung der RSSI konnte ich Testweise nicht feststellen.

Das Transceiver Modul lässt sich jedoch vom FrSky DFT Sendemodul etwas beeinflussen. Gehe ich mit dem
Sender FC 18 direkt über den nRF24L01 Transceiver, dann verliere ich ab und zu einen Frame. Ich hab zum Testen
dann auch den Kanal in der SW zweimal gewechselt, die Beeinträchtigung ist geblieben.
Mit dem Futab FASST konnte ich keinen Einfluß feststellen.

Ich finde die Nutzung einer von der Fernsteuerung unabhängigen Funkstrecke hat auch Vorteile. Man ist unabhängig vom
Hersteller der TX/RX Anlage und deren etwaigen Änderungen. Für Modellflieger die wie ich z. B. noch mit FC 18 und FC 28 Sendern fliegen, ist eine Telemetrie auf Basis des nRF24L01 Transceivers eine günstige Möglichkeit für Nachrüstung alter TX/RX Systeme.

Gruß
Micha
 

I3uLL3t

User
Hallo,

@Onki es geht noch viel schlimmer und nennt sich Turnigy AFHDS-2A :D
In naher zukunft werde ich aber sowieso komplett auf FRsky warscheinlich mit der Taranis umsteigen.


Die Erfahrungen die Lastdownxxl gemacht hat kann ich so unterschreiben und auch keine Beeinträchtigungen feststellen, auch andere auf dem Feld wurden nicht gestört dadurch. Aber wie auch schon gesagt das MUSS nicht die regel sein.
Es kann natürlich bei dem ein und dem anderen System zu Problemen führen obwohl ich dazu sagen muss das die diversen RX/TX varianten meistens einen Kanal für ein paar ms belegen und dann zum nächsten springen. Ich denke nicht das ein paar ms in der vl. keine Steuerung da ist überhaupt auffallen. Da habe ich mehr Beeinträchtigung wenn ich gemütlich auf meinem Stuhl beim fliegen ein Sprudelwasser trinke ;)
Aber es ist definitiv immer Vorsicht geboten und es muss getestet werden.

LG Marcel
 
Aber es ist definitiv immer Vorsicht geboten und es muss getestet werden.

Hallo Marcel,

das Testen ist wirklich wichtig. Ich hab etwa 2008 mit dem Assan 2.4 gHz System angefangen. Da gibt es auch ein HF-Modul für die FC18/FC28.
Das System hat ohne Probleme funktioniert. Nach einigen Flügen ist der Empfänger dann in einen E-Segler mit 433 Mhz Vario gelandet.
Der Erstflug endete fast mit einer Katastrophe. Nach etwa 100 m Entfernung hatte der Empfänger nur noch sporadischen Empfang, hab den Flieger zum Glück noch heil gelandet. Einen Reichweitentest mit Vario hatte ich natürlich nicht unternommen. Die Assan Combo hab ich dann nie mehr verwendet.

Das Testen der Reichweite im Zusammenhang mit DIY Telemetrie ist wirklich enorm wichtig. Ich verwende da auch erst mal einen alten und leichten E-Segler zum Testen.

Ich wünsche Dir noch viel Spaß und Erfolg mit deinem Vario Projekt.

Gruß
Micha
 
Ansicht hell / dunkel umschalten
Oben Unten