Einfache Jeti EX Telemetrie-Library für Arduino Mini Pro 328

onki

User
Hallo,

ich hab nochmal versucht das Beispielprogramm mit meinem Teensy ans Laufen zu bekommen.
Es wird ohne Murren kompiliert und übertragen, wenn ich allerdings die Telemetrie mit meinen Schülersender und mini-Jetibox ansehen möchte (also die gecodeten Werte), klappt das nicht. Es kommt rein gar nix auf dem Display.
Muss ich da noch eine andere Schnistelle auswählen wegen des Teensy oder was mach ich falsch?
Ich hab RX2/TX2 am Teensy im Einsatz (Pin 9/10).
Die vorrige C-Geschichte hat mir die Demowerte angezeigt.
Sorry aber ich bin mit dem Teensy und Arduino noch nicht so ganz vertraut. Ich hab aber noch nicht die aktuelle Library 0.96 im Einsatz.

Gruß
Onki
 

Sepp62

User
Hallo Onki,

Pin 10 passt schon mal. Das ist "Serial2" und das ist auch der Default, wenn Du nichts anderes einstellst. Pin 9 kannst Du erst Mal weglassen. Auch mit einer älteren Library muss es gehen (die dürften sogar besser getestet sein).

Mit der Jeti-Mini-Box habe ich allerdings weder Tests gemacht, noch irgendwelche Erfahrungen. Ich teste das Ganze immer an der DS16. Vielleicht gibt es hier Unterschiede.

Am Besten wäre es, Du könntest es mal mit einer DS/DC/14/16 testen, dann ist das Problem wenigstens mal eingegrenzt.

Viele Grüße
Bernd
 

onki

User
Hallo Bernd,

ich werd das am Abend nochmal mit meiner DC-16 ausprobieren, obwohl die TM-Lösung eigentlich für meine mc22s mit TU-Modul und mini-Box gedacht ist (im Böötchen).
Werde mich dann nochmal mit den Ergebnissen (auch mit der neuen Libary) melden.

Gruß
Onki
 

Sepp62

User
Hallo Onki,

hast Du denn an Deinem Schülersender mit der Jetibox mini schon mal einen anderen Sensor (z.B. MUI) über das EX-Protokoll zum Laufen gebracht ?

Du hast geschrieben, dass die "C-Lösung" auf der Jetibox-Mini schon mal Daten angezeigt hat. Könnte es nicht sein, dass damit nur das Text-Display übertragen wurde (also das "Non-EX-Protokoll", der zweizeilige Text-Vorläufer von "EX", der auch als "Konfigurationsoberfläche" dient) ?

Wenn dem so ist, bekommt man das mit der C++-Library prinzipiell schon auch hin (ggf. eben mit ein paar Anpassungen). D.h. wenn Du das mit Deiner DC-16 eingrenzst, hilft es bei der weiteren Lösung.

Grüße
Bernd
 

onki

User
Hallo Bernd,

ich hab leider keinen einzigen Jeti-Sensor, weil ich persönlich die bescheuert finde (die können immer nur eine Größe ermitteln).
Ich stehe mehr auf UniSens-E, GPS-Logger 2 und LinkVario, weil das die Schweizer Taschenmesser der Telemetrie sind und nicht nur ein Hackebeil:).
Zuvor hatte ich mit dem UniSense-E die TM-Anzeige an der Minibox. Die würde mir für die Stromsensor-Lösung auch reichen, ich probiere das mit der DC-16 aber auf jeden Fall auch mal aus.

Gruß
Onki
 

Eckehard

User
Hallo Bernd,

ich bin auch ein großes Stück weitergekommen. Mir geht es um die Überwachung von bis zu 12 LipoZellen.....

- Teensy3.2
- SD Card
- RTC

... laufen zusammen mit Deiner Library und mit meiner DC16/FW4.0!

Ich bin wirklich mehr als begeistert, wie "einfach " das eigentlich war!

Auch hier einmal herzlichen Dank an Dich für Deine Library!

Derzeit knobele ich noch an folgendem Problemchen:

- Ich habe die Anzahl der erkannten Zellen
- Ich habe die Anzahl der Zellen, deren Spannungswert unterhalb einer definierten Schwelle liegt.

