Samstag, 22. Mai 2021

E-Bike wird Smart

Die Android App

Als letzten Teil dieser Reihe will ich auf die Android App eingehen.
Sie besteht aus 4 Fragments, 
Home (links), History (Mitte), Map (rechts) und Settings (hier nicht dargestellt)


Eigentlich selbsterklärend. Im Home Fragment werden alle Daten angezeigt die in der Summary.txt abgespeichert sind.  {"tick":"1","tour":"19.65 km","since":"1:05","max":"23.00", "year":"1249.19 km","total":"7319 km","lastkm":"31.37","duration":"1:37", "datelast":"20.05.2021"}

Im letzten Teil hatte ich erklärt, wie sich die Dateien mit den GPS Daten zusammensetzten
Diese sind im Verzeichnis "Tours" auf dem Handy gespeichert. Die Dateinamen setzten sich dann so zusammen, dass sie alle Informationen für den Aufbau der History Liste enthalten.
für den ersten Eintrag ist der Dateiname "2021-05-20_1112_3137_097.txt". Spontan kann ich nicht mehr erklären warum ich definiert habe, dass hier dann 097 also 97 Minuten anstatt 137 also 1Std 37Minuten stehen. Ich werde mir was bei gedacht haben. 

In der MAP Darstellung kann ich mir dann anschauen, wo ich mit dem Rad lang gefahren bin.
Je nachdem wie lange das Rad ausgeschaltet war, dauert es etwas bis die GPS Satelliten korrekt ausgewertet werden. daher ist hier eine Lücke in der Darstellung erkennbar. Vielleicht ist es auch ein Schwäche des GPS Moduls. Mir reicht die Genauigkeit aus.

In der Ansicht der Settings ist nicht viel zu sehen daher auch kein Screenshot. Hier kann man die Anzahl der Kilometer eintragen die man ab Jahresanfang gefahren ist. i.d.R. mache ich dass so, dass ich die Anzahl der Jahreskilometer am 01. Januar auf 0 stelle. Damit diese zum E-Bike übertragen wird, ist eine Bluetooth Verbindung zum E-Bike notwendig. Hinter dem Admin Button verbirgt sich die Funktion die den ESP Controller im E-Bike in den OTA Modus versetzt. Hierzu ist das E-Bike in den SSID Bereich des im OTA Script hinterlegten Netzwerkes zu positionieren. Auch diese Funktion ist nur  mit Bluetooth Verbindung zum E-Bike verfügbar

Nun bin ich nicht der Android Programmier Spezialist und habe mir viel Techniken erst selber aneignen müssen. Das Arbeiten mit Fragments, die Darstellung der Listen funktioniert komplett anders als z.B. mit jQuery Mobile. Das Herstellen einer Bluetooth Verbindung zum Android mit entsprechender Datenübertragung war eine größerern Herausforderungen. Aber dennoch, ich habe das Projekt mit viel Geduld umsetzen können und habe noch vor einiges zu verändern.

Ich habe die App mit Android Studio 4.12 auf einem Linux System erstellt. Sollte sich jemand den Code herunterladen und die App installieren wollen, so muss man die Pfade auf dem Handy manuell anlegen, und die Summary.txt in den Pfad kopieren. Darüber hinaus braucht die App die Berechtigung für Bluetooth und SD Schreibberechtigung. Ich habe bewusst nicht eine kompilierte Version hochgeladen.
Es gibt sicherlich genügende Spezis die es besser / anders machen würden, aber diese APP funktioniert auf meinem Handy sehr zuverlässig. Für jeden Ratschlag bin ich dankbar, Kritik gerne, aber dann sollte auch gleich ein konstruktiver Teil dabei sein.

Was ist als nächstes geplant? Da ich nicht immer mein Handy dabei habe, will ich umsetzen, dass sich die Mein Home Webserver die Dateien vom E-Bike holt. Also wenn es zu Hause angekommen ist, wird über ein Raspberry eine BT Verbindung zum E-Bike hergestellt, der dann alle neu GPS Dateien und die Summary.txt dann auf den Server kopiert. Rufe ich zu Hause dann die E-Bike App auf, holt sich die APP die Dateien vom Server.

Wenn Du Fragen zum Quellcode der App hast, dann kannst Du mir gerne eine Mail schreiben.

Viel Spaß beim Nachbauen / Programmieren.

Dienstag, 4. Mai 2021

E-Bike wird Smart

Das ESP Programm

