German Tachometer

D

Deleted member 103

Guest
Hallo Jungs,

hat schon jemanden ein Tachometer programmiert?
Ich meine nicht grafisch sondern nur als Zahlen in ein Label.

Die GPS-Funktion "Location1.Speed" liefert nicht immer das richtige Ergebnis.
B4X:
Sub GPS_LocationChanged (Location1 As Location)
    Dim locDistance As Float
   
    If Location1.SpeedValid Then
        If Location1.Speed > 0 Then
            If GPSPathPreviuous.Speed > 0 Then
                locDistance = GPSPathPreviuous.DistanceTo(Location1)               
            End If
   
            GPSPathPreviuous = Location1
        End If   
       
        'Aktuelle Geschwindigkeit anzeigen
        lblSpeedStatus.Text = NumberFormat2(Location1.Speed, 1, 2, 2, False) & " km/h"
    End If

End Sub

Das Problem ist auch das wenn man steht die Anzeige nicht auf "0.00 km/h" geht.
Wie würdet ihr das Problem lösen?
 

Knoppi

Active Member
Licensed User
Longtime User
Hallo Filippo,

die Ungenauigkeit der Speed-Werte ist abhängig von der Anzahl der benutzten Sateliten.
Je mehr Sateliten desto genauer.
Diese Ungenauigkeit läßt sich an dem Accuracy-Wert ablesen.

Das löst natürlich nicht dein Problem mit 0.00 km/h, aber vielleicht kann Du mit diesen Angaben eine Art ungenauigkeit Funktion basteln.

Ich werde mich auch mal daran versuchen.

viele Grüße
Knoppi
 

KlaKoe

Member
Licensed User
Longtime User
Hallo Filippo
Da grundsätzlich jede einzelne GPS-Messung für sich einen Fehler aufweist (im Bereich einiger Meter), können mehrere hintereinander folgende Messungen im Stand i.d.R. auch nie identisch sein, d.h. auch bei stehendem Fahrzeug wird "locDistance" praktisch immer > 0 sein (und damit auch die berechnete Geschwindigkeit zwischen zwei aufeinander folgenden Messungen).

Mit der Funktion "Start" kannst Du allerdings dem GPS-Objekt Minimum-Werte mitgeben, die bestimmen, wann der GPS LocationChanged-Event ausgelöst wird:
Start (MinimumTime As Long, MinimumDistance As Float)
Starts listening for events.
MinimumTime - The shortest period (measured in milliseconds) between events. Pass 0 for highest frequency.
MinimumDistance - The shortest change in distance (measured in meters) for which to raise events. Pass 0 for highest frequency.

Wenn Du "MinimumDistance" nun auf >0 Meter einstellst (z.B. auf 10 m), dann wird der GPS LocationChanged-Event nur dann ausgelöst, wenn sich der Standort zweier aufeinanderfolgender GPS-Messungen um mehr als 10 m unterscheidet (Achtung: "MinimumTime" muss aber auf 0 gestellt werden, da die beiden Werte "MinimumDistance" und "MinimumTime" in der Start-Funktion "UND-verknüpft" werden.
Damit hast Du dann praktisch die permanent auch im Stand auftretenden kleinen Messunterschiede "ausgefiltert".
Wenn Du die Zeit zwischen zwei LocationChanged-Events überwachst, kannst Du bei Überschreiten einer gewissen Zeitspanne T (z.B. 2 Sekunden) die Geschwindigkeitsanzeige auf 0,00 Km/h stellen (Bei MinimumDistance=10 und T=2 bedeutet ein Überschreiten dieser Zeitspanne, dass die Geschwindigkeit unter 5 m/sek. gesunken ist).
Mit den Werten MinimumDistance und T kannst Du natürlich "spielen", bis das Egebnis am günstigsten ist.

Die GPS-Fehler selber kann man natürlich nicht beseitigen, aber man kann sie in der Applikation zumindest - wie dargestellt- ein wenig "unterdrücken"

Viele Grüsse
Klaus
 
D

Deleted member 103

Guest
@Knoppi
Vielen Dank für deine Antwort.

@klaus,
vielen Dank für die sehr gute erklärung.

Ich poste hier jetzt mein Beispiel. Was meinst Du Klaus, könnte es so funktionieren?
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

    Dim GPS1 As GPS   
    Dim GPSMinTime As Long      = 0
    Dim GPSMinDistance As Float = 10
    Dim GPSPathPreviuous As Location
    Dim dblTotalDistance As Float

    Dim timerSpeed As Timer
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Private lblSpeedStatus As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("frmMain")

    If FirstTime = True Then
        timerSpeed.Initialize("timerSpeed",2000)
        GPS1.Initialize("GPS1")
    End If

    timerSpeed.Enabled=True

End Sub

Sub Activity_Resume
    If GPS1.GPSEnabled = False Then
        ToastMessageShow("Please enable the GPS device.", True)
        StartActivity(GPS1.LocationSettingsIntent) 'Will open the relevant settings screen.
    Else
        GPS1.Start(GPSMinTime, GPSMinDistance)
    End If
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    If GPS1.GPSEnabled Then
        GPS1.stop
    End If   
End Sub

Sub timerSpeed_Tick
    'Aktuelle Geschwindigkeit auf null setzen
    If lblSpeedStatus.Tag = dblTotalDistance Then
        lblSpeedStatus.Text = "0.00"
    End If
End Sub

Sub GPS_LocationChanged (Location1 As Location)
    Dim locDistance As Float
   
    If Location1.SpeedValid Then
        If Location1.Speed > 0 Then
            If GPSPathPreviuous.Speed > 0 Then
                locDistance = GPSPathPreviuous.DistanceTo(Location1)               

                dblTotalDistance = dblTotalDistance + locDistance
            End If
   
            GPSPathPreviuous = Location1
        End If   
       
        'Aktuelle Geschwindigkeit anzeigen
        lblSpeedStatus.Text = NumberFormat2(Location1.Speed, 1, 2, 2, False)
        lblSpeedStatus.Tag = dblTotalDistance
    End If
End Sub
 

Attachments

  • GPS_Test.zip
    7.3 KB · Views: 364

KlaKoe

Member
Licensed User
Longtime User
Hallo Fillipo
Ja, ich denke, das müsste so funktionieren.

Die Einführung von GPSMinDistance >0 hat in Deinem Programm, wie ich sehen konnte, noch einen zweiten positiven Effekt.
Du ermittelst ja neben der aktuellen Geschwindigkeit auch die insgesamt zurückgelegte Strecke (
dblTotalDistance). Dies hätte mit der ersten Lösung auch nicht richtig funktioniert, da sich durch die (zwar kleinen) GPS-Fehler die Gesamtdistanz auch im Stand laufend vergrössert hätte, da ja locDistance auch im Stand nie Null geworden wäre. Also auch die Distanzmessung wird durch diese "Filterung" wesentlich genauer!

Viele Grüsse
Klaus
 
D

Deleted member 103

Guest
Vielen Dank Klaus, ich werde es heute abend mit dem Auto testen.
 

Knoppi

Active Member
Licensed User
Longtime User
Hallo Filippo,

ich habe am Wochenende leider keine Zeit gehabt, aber wie ich sehe hast Du eine gute Lösung gefunden.
Auf die Idee die Werte MinimumTime und MinimumDistance zu ändern bin ich leider nicht gekommen.
Dafür Danke an Klaus.

viele Grüße
Knoppi
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…