Man könnte also in einem (!) Telemetrie Fenster anzeigen, daß die Spannung einer (1) von 3 Zellen unter den Schwellwert gefallen ist..

Ähnlich wie im Manual, Seite 129 Restlaufzeit:
manual_seite129.png

Besonders ist hier wohl, wie ich zwei oder mehrere Werte in einem Fenster anzeige (Screenshot: Strom, Spannung, Kapazität)

Mir schwebt folgender Inhalt vor:


Titel: "LowCells"
Inhalte: "YES: 1/3 Cells low!"

Normalanzeige wäre also:
Titel: "LowCells"
Inhalte: "3/3 Cells high"


Sorry vorab, da dieses Problemchen nicht so hier in diesen Thread gehört....


Eckehard
 

Sepp62

User
Hallo Eckehard,

ja, das wäre cool, wenn man mehrere Werte in ein Feld setzen könnte. Das Feld auf Seite 129 scheint mir eine "Spezialanzeige" zu sein, ähnlich wie die Anzeige für die Empfangsqualität. Ich denke, sie zeigt "interne" Messwerte (Senderakku) an und keine Werte von externen Sensoren.

Bei den Datentypen, die für Sensoren definiert werden können, sind einige Werte "reserviert". Möglicherweise gibt es für solche Datentypen noch Anzeigeformate, die man noch nicht kennt. Leider ist da nichts dokumentiert und Ausprobieren dürfte mühsam sein. Andererseits sind mir auch keine Jeti-Sensoren bekannt, die besondere Anzeigeformate unterstützen.

Das Lua-Skripting der DC24 scheint für diesen Zweck gemacht zu sein. D.h. das Konzept von Jeti scheint eher in diese Richtung zu gehen, als weitere "Spezialformate" zu definieren.

Grüße
Bernd
 

onki

User
Hallo,

So - kaum schließ ich die DC-16 an schon klappt es (zumindest rudimentär):
Screen000.png

und zwar mit diesem Code:

Code:
/* 
  Jeti EX Sensor Simple Demo
**************************************************************/

#include "JetiExProtocol.h"

JetiExProtocol jetiEx;

enum
{
  ID_VOLTAGE = 1,
  ID_CURRENT,
  ID_CAPACITY,
};

long myVoltage = 0;
long myCurrent = 0;
long myCapacity = 0; 

JETISENSOR_PTR sensors[] = 
{
  //              id             name        unit         data type             precision = 0 --> 0, precision = 1 --> 0.0, precision = 2 --> 0.00
  new JetiSensor( ID_VOLTAGE,   "Spannung",  "V",         JetiSensor::TYPE_14b, 1 ),
  new JetiSensor( ID_CURRENT,   "Strom", "A",         JetiSensor::TYPE_14b, 1 ),
  new JetiSensor( ID_CAPACITY,  "Kapazitaet",     "Ah",  JetiSensor::TYPE_14b, 2 ), // �C
  0 // end of array
};

void setup()
{
  jetiEx.Start( "OnkiSensor", sensors );
}
float vcode;
float acode;

void loop()
{
  GetSensorValues();
  
  jetiEx.SetSensorValue( ID_VOLTAGE,  myVoltage );
  jetiEx.SetSensorValue( ID_CURRENT, myCurrent );
  jetiEx.SetSensorValue( ID_CAPACITY, myCapacity ); 

  jetiEx.DoJetiSend(); 
}

void GetSensorValues()
{
  analogReadRes(12);
  vcode = analogRead(A0);
  acode = analogRead(A1);
  myVoltage = (vcode / 123);
  myCurrent = (acode / 67.5);
  myCapacity = myCapacity + (myCurrent / 14400);
  delay(250); 
   }

Einziges Problem derzeit ist, dass die MEsswerte für Strom und Spannung um Faktor 10 zu klein angezeigt werden.
Was mach ich falsch und wie bekomm ich dass jetzt noch auf die MiniBox?

Danke einstweilen an Bernd für diese garndiose Bibliothek - klasse. Auch wenn ich fast nix daraus wirklich schnalle:rolleyes:.

Gruß
Onki
 

onki

User
Hallo,