Dieser Abschnitt beschäftigt sich mit dem Programm, welches auf dem ESP läuft.
Grundsätzlich bin ich bei der Architektur so vorgegangen, dass alle Informationen zu der gerade gefahrenen Strecke in mehreren Dateien abgelegt werden. Warum in mehreren Dateien? Nun ich wollte keine Datenbank einsetzen, das wäre mit Kanonen auf Spatzen, aber ich wollte es für den Sketch so einfach wie möglich halten.
Und so werden alle Daten vom GPS Empfänger in eine Datei geschrieben, und alle Daten die beim Start notwendig sind, also aktuelle Zeit, aktueller Kilometerstand aus einer Datei gelesen.
Die Daten, die für die Übertragung auf das Handy notwendig sind, werden in der dritten Datei gespeichert und mittels Bluetooth als Datenstream ans Handy gesendet, wenn eine Verbindung zum Handy besteht.
Darüber hinaus erzeuge ich noch an jedem Tag an dem gefahren wird eine Log Datei, die ist aber nur für die Fehleranalyse notwendig. Nach jetzt gut 4 Wochen Betrieb kam es bisher noch zu keinem Fehler.
Einige Informationen sind im Laufe der Entwicklung auch obsolete geworden, da ich im letzten Jahr noch mit den Radumdrehungen gearbeitet habe, da war ich noch nicht in der Lage den CAN Bus auszulesen.  
Fangen wir mit der init.txt  Datei an.
der Inhalt:
{"tick":"1","tour":"0.00 km","since":"0:00","max":"0.00","year":"666.01 km","total":"6736.05 km","lastkm":"4.28","duration":"0:16","datelast":"03.04.2021"}

tick; wird nicht mehr zur Berechnung benötigt, wird nur noch im Android Programm zur Identifizierung des Datenstreams genutzt, wird irgendwann mal weg fallen
tour: enthält die Anzahl der Kilometer seit dem Start der aktuellen Tour.
since: seit wann wird die Tour gefahren, und später dann als Info über die TourZeit
max: die Maximale Geschwindigkeit während dieser Tour
year: die Anzahl der Kilometer die in diesem Jahr zurückgelegt wurde
total: die Anzahl der Kilometer die das Rad zurückgelegt hat CANBus ID 0x202
lastkm: die Anzahl der Kilometer der letzten Tour
duration: die Dauer der letzten Tour
datelast: das Datum an dem die Tour gefahren wurde.

Diese Daten werden mit der Funktion Send_BT_Summary ans Handy gesendet wenn das Rad steht und eine Verbindung besteht. Aber auch alle 100m in die Datei auf der SD Karte im Rad geschrieben.

der Inhalt der setup.txt:
{"raumf":"2250","l_date":"20210405","l_start":"1630","l_startkm":"6736.05"}

raumf: ist obsolete, da nicht mehr mit dem Radumfang und der Radumdrehung gearbeitet wird. kann genauso wie tick irgendwann mal rausfliegen.
l_date: ist das Datum an dem die aktuelle tour gestartet wurde. ist das aktuelle Datum größer als dieses, dann beginnt er eine neue Tour und schließt diese ab.
l_start: ist die Uhrzeit an dem die aktuelle tour gestartet wurde
l_startkm: ist der Kilometerstand an dem die aktuelle Tour gestartet wurde.

Bleibt als letztes von das Abspeichern der GPS Daten. Dazu wird bei beginn einer neuen Tour aus dem l_date eine neue Datei erstellt, in diesem Beispiel 20210405.txt. Hier werden die GPS Daten im JSON Format gespeichert.{"GPS":[{"lat":"51.273742640","lng":"6.793988365"},{"lat":"51.273086760","lng":"6.812092105"},
Wird eine Tour abgeschlossen, also wenn das aktuelle Datum ungleich der dem
 l-date ist, dann wird an diese Datei noch ein die folgenden Informationen der aktuellen Tour angehängt, beginnend mit der geschlossenen eckigen Klammer. ],"durt":"0:59","dist":"15.00","avsp":"15.00","maxsp":"28.05"}

Diese Datei wird dann wie folgt benannt 2021-04-05_1630_1500_059.txt und im Data Verzeichnis der SD Karte im ESP abgespeichert. Ist das Handy dann in Reichweite und besteht eine BT Verbindung wird es ans Handy übertragen und steht dann der APP unter History zur Verfügung.

Das Programm habe ich las Zip Datei zum Download bereitgestellt. Es sind natürlich noch die diversen Bibliotheken notwendig, die von die diversen ESP Development Quellen heruntergeladen werden können. Ein wenig tricky ist es mit der CAN Bus Library, hier gibt es unterschiedliche mit gleichem Namen. Ich habe diese von sandeepmistry genutzt. Der Vorteile bei dem verwendeten Modul ist, dass
a:) der ESP32 einen eingebauten CAN Controller hat,
b:) damit kann das CAN Interface sehr viel kleiner ausfallen.

Im nächsten Teil gehe ich dann noch auf die Android App ein.
Viel Spaß beim lesen, wenn jemand Fragen hat, einfach melden.

Gruß
Ulli