{"id":1914,"date":"2016-12-04T19:52:36","date_gmt":"2016-12-04T19:52:36","guid":{"rendered":"http:\/\/wp.andreas.bieri.name\/myblog\/?p=1914"},"modified":"2016-12-04T19:52:36","modified_gmt":"2016-12-04T19:52:36","slug":"pi-in-the-sky-telemetrie-i","status":"publish","type":"post","link":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/","title":{"rendered":"Pi-in-the-Sky II: Telemetrie-Daten und Sensoren"},"content":{"rendered":"<p>&nbsp;<\/p>\n<h4>Einleitung<\/h4>\n<p>Soweit sind wir also: der PITS l\u00e4uft und sendet seine Daten, allenfalls Bilder, auf UHF mit RTTY aus und diese k\u00f6nnen wir empfangen. Nachdem somit die \u00dcbertragung funktioniert, kann man sich um die effektiven Daten k\u00fcmmern. Es stellen sich die Fragen:<\/p>\n<ul>\n<li>welche Sensoren sind beim PITS onboard mit dabei? Was wurde schon ausprogrammiert?<br \/>\nAntwort gibt:\u00a0<a href=\"http:\/\/www.pi-in-the-sky.com\/index.php?id=advanced\" target=\"_blank\">http:\/\/www.pi-in-the-sky.com\/index.php?id=advanced<\/a><\/li>\n<li>welche Schnittstellen k\u00f6nnen noch genutzt werden: I2C, SPI, UART, Software Serial&#8230;<\/li>\n<li>wie k\u00f6nnen v\u00f6llig andere Sensoren angebunden werden?<\/li>\n<li>wie\u00a0versteht man die neuen Daten bei der Empfangsseite?<\/li>\n<\/ul>\n<p>Schritt f\u00fcr Schritt gehe ich in den n\u00e4chsten Blogs diesen Themen nach. Als erstes will ich ein paar der h\u00e4ufigsten Sensoren einbinden.<\/p>\n<p>&nbsp;<\/p>\n<h4>Updates und Tools<\/h4>\n<p>Bevor man selber Erweiterungen programmiert, k\u00f6nnte eine Update der Tracker Software n\u00fctzlich sein:<\/p>\n<pre>sudo apt-get -update\nsudo apt-get -upgrade\nsudo shutdown -r now<\/pre>\n<p>und dann<\/p>\n<pre>cd ~\/pits\ngit pull origin master\ncd tracker\nmake<\/pre>\n<p>&nbsp;<\/p>\n<h4>Anbindung der Temparatursensoren DS18B20<\/h4>\n<p>Das PITS Board hat einen eingebauten\u00a0DS18B20 Temperatursensor. Ein zweiter kann mit 3 Dr\u00e4hten (TO-92, 1-Wire Interface) angel\u00f6tet werden. Software-seitig ist dazu h\u00f6chstens in \/boot\/skipy.txt eine Zeile\u00a0<em>external_temperature=0<\/em>\u00a0oder <em>external_temperature=1 anzuf\u00fcgen<\/em>, wenn die Sensordaten vertauscht sein sollten.<\/p>\n<p>&nbsp;<\/p>\n<h4>Anbindung eines externen Sensors BMP180<\/h4>\n<p>Das PITS Board bringt bereits alles n\u00f6tige mit, um einen Temperatur\/Drucksensor des Typs BMP085 (Bosch, I2C Interface) anzubinden. Mein Vorhaben\u00a0ist die Anbindung eines BMP180 per I2C; er BMP180 ist kompatibel mit dem BMP085. Sobald\u00a0dies gelungen und verstanden\u00a0ist, steht der Erweiterung mit anderen I2C\u00a0Sensoren nichts mehr im Wege.<\/p>\n<p>Die elektronische Anbindung mit I2C ist klar (siehe auch\u00a0<a href=\"http:\/\/www.pi-in-the-sky.com\/index.php?id=adding-a-pressure-sensor\" target=\"_blank\">PITS Homepage).<\/a> Die Software Anpassung f\u00fcr den PITS besteht aus der Zeile &#8222;enable_bmp085=Y&#8220;, die in \/boot\/pisky.txt stehen muss.<\/p>\n<p>Es lohnt sich, schon von Anfang ein paar I2C Werkzeuge zu installieren, z.B. die i2c Tools:<\/p>\n<pre>sudo apt-get install -y python-smbus<\/pre>\n<p>(die i2c-Tools sind darin enthalten)<\/p>\n<p>Damit entdecken wir dann den BMP180 Sensor wie ewartet unter seiner Adresse 0x77:<\/p>\n<p><img loading=\"lazy\" class=\"size-full wp-image-2004 aligncenter\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/i2cdetect-1.jpg\" alt=\"i2cdetect-1\" width=\"544\" height=\"230\" srcset=\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/i2cdetect-1.jpg 544w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/i2cdetect-1-300x127.jpg 300w\" sizes=\"(max-width: 544px) 100vw, 544px\" \/><\/p>\n<p>Der Telemetriestring wird automatisch um Temperatur und Druck erg\u00e4nzt:<\/p>\n<p>ohne Drucksensor:<\/p>\n<pre>$$PI9TSS,7,00:00:00,0.00000,0.00000,00000,0,0,0,30.8,4.1,0.175*232D<\/pre>\n<p>mit Drucksensor:<\/p>\n<pre>$$PI9TSS,22,00:00:00,0.00000,0.00000,00000,0,0,0,30.4,4.1,0.175,<strong>21.7<\/strong>,<strong>954<\/strong>*E2D8<\/pre>\n<p>&nbsp;<\/p>\n<h4>Anbindung eines neuen Sensors<\/h4>\n<p>Wenn wir einen neuen, dem PITS noch nicht bekannten, Sensor anbinden wollen, gehen wir in 3 Schritten vor:<\/p>\n<ol>\n<li>Den Sensor verstehen und ohne PITS in C\/C++ beherrschen.<br \/>\nAdafruit, Sparkfun oder die Arduino Foren helfen hier h\u00e4ufig mit tollen Anleitungen.<\/li>\n<li>PITS Source Code mit dem Code aus 1) erweitern: neuen Code richtig in die vorhandene Filestruktur und Telemetrie einbinden<\/li>\n<li>Anpassungen an der Empfangsseite vornehmen<\/li>\n<\/ol>\n<p>Das generelle Vorgehen ist beim PITS unter &#8222;Extra Functionality&#8220; beschrieben. Meine PITS Boards sind alle relativ neu und schon mit I2C Schnittstelle ausger\u00fcstet.<\/p>\n<p><img loading=\"lazy\" class=\" wp-image-2033 aligncenter\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/pits-newcode1.jpg\" alt=\"pits-newcode1\" width=\"568\" height=\"559\" srcset=\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/pits-newcode1.jpg 880w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/pits-newcode1-300x296.jpg 300w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/pits-newcode1-768x757.jpg 768w\" sizes=\"(max-width: 568px) 100vw, 568px\" \/><\/p>\n<p>Der dritte Punkt ist weniger klar: wie kommen wir an die neuen Messwerte heran? Beim Ballon-Habitat System\u00a0ist das beschrieben im payload Dokument, aber wie geht das z.B. bei APRS und bei anderen Internet-Diensten? Welches Format ist einzuhalten? F\u00fcr APRS gibt es im direwolf Paket die Anleitung\u00a0APRS Telemetry Toolkit.pdf und weitere. Dies ist ein Thema f\u00fcr einen kommenden Blog.<\/p>\n<p>&nbsp;<\/p>\n<h4>Anbindung eines Sensors am Beispiel eines BME280<\/h4>\n<p>Der BME280 ist ein verbessertes Nachfolgeprodukt der erw\u00e4hnten Sensoren. Wichtigster Unterschied ist die zus\u00e4tzliche SPI Schnittstelle und der zus\u00e4tzliche Feuchtesensor (<a href=\"https:\/\/learn.adafruit.com\/adafruit-bme280-humidity-barometric-pressure-temperature-sensor-breakout\/overview\" target=\"_blank\">Beschreibung bei Adafruit<\/a>). Es gibt verschiedene Module mit diesem Sensor: bei Adafruit mit Stromversorgung, andere nur mit dem nackten Sensor. So eines habe ich von Sparkfun &#8211; Gewicht vielleicht\u00a05 Gramm&#8230;<\/p>\n<p>Technische Daten:<\/p>\n<ul>\n<li>Temp: &#8211;<strong>40C<\/strong> to 85C<\/li>\n<li>Humidity: 0 &#8211; 100% RH, =-3% from 20-80%<\/li>\n<li>Pressure: 30,000Pa to 110,000Pa, relative <strong>accuracy of 12Pa<\/strong>, absolute accuracy of 100Pa<\/li>\n<li>Altitude: 0 to 30,000 ft <strong>(9.2 km<\/strong>), relative <strong>accuracy<\/strong> of 3.3 ft <strong>(1 m)<\/strong> at sea level, 6.6 (<strong>2 m)<\/strong> at 30,000 ft.<\/li>\n<\/ul>\n<p>Alle Informationen\u00a0zum Modul und Programmierung, Hintergundwissen\u00a0dazu: <a href=\"https:\/\/learn.sparkfun.com\/tutorials\/sparkfun-bme280-breakout-hookup-guide\" target=\"_blank\">SparkFun BME280 Breakout Hookup Guide<\/a><\/p>\n<p><img loading=\"lazy\" class=\"wp-image-2046 aligncenter\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/bme280-2.jpg\" alt=\"bme280-2\" width=\"506\" height=\"423\" srcset=\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/bme280-2.jpg 947w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/bme280-2-300x251.jpg 300w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/bme280-2-768x642.jpg 768w\" sizes=\"(max-width: 506px) 100vw, 506px\" \/> <img loading=\"lazy\" class=\"wp-image-2047 aligncenter\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/bme280-1.jpg\" alt=\"bme280-1\" width=\"494\" height=\"459\" srcset=\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/bme280-1.jpg 486w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/bme280-1-300x279.jpg 300w\" sizes=\"(max-width: 494px) 100vw, 494px\" \/><\/p>\n<p>Wir m\u00fcssten also die Software des PITS anpassen, dass auch die Feuchtigkeit \u00fcbertragen wird (zus\u00e4tzlich die Feuchtedaten auslesen und\u00a0in den Telemetriestring einbauen). Es stellt sich heraus, dass dieser Sensor bereits vom Tracker vollst\u00e4ndig verstanden wird. In der Dokumentation ist das noch nicht erw\u00e4hnt. Im Code <strong>tracker.c<\/strong> sieht man aber<\/p>\n<pre>\u00a0if (Config.<strong>EnableBME280<\/strong>)\n\u00a0{\n\u00a0\u00a0sprintf(ExtraFields2, \",%.1f,%.0f,%0.1f\", GPS-&gt;BMP180Temperature, GPS-&gt;Pressure, <strong>GPS-&gt;Humidity<\/strong>);\n\u00a0}<\/pre>\n<p>Die struct Config erh\u00e4lt in <strong>tracker.c<\/strong> die Einstellungen aus der pisky.txt; mit der\u00a0Option <strong>enable_bme280=Y<\/strong> kann man den BME280 einschalten:<\/p>\n<pre> ReadBoolean(fp, \"<strong>enable_bme280<\/strong>\", -1, 0, &amp;(Config-&gt;<strong>EnableBME280<\/strong>));\n\u00a0if (Config-&gt;<strong>EnableBME280<\/strong>)\n\u00a0{\n\u00a0\u00a0printf(\"<strong>BME280<\/strong> Enabled\\n\");\n\u00a0}<\/pre>\n<p>Im Hauptprogramm wird der Thread eingebunden:<\/p>\n<pre>pthread_t PredictionThread, LoRaThread, APRSThread, GPSThread, DS18B20Thread, ADCThread, CameraThread, BMP085Thread, <strong>BME280Thread<\/strong>, LEDThread, LogThread;\n<\/pre>\n<p>Es gibt dementsprechend eine <strong>bme280.c<\/strong> Datei mit einer Procedure<\/p>\n<pre> void *<strong>BME280Loop<\/strong>(void *some_void_ptr)<\/pre>\n<p>&#8230;.<\/p>\n<pre>\u00a0if (BMEAddress)\n\u00a0{\n\u00a0\u00a0printf(\"BME280 Found At Address %02xh\\n\", BMEAddress);\n\u00a0}\n\u00a0else\n\u00a0{\n\u00a0\u00a0printf(\"BME280 Not Found (nothing at addresses 76\/77h)\\n\");\n\u00a0}\n\u00a0while (BMEAddress)\n\u00a0{\n\u00a0\u00a0if ((bme.fd = open_i2c(BMEAddress)) &gt;= 0)\n\u00a0\u00a0{\n\u00a0\u00a0\u00a0bme280StartMeasurement(&amp;bme);\n\u00a0\u00a0\u00a0sleep(1);\u00a0\u00a0\/\/ Wait (ample time) for measurement\n\u00a0\u00a0\u00a0bme280ReadDataRegisters(&amp;bme);\n\u00a0\u00a0\u00a0bme280GetRawValues(&amp;bme);\n\u00a0\u00a0\u00a0GPS-&gt;BMP180Temperature = bme280Temperature(&amp;bme);\n\u00a0\u00a0\u00a0GPS-&gt;Pressure = bme280Pressure(&amp;bme);\n\u00a0\u00a0\u00a0<strong>GPS-&gt;Humidity = bme280Humidity(&amp;bme);<\/strong>\n   \/\/ printf(\"Temperature is %5.2lf\\n\", GPS-&gt;BMP180Temperature);\n   \/\/ printf(\"Pressure is %5.2lf\\n\", GPS-&gt;Pressure);\n   \/\/ printf(\"Humidity is %5.2lf\\n\", GPS-&gt;Humidity);\n   close(bme.fd);\n  }\nsleep(10);<\/pre>\n<p>Der Sensor\u00a0sollte also automatisch ausgelesen werden, sobald er am I2C Bus erkannt wird.<\/p>\n<p>Es gibt noch ein Problem mit der I2C Adresse: der Code geht von Adresse 0x76h aus, mein Modul ist auf 0x77h. Inkonsequenterweise werden beide Adressen abgecheckt, aber dann stillschweigend 0x76h verwendet. Der Tracker gibt dann nat\u00fcrlich\u00a0laufend Fehlermeldungen aus, dass er nicht auf den i2c_slave schreiben k\u00f6nne und in der Telemetrie stehen Nullen:<\/p>\n<pre><strong>BME280 Found At Address 76h<\/strong><\/pre>\n<pre>$$PI9TSS,15,00:00:00,0.00000,0.00000,00000,0,0,0,27.7,4.1,0.175,<strong>0.0,0,0.0<\/strong>*992B<\/pre>\n<p>Dies kann man entweder im Code\u00a0beheben oder mit einer L\u00f6tbr\u00fccke auf dem Modul (siehe Bild oben). Ich werde den Code in Zeile 90 von bme280.c anpassen\u00a0auf Adresse 0x77h. Ein BMP180 und ein BME280 d\u00fcrfen deswegen nicht gleichzeitig am I2C angeschlossen sein.<\/p>\n<pre>#define BME280_ADDRESS 0x76\u00a0 \u00a0\u00a0\/\/ Possible I2C address of BME280 pressure sensor (could also be on ox77)<\/pre>\n<p>neu:<\/p>\n<pre>#define BME280_ADDRESS <strong>0x77\u00a0<\/strong>\u00a0\u00a0\u00a0\/\/ I2C address of BME280 pressure sensor, Sparkfun breakout board<\/pre>\n<p>Danach ist eine Compilation n\u00f6tig (sudo make, sudo .\/startup) und der Sensor wird gelesen:<\/p>\n<pre>SDA\/SCL = 2\/3\nOpened I2C GPS Port\nT1=28054, T2=26448, T3=50\nRegisters 19 3, Value 307\nRegisters 0 3, Value 0\nH6 = 30\nBME280 Found At Address 77h<\/pre>\n<p>Wir sehen hier auch gleich ein Problem in der Programmstruktur: die Messung wird alle 10 Sekunden gemacht; dies wird durch ein blockierendes sleep(10) erreicht. Bei anderen Sensoren, die schneller ausgelesen werden sollen, wird dies zum Problem. Man wird sich das das Zeit-Budget anschauen\u00a0m\u00fcssen und evtl. eine Interrupt (Timer-) gesteuerte Abfrage bauen. Nat\u00fcrlich stellt dann der Stromverbrauch ein weiteres Problem dar.<\/p>\n<p>&nbsp;<\/p>\n<h4>RTTY Telemetrie &#8211;\u00a0String f\u00fcr BME280\u00a0definieren<\/h4>\n<p>Aus den Messdaten des BME280 ist nun eine Telemetrie-Zeile zu bauen. Eine Codestelle haben wir schon gesehen:<\/p>\n<pre>\u00a0if (Config.EnableBMP085)\n\u00a0{\n\u00a0\u00a0sprintf(ExtraFields2, \",%.1f,%.0f\", GPS-&gt;BMP180Temperature, GPS-&gt;Pressure);\n\u00a0}\n\u00a0\u00a0if (Config.<strong>EnableBME280<\/strong>)\n\u00a0{\n\u00a0\u00a0sprintf(ExtraFields2, \",%.1f,%.0f,%0.1f\", GPS-&gt;BMP180Temperature, GPS-&gt;Pressure, <strong>GPS-&gt;Humidity<\/strong>);\n\u00a0}<\/pre>\n<p>Der Rest macht der Code in tracker.c (inkl. Pr\u00fcfsumme anh\u00e4ngen). Der Standard Code geht von 3 &#8222;Extrafields&#8220; aus, Stringvariablen zu je 20 Zeichen, in die Werte geschrieben werden k\u00f6nnen. Anzahl und L\u00e4nge dieser Felder ist allenfalls hier passend zu erweitern (tracker.c, ca. ab Zeile 70):<\/p>\n<pre>void <strong>BuildSentence<\/strong>(char *TxLine, int SentenceCounter, struct TGPS *GPS)\n{\n\u00a0char TimeBuffer[12], <strong>ExtraFields1[20], ExtraFields2[20], ExtraFields3[20];<\/strong>\n\u00a0sprintf(TimeBuffer, \"%02d:%02d:%02d\", GPS-&gt;Hours, GPS-&gt;Minutes, GPS-&gt;Seconds);\n\u00a0ExtraFields1[0] = '\\0';\n\u00a0ExtraFields2[0] = '\\0';\n\u00a0ExtraFields3[0] = '\\0';\n\u00a0if ((Config.BoardType == 3) || (Config.DisableADC))\n\u00a0 {\n\u00a0\u00a0\u00a0\/\/ Pi Zero - no ADC on the PITS Zero, or manually disabled ADC\n\u00a0 }\n\u00a0else if (Config.BoardType == 0)\n\u00a0 {\n\u00a0\u00a0 \/\/ Pi A or B.\u00a0 Only Battery Voltage on the PITS\n\u00a0\u00a0 sprintf(ExtraFields1, \",%.3f\", GPS-&gt;BatteryVoltage);\n\u00a0 }\n\u00a0else<\/pre>\n<p>Schliesslich wird aus allen Feldern die Zeile komplett gebaut:<\/p>\n<pre>\u00a0\u00a0\u00a0 sprintf(TxLine, \"$$%s,%d,%s,%7.5lf,%7.5lf,%5.5\" PRId32 \",%d,%d,%d,%3.1f%s%s%s\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Config.Channels[RTTY_CHANNEL].PayloadID,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SentenceCounter,\n\u00a0\u00a0\u00a0         TimeBuffer,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPS-&gt;Latitude,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPS-&gt;Longitude,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPS-&gt;Altitude,\n\u00a0\u00a0\u00a0         (GPS-&gt;Speed * 13) \/ 7,\n\u00a0\u00a0\u00a0         GPS-&gt;Direction,\n\u00a0\u00a0\u00a0         GPS-&gt;Satellites,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPS-&gt;DS18B20Temperature[(GPS-&gt;DS18B20Count &gt; 1) ? (1-Config.ExternalDS18B20) : 0],\n\u00a0\u00a0\u00a0            ExtraFields1, ExtraFields2, ExtraFields3);\n            AppendCRC(TxLine);<\/pre>\n<p>Dann ist mir aufgefallen, dass die Telemetrie Zeile am Bildschirm nicht stimmt. Also am Ende von bme208.c die Zeilen<\/p>\n<pre>\u00a0\u00a0\u00a0\/\/ printf(\"Temperature is %5.2lf\\n\", GPS-&gt;BMP180Temperature);\n\u00a0\u00a0\u00a0\/\/ printf(\"Pressure is %5.2lf\\n\", GPS-&gt;Pressure);\n\u00a0\u00a0\u00a0\/\/ printf(\"Humidity is %5.2lf\\n\", GPS-&gt;Humidity);<\/pre>\n<p>wieder aktiviert.\u00a0Die Messwerte sind vorhanden in der struct GPS:<\/p>\n<pre>$GNGGA,,,,,,0,00,99.99,,,,,,*56\n<strong>Temperature is 22.44<\/strong>\n<strong>Pressure is 962.83<\/strong>\n<strong>Humidity is 52.72<\/strong>\n$GNRMC,,V,,,,,,,,,,N*4D<\/pre>\n<p>Also schauen wir dort, wo die Telemetrie zusammengebaut wird und ins telemetry.txt File &#8211; alles in Ordnung, eventuell wird nur die Anzeige am Bildschirm gek\u00fcrzt?<\/p>\n<pre><img loading=\"lazy\" class=\"size-full wp-image-2051 aligncenter\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/telemetry-bme280.jpg\" alt=\"telemetry-bme280\" width=\"842\" height=\"109\" srcset=\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/telemetry-bme280.jpg 842w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/telemetry-bme280-300x39.jpg 300w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/telemetry-bme280-768x99.jpg 768w\" sizes=\"(max-width: 842px) 100vw, 842px\" \/><\/pre>\n<p>Beim Empf\u00e4nger stimmt alles! Viel Sorge um nichts, daf\u00fcr kennt man sich jetzt schon besser im Code aus.<\/p>\n<p>&nbsp;<\/p>\n<h4>APRS Telemetrie &#8211;\u00a0String f\u00fcr BME280\u00a0definieren<\/h4>\n<p>Der PITS Code ist nicht darauf vorbereitet, die Daten des BME 280 \u00fcber APRS auszuschicken. Wir holen dies nach &#8211; dazu sind 3 Schritte n\u00f6tig:<\/p>\n<ul>\n<li>Einf\u00fcgen der eigentlichen Daten in den APRS Telemetrie String<\/li>\n<li>Einf\u00fcgen der Metadaten<\/li>\n<li>Einf\u00fcgen von Angaben zum Wertebereich<\/li>\n<\/ul>\n<p>Das APRS Protokoll sieht maximal 5 analoge Werte im Telemetrie String vor. Koordinaten und Sequence Number z\u00e4hlen nicht dazu. Der PITS Code definiert bereits 3 Werte. Wir erg\u00e4nzen Druck und Feuchte:<\/p>\n<ol>\n<li>Sats &#8211; Anzahl Satelliten<\/li>\n<li>Temperature &#8211; Temperatur (die interne Temperatur oder externe vom DS18 Sensor)<\/li>\n<li>Battery &#8211; Batteriespannung vom internen ADC<\/li>\n<li>neu: Pressure &#8211; Druck vom BME280 Sensor in hPA<\/li>\n<li>neu: Humidty &#8211; Feuchte vom BME280 Sensor in Prozent<\/li>\n<\/ol>\n<p>Bei der Temperatur habe ich den Code ange\u00e4ndert, dass die Temperatur des BME280 verwendet wird. \u00a0Man k\u00f6nnte noch Dezimalgrad verwenden. Die Batteriespannung wird im original Code nicht verwendet, dort steht ein statischer Wert von 4.321V drin (Bug).<\/p>\n<p>Ausser den Werten sind also noch die &#8222;Titel&#8220; und die Einheiten anzugeben. Ausserdem k\u00f6nnen die Werten transformiert werden (typischerweise skaliert). Details dazu stehen in der <a href=\"https:\/\/www.google.ch\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwj20Ivv2JLRAhVDYFAKHaXvBWgQFggaMAA&amp;url=http%3A%2F%2Fwww.aprs.org%2Fdoc%2FAPRS101.PDF&amp;usg=AFQjCNE8bnKB86eQrLnH75eDRuseRabw0w&amp;bvm=bv.142059868,d.ZWM\" target=\"_blank\">APRS Spezifikation<\/a>\u00a0und in\u00a0APRS Telemetry Toolkit.pdf (bei Direwolf dabei).<\/p>\n<p>Alle diese Anpassungen sind wie unten folgt in aprs.c vorzunehmen und der tracker neu zu kompilieren.<\/p>\n<pre>void SendAPRS(struct TGPS *GPS)\n{\n unsigned char frames[4][200];\n int lengths[4];\n int message_count, total_length;\n <strong>\/\/ hb9tss added 4 to 9 <\/strong>\n<strong> char stlm[13];<\/strong>\n char slat[5];\n char slng[5];\n double aprs_lat, aprs_lon;\n int32_t aprs_alt;\n static uint16_t seq = 0;\n uint32_t aprs_temperature, aprs_voltage;\n <strong>\/\/ hb9tss new variables<\/strong>\n<strong> uint32_t aprs_pressure, aprs_humidity;<\/strong>\n...<\/pre>\n<pre> \/\/ Construct the compressed telemetry format\n ax25_base91enc(stlm + 0, 2, seq);\n ax25_base91enc(stlm + 2, 2, GPS-&gt;Satellites);\n \/\/ hb9tss \n \/\/aprs_temperature = GPS-&gt;DS18B20Temperature[0] + 100;\n<strong> aprs_temperature = GPS-&gt;BMP180Temperature + 100;<\/strong> \n \/\/ hb9tss \n \/\/GPS-&gt;BatteryVoltage = 4.321;\n <strong>aprs_voltage = GPS-&gt;BatteryVoltage * 1000;<\/strong>\n ax25_base91enc(stlm + 4, 2, aprs_temperature);\n ax25_base91enc(stlm + 6, 2, aprs_voltage);\n \/\/ hb9tss\n<strong> aprs_pressure = GPS-&gt;Pressure;<\/strong>\n<strong> aprs_humidity = GPS-&gt;Humidity * 10;<\/strong>\n<strong> ax25_base91enc(stlm + 8, 2, aprs_pressure);<\/strong>\n<strong> ax25_base91enc(stlm + 10, 2, aprs_humidity);<\/strong>\n...<\/pre>\n<pre>if (Config.APRS_Telemetry)\n {\n char s[10];\n sprintf(s, strncpy(s, Config.APRS_Callsign, 7));\n if(Config.APRS_ID) snprintf(s + strlen(s), 4, \"-%i\", Config.APRS_ID);\n \n \/\/ Transmit telemetry definitions\n ax25_frame(frames[1], &amp;lengths[1],\n Config.APRS_Callsign,\n Config.APRS_ID,\n APRS_DEVID, 0,\n 0, 0,\n \/\/ hb9tss added Pressure and Humidity\n<strong> \":%-9s:PARM.Satellites,Temperature,Battery,Pressure,Humidity\",<\/strong>\n s);\n total_length += lengths[1];<\/pre>\n<pre>ax25_frame(frames[2], &amp;lengths[2],\n Config.APRS_Callsign,\n Config.APRS_ID,\n APRS_DEVID, 0,\n 0, 0,\n \/\/ hb9tss added hPa,Percent\n<strong> \":%-9s:UNIT.Sats,deg.C,Volts,hPA,Percent\",<\/strong>\n s);\n total_length += lengths[2];\n ax25_frame(frames[3], &amp;lengths[3],\n Config.APRS_Callsign,\n Config.APRS_ID,\n APRS_DEVID, 0,\n 0, 0,\n \/\/ hb9tss changed last triplett\n<strong> \":%-9s:EQNS.0,1,0, 0,1,-100, 0,0.001,0, 0,1,0, 0,0.1,0\",<\/strong>\n s);\n total_length += lengths[3];\n message_count += 3; \n }<\/pre>\n<p>Das Ergebnis sieht gut aus:<\/p>\n<p><img loading=\"lazy\" class=\" wp-image-2242 aligncenter\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/APRS-Direwolf-ergaenzte-Telemetrie.jpg\" alt=\"aprs-direwolf-erganzte-telemetrie\" width=\"643\" height=\"392\" srcset=\"http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/APRS-Direwolf-ergaenzte-Telemetrie.jpg 814w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/APRS-Direwolf-ergaenzte-Telemetrie-300x183.jpg 300w, http:\/\/wp.andreas.bieri.name\/myblog\/wp-content\/uploads\/2016\/12\/APRS-Direwolf-ergaenzte-Telemetrie-768x468.jpg 768w\" sizes=\"(max-width: 643px) 100vw, 643px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h4>Ausblick<\/h4>\n<p>In einem kommenden Blog beschreibe ich die Anpassungen an der payload Definition f\u00fcr den Habitat Service (n\u00f6tig, damit die Messdaten auch korrekt interpretiert werden).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Einleitung Soweit sind wir also: der PITS l\u00e4uft und sendet seine Daten, allenfalls Bilder, auf UHF mit RTTY aus und diese k\u00f6nnen wir empfangen. Nachdem somit die \u00dcbertragung funktioniert, kann man sich um die effektiven Daten k\u00fcmmern. Es stellen sich die Fragen: welche Sensoren sind beim PITS onboard mit dabei? Was wurde schon ausprogrammiert? [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[8,11,12],"tags":[94,95,97],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Pi-in-the-Sky II: Telemetrie-Daten und Sensoren - Merkbar.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pi-in-the-Sky II: Telemetrie-Daten und Sensoren - Merkbar.\" \/>\n<meta property=\"og:description\" content=\"&nbsp; Einleitung Soweit sind wir also: der PITS l\u00e4uft und sendet seine Daten, allenfalls Bilder, auf UHF mit RTTY aus und diese k\u00f6nnen wir empfangen. Nachdem somit die \u00dcbertragung funktioniert, kann man sich um die effektiven Daten k\u00fcmmern. Es stellen sich die Fragen: welche Sensoren sind beim PITS onboard mit dabei? Was wurde schon ausprogrammiert? [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/\" \/>\n<meta property=\"og:site_name\" content=\"Merkbar.\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-04T19:52:36+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/i2cdetect-1.jpg\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"wp_blogadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#website\",\"url\":\"http:\/\/52.29.166.97\/myblog\/\",\"name\":\"Merkbar.\",\"description\":\"IT, Elektronik und Mathematik\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/52.29.166.97\/myblog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/#primaryimage\",\"inLanguage\":\"de\",\"url\":\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/i2cdetect-1.jpg\",\"contentUrl\":\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/i2cdetect-1.jpg\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/#webpage\",\"url\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/\",\"name\":\"Pi-in-the-Sky II: Telemetrie-Daten und Sensoren - Merkbar.\",\"isPartOf\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/#primaryimage\"},\"datePublished\":\"2016-12-04T19:52:36+00:00\",\"dateModified\":\"2016-12-04T19:52:36+00:00\",\"author\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\"},\"breadcrumb\":{\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"http:\/\/52.29.166.97\/myblog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pi-in-the-Sky II: Telemetrie-Daten und Sensoren\"}]},{\"@type\":\"Person\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\",\"name\":\"wp_blogadmin\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"caption\":\"wp_blogadmin\"},\"url\":\"http:\/\/wp.andreas.bieri.name\/myblog\/author\/wp_blogadmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pi-in-the-Sky II: Telemetrie-Daten und Sensoren - Merkbar.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/","og_locale":"de_DE","og_type":"article","og_title":"Pi-in-the-Sky II: Telemetrie-Daten und Sensoren - Merkbar.","og_description":"&nbsp; Einleitung Soweit sind wir also: der PITS l\u00e4uft und sendet seine Daten, allenfalls Bilder, auf UHF mit RTTY aus und diese k\u00f6nnen wir empfangen. Nachdem somit die \u00dcbertragung funktioniert, kann man sich um die effektiven Daten k\u00fcmmern. Es stellen sich die Fragen: welche Sensoren sind beim PITS onboard mit dabei? Was wurde schon ausprogrammiert? [&hellip;]","og_url":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/","og_site_name":"Merkbar.","article_published_time":"2016-12-04T19:52:36+00:00","og_image":[{"url":"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/i2cdetect-1.jpg"}],"twitter_card":"summary","twitter_misc":{"Verfasst von":"wp_blogadmin","Gesch\u00e4tzte Lesezeit":"10 Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"http:\/\/52.29.166.97\/myblog\/#website","url":"http:\/\/52.29.166.97\/myblog\/","name":"Merkbar.","description":"IT, Elektronik und Mathematik","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/52.29.166.97\/myblog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"ImageObject","@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/#primaryimage","inLanguage":"de","url":"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/i2cdetect-1.jpg","contentUrl":"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/12\/i2cdetect-1.jpg"},{"@type":"WebPage","@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/#webpage","url":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/","name":"Pi-in-the-Sky II: Telemetrie-Daten und Sensoren - Merkbar.","isPartOf":{"@id":"http:\/\/52.29.166.97\/myblog\/#website"},"primaryImageOfPage":{"@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/#primaryimage"},"datePublished":"2016-12-04T19:52:36+00:00","dateModified":"2016-12-04T19:52:36+00:00","author":{"@id":"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d"},"breadcrumb":{"@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/12\/04\/pi-in-the-sky-telemetrie-i\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"http:\/\/52.29.166.97\/myblog\/"},{"@type":"ListItem","position":2,"name":"Pi-in-the-Sky II: Telemetrie-Daten und Sensoren"}]},{"@type":"Person","@id":"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d","name":"wp_blogadmin","image":{"@type":"ImageObject","@id":"http:\/\/52.29.166.97\/myblog\/#personlogo","inLanguage":"de","url":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","caption":"wp_blogadmin"},"url":"http:\/\/wp.andreas.bieri.name\/myblog\/author\/wp_blogadmin\/"}]}},"_links":{"self":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts\/1914"}],"collection":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/comments?post=1914"}],"version-history":[{"count":0,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts\/1914\/revisions"}],"wp:attachment":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/media?parent=1914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/categories?post=1914"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/tags?post=1914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}