Sorry ich nochmal. Ich hab das Problem mit dem Faktor 10 umkreist. Es liegt an der gewählten Präzision.
Code:
  new JetiSensor( ID_VOLTAGE,   "Spannung",  "V",         JetiSensor::TYPE_14b, 0 ),
  new JetiSensor( ID_CURRENT,   "Strom", "A",         JetiSensor::TYPE_14b, 0 ),

Wenn die Präzision auf "1" steht sind die Werte um Faktor 10 kleiner, bei "0" stimmt alles.
Hab ich da eine n Fehler gemacht oder liegt das an der Library?

Gruß
Onki
 

Sepp62

User
Hallo Onki,

die Jeti-Telemetrie arbeitet mit "Festkomma". Die Anzahl der Stellen stellst Du im Sensorparameter "precision" ein.

Das ist der letzte Parameter in der jeweiligen Sensorzeile:

Code:
new JetiSensor( ID_VOLTAGE,   "Spannung",  "V",   JetiSensor::TYPE_14b, 1 ),

Hier ist der Wert also "1". Dann musst den Messwert mal 10 nehmen. Beispiel: Der Wert 71 wird also als 7.1 angezeigt.

Ist precision=2 musst Du den Messwert mal 100 nehmen. Beispiel: Der Wert 502 wird als 5.02 angezeigt.

Wenn man die Sensorwerte mit Integer-Variablen verwalten will, geht das nicht anders. Mit Fliesskomma könnte man das in der Library intern handhaben, aber es ist ein wenig komplizierter im Handling und der Prozessor hat mehr zu tun.

That's all !

Grüße
Bernd

Edit: OK, Du warst schneller :)
 

Sepp62

User
Wegen der Mini-Box: Vermutlich kann die keine EX-Sensoren anzeigen, sondern nur das Textprotokoll. Ich schau mir das mal bei Gelegenheit an sag' Dir Bescheid.
 
Liebe Jeti-Sensor-Gurus,
nachdem ich mir nicht sicher bin, ob meine PN an Bernd gestern rausging und vielleicht auch andere an dem Thema interessiert sind, schreib ich mein Anliegen hier nochmals auf.

Ich möchte, wie schon auf Seite 2 dieses Threads beschrieben, einen Sensor bauen, der meinen Akku-Packs auf die Finger schaut.
d.h. Aufzeichnet welcher Akku verwendet wird (mittels NFC Tag) und auch die Temperatur misst (per IR Sensor).
Besonderheit: ich fliege mit 2 Akkupacks (F3A).

Die Zutaten sind:
PN 532 NFC Reader
http://www.play-zone.ch/de/dk-pn532-nfc-rfid-mini-breakout-board.html

TMP007 Infrarot Temp Sensor von Texas Instruments
http://www.play-zone.ch/de/adafruit-kontaktloses-temperatur-sensor-breakout-tmp007.html

Kleine, aufklebbare NFC Tags (MiFare Ultralight):
http://www.play-zone.ch/de/tinkerforge-nfc-aufkleber-5-stk-transparent.html

Die meisten Libraries für NFC Chips können mit den kreditkartengrossen MiFare Classic Tags umgehen.
Die kleinen MiFare Ultralight Tags werden leider vernachlässigt.

Nach längerer Suche habe ich dann diese Library gefunden, die Ultralight Tags lesen und schreiben kann:
https://github.com/nurun/arduino_NFC

Da die TMP007 über den I2C Bus kommunizieren, wollte ich auch die NFC Boards an diesen Bus anschliessen.
Mit zwei TMP007 und einem PN532 funktioniert das Ganze schon mal ansatzweise.
ABER: der PN532 nur eine fixe I2C Adresse, die man nicht ändern kann :mad:.

OK, der Teensy hat ja zwei getrennte I2C Bus-Systeme, also sollte das kein Problem sein, da es eine Library für den Teensy gibt, mit dem man den zweiten I2C Bus nutzen kann:
https://github.com/nox771/i2c_t3

Leider bin ich offenbar der Erste, der 2 NFC Boards anschliessen möchte....

Die i2c_t3 Library habe ich in die arduino_NFC und in die TMP007 Libraries einbauen können, aber jetzt hänge ich an dem Problem, dass ich nicht weiss, wie man der arduino_NFC Lib zwei Boards beibringen kann, weil hier meine Arduino-Programmierkünste eindeutig am Ende sind.

Meine Programmierkenntnisse sind hier leider am Anschlag und ich hoffe daher stark, dass jemand von Euch in objektorientierter Ardunino-Programmierung fitter ist als ich (na ja, besonders fit bin ich eh nicht :D )

Aus dem Bespiel:
https://github.com/nurun/arduino_NFC/blob/master/examples/read_mifare/read_mifare.ino
...
23 #define IRQ 2
24 #define RESET 3
25
26 PN532 * board = new PN532_I2C(IRQ, RESET);

im Code der Library:

https://github.com/nurun/arduino_NFC/blob/master/Mifare.h
36 extern PN532 * board; <=== etwas unschlau, oder ?

und danach:
https://github.com/nurun/arduino_NFC/blob/master/Mifare.cpp
30 if (! board->sendCommandCheckAck(packetbuffer, 4))
31 return false;

Hätte jemand einen Umbautipp ?

Ideal wäre es, zwei PN532 Boards, die an den zwei Teensy I2C Bussystemen angeschlossen sind, ansprechen zu können (an einem Bus hängen zwei TMP007 Sensoren und ein PN532, am anderen I2C Bus der andere PN532).
Eine weitere Möglichkeit wäre ein I2C Multiplexer, der auch den Arduino-Fans Freude machen würde. Dann müsste man eine I2C Adresse übergeben können.

Herzliche Grüsse und vielen Dank für Eure Hilfe,
Wolfgang
 

onki

User
Hallo,

Danke euch beiden. Ich hoffe die anderen Mitlöeser könne mit den ganzen Infos und meinem Fehlern was anfangen und es selber besser machen.
Die Strom und Spannungsgeschicht ist dank der Anpassung der Divisoren nun OK.
Nur bei der Kapazität wird im Display noch 0.00 (Präzision 2) angezeigt.
Code:
myCapacity = myCapacity + (myCurrent / 14400);
hab ich wegen der Präzision 2 (Faktor 100) auf 144 geändert, trotzdem gibt es mit 55W Prüfling (H1 Lampe) keine Veränderung.
Kann man das so nicht machen mit der Summier-Formel oben?

Gruß
Onki

P.S. Schade dass man via Paypal kein Bier ausgeben kann. Ihr beide hättet es glatt verdient:-).
 

Sepp62

User
Hallo Onki,

ich habe Deinen Code nur überflogen, aber:

Du solltest "myCurrent" und "myCapacity" als "float" definieren.

Konstanten, die als "float" behandelt werden sollen, bekommen ein "f" hintendran. Gerne hängt man auch ein .0 dran:

Code:
float myCurrent = 0.0f;
float myCapacity = 0.0f;

Der Code zur Berechnung scheint mir OK.

Code:
 myCurrent = (acode / 67.5f);
 myCapacity = myCapacity + (myCurrent / 14400.0f);

Die float-Variablen "castest" Du auf "long". Das macht man so:

Code:
jetiEx.SetSensorValue( ID_CURRENT, (long)myCurrent );
jetiEx.SetSensorValue( ID_CAPACITY, (long)myCapacity );

Hoffe, das hilft.

Grüße
Bernd
 
Hallo Eckehard,
- RTC

Titel: "LowCells"
Inhalte: "YES: 1/3 Cells low!"

Normalanzeige wäre also:
Titel: "LowCells"
Inhalte: "3/3 Cells high"
Eckehard

Ich will für mein Vorhaben die Kapazität des Akkupacks und dessen Identifikationsnummer anzeigen.

Bin bei der Lösung "Kapazität.ID" gelandet mit entsprechender Einheit: "C.ID"
Vielleicht hilft das auch Dir:

"Anzahl erkannter Zellen"."Zellen OK"

"10.10 C.OK" - 10 Zellen erkannt, 10 OK
"10.05 C.OK" - 10 Zellen erkannt, 5 OK

das kann man mit Bordmittel hinkriegen, ist aber nicht so schön.

Übrigens: verwendest Du eine externe RTC, oder den Teensy mit einem Quartz ?

Gruss, Wolfgang
 

Sepp62

User
Hallo Wolfgang,

habe mir das Problem mit den zwei NFC-Readern angeschaut.

Da hast Du schon eine kleine Nuss zu knacken. Ich gebe Dir mal ein paar Hinweise:

1. Die I2C_T3-Lib bietet Dir die beiden statischen Objekte "Wire" und "Wire1".
2. Die NFC-Lib verwendet hart kodiert "Wire" und hat überdies nur eine statisches Objekt "board".
3. Du musst die NFC-Lib so umbauen, dass statt dem Objekt "Wire" ein Zeiger auf ein solches Objekt verwendet wird.
Folgende Ausdrücke sind gleichwertig:

a) Wire.begin();
b) i2c_t3 * ptrWire;
ptrWire->begin();

D.h. Du ersetzt das hart kodierte Objekt "Wire" durch einen Zeiger, den Du natürlich auch initialisieren musst. In der Jeti Ex-Lib wird das mit der seriellen Schnittstelle auch so gemacht. d.h. dort kannst Du es nachschauen.

Das alles ist nicht ohne und wenn Du in C/C++ nicht zu Hause bist, kostet das sicher einiges an Nerven.

Ich fürchte, das alles lenkt Dich vom eigentlichen Problem (dem Lesen von Tags) ab. Vielleicht findet sich ja ein NFC-Reader, der ein bisschen flexibler ist.

Die Idee mit dem Multiplexer wäre auch nicht so schlecht, allerdings musst Du auch da zwei Instanzen von "board" haben, weil ja der Interrupt zu jeder beliebigen Zeit kommen kann. D.h. den kannst Du nicht multiplexen.

Hoffe, das hilft Dir und demotiviert nicht.

Viele Grüße
Bernd
 

Eckehard

User
Moin Zusammen,
Hallo Wolfgang,

sorry, es kommen hier so viel Anregungen durch Euch, ich komm da nicht mehr hinterher, alles beantworten geschweige denn auszuprobieren. :cry:
Also Danke in Die Runde, nicht böse sein, wenn ich nicht zu allem zeitnah antworte!

- Zwei Werte in einem Fenster: Das habe ich auf die Schnelle nicht kapiert, werde mir es aber bei Gelegenheit anschauen, Danke!


- RTC: Ich habe leider keinen Quarz bekommen können. Außerdem ist die "angebaute" RTC auf dem Teensy nicht temp. kompensiert, und "verstellt" sich dann wohl, was bei "Langzeitbetrieb" nervig wäre....
Daher:
Ich benutze dieses Modul: http://www.amazon.de/DS3231-AT24C32...ie=UTF8&qid=1456220135&sr=8-1&keywords=DS3231
Es bietet auch die Möglichkeit die Temperatur mit auszugeben... ok, das ist die Chip-Temperatur, kann man also nicht (bzw. unschön) an eine andere, zu überwachende Hitzequelle "verlängern"

Grüße
Eckehard
 

Eckehard

User
Hallo Zusammen,

wieder eine Frage, die nihct direkt zum Thema passt, sorry vorab:

- Ich verwende die Library "SD" .....

Kennt jemand eine ähnliche Library, die auch das Setzen der Datei-Eigenschaft Timestamp unterstützt?

Wie im Bild zu sehen, ist dort bei jeder Datei auf der SD-Karte das Datum "Samstag, ‎1. ‎Januar ‎2000, ‏‎01:00:00" zu finden. Ich wünsche mir jedoch stattdessen die Timestamp des letzten Schreibvorgangs.

LogFile_Datei_Timestamp.png

1000 Dank und sorry...

Eckehard
 

Sepp62

User
Hallo zusammen,

ich finde es von meiner Seite aus völlig ok, wenn wir uns hier auch über Sensorthemen austauschen. Die Jeti-Telemetrie-Lib soll ja nur möglichst problemloses Mittel zum Zweck sein. Erst danach kommen ja die spannenden Themen.

Ich finde es jedenfalls sehr interessant hie Fragen und Antworten mitzuverfolgen.

Daher: Nur zu mit den Fragen und Diskussionen.

Grüße
Bernd
 
Ansicht hell / dunkel umschalten
Oben Unten