Bin absoluter Anfänger und bin gerade dabei mir die ganze Sache anzuschauen und zu erlernen.
Zum Testaufbau Arduino UNO mit einem GPS-Modul (neo m6) über RC TX verbunden und ein LCD-Display über I2C verbunden.
Jetzt zu meinem Problem wo mir das Wissen fehlt.
Frage 1.
Wenn keine GPS Daten vorhanden sind (z.B. kein Empfang) soll auf dem Display ein Text ("kein GPS-Signal") ausgegeben werden.
Frage 2.
Wenn "lcd.print(">70");" und "lcd.print(">100");" einmal geschrieben sind bleiben die auf dem Display stehen, auch wenn die if Bedingungen (z.B. if (gps.speed.kmph() >= 70)) nicht mehr erfüllt sind. Gibt es da ein einfachen weg?
danke für eure Zeit
// binde die Bibliothek SoftwareSerial ein
#include <SoftwareSerial.h>
// binde die Bibliothek TinyGPS++ ein
#include <TinyGPS++.h>
// binde die Bibliothek Wire für I2C-Bus ein
#include <Wire.h>
// binde die Bibliothek LiquidCrystal_I2C für das LCD Display ein
#include <LiquidCrystal_I2C.h>
// legt die Eigenschaften vom LCD Display fest. 0x27 = I2C Adresse vom LCD Display , 16 = Zeichen pro Zeile möglich , 4 = Anzahl der Zeilen vom Display
LiquidCrystal_I2C lcd(0x27,16,2);
// definiert einen TinyGPSPlus Typ mit dem Name gps.
TinyGPSPlus gps;
// definiert einen SoftwareSerial Typ mit dem Name ss und difiniert die Pins für 4(Rx) aund 3(Tx)
SoftwareSerial ss(3 ,4);
byte antenne[8] =
{
0b00100,
0b10101,
0b01010,
0b00100,
0b00100,
0b00100,
0b00100,
0b00100
};
void setup()
{
// datenrate für den Serial Schnittstelle z.B. SerialMonitor
Serial.begin(9600);
// datenrate für den Serial Schnittstelle des GPS-Empfänger
ss.begin(9600);
// LCD initialisieren
lcd.init();
// Hintergrundlicht einschalten
lcd.backlight();
// LCD Inhalt löschen
lcd.clear();
lcd.createChar(0, antenne);
}
void loop()
{
if (ss.available() > 0)
{
gps.encode(ss.read());
if (gps.location.isUpdated())
{
Serial.print("LAT="); Serial.println(gps.location.lat(), 6);
Serial.print("LONG="); Serial.println(gps.location.lng(), 6);
Serial.print("km/h"); Serial.println(gps.speed.kmph());
lcd.setCursor(0,0);
lcd.write(byte(0));
lcd.setCursor(2,0);
lcd.print(gps.speed.kmph());
lcd.print("km/h");
if (gps.speed.kmph() >= 50)
{
lcd.setCursor(0,1);
lcd.print(">50");
}
else
{
lcd.setCursor(0,1);
lcd.print("50<");
}
if (gps.speed.kmph() >= 70)
{
lcd.setCursor(4,1);
lcd.print(">70");
}
if (gps.speed.kmph() >= 100)
{
lcd.setCursor(8,1);
lcd.print(">100");
}
}
}
}
In der Regel kommen die GPS-Daten im NMEA-Format an. Da gibt es Beispielsweise die $GPGGA-Zeichenfolge, an 4. Stelle kommt di "Fix quality". Kann man bspw. hier schön nachlesen: https://www.gpsinformation.org/dale/nmea.htm#GGA. Abfrage auf 0 heißt also kein gültiges GPS-Signal.
[edit] Oder man holt es sich aus dem $GPGSA: Dort wird noch nach "no fix, "2D-fix" und "3D-fix" unterschieden.
Tommy56:
Das ist doch einfach.
Woran erkenns Du, dass kein Signal da ist? Ich habe kein GPS-Modul.
Gruß Tommy
]
Wenn kein Signal mehr anliegt. Aber wie prüfe ich dieses.
sth77:
In der Regel kommen die GPS-Daten im NMEA-Format an. Da gibt es Beispielsweise die $GPGGA-Zeichenfolge, an 4. Stelle kommt di "Fix quality". Kann man bspw. hier schön nachlesen: https://www.gpsinformation.org/dale/nmea.htm#GGA. Abfrage auf 0 heißt also kein gültiges GPS-Signal.
[edit] Oder man holt es sich aus dem $GPGSA: Dort wird noch nach "no fix, "2D-fix" und "3D-fix" unterschieden.
Abfrage auf Null hatte ich auch gedacht aber es ging nicht oder jedenfals so ich es gedacht habe.
(if (ss.available() == 0))
noiasca:
dann wirf mal einen Blick in das BasicExample der Library. Da wirst du so etwas finden:
Ok werde es mal mit " if (gps.location.isValid()) " Probieren.
Habe auch ein blick in die Bibliothek geworfen aber mit ein Kenntnisstand habe ich da nicht viel von verstanden.
Was macht der die " gps.location.isValid " beziehungsweise " .isValid " genau?
Gibt es eine Liste mit den ganzen Befehlen und Erklärung zur TinyGPSPlus Bibliothek.
Noch Mal zum Display:
Das LCD ist ein eigenständiger Kontroller - Der bekommt vom Arduino nur gesagt 'Setze den Cursor auf 3/1' und 'Male Da ein H hin'.
Wen nder Arduino keine weiteren Befehle zum Display schickt, macht das Display 'Sein Ding' - also sich um die Anzeige kümmern (der µC Da drauf hat also durchaus was zu tun) - Er ändert aber NICHTS an der Anzeige, solange Du (über den Arduino) Das nicht befiehlst.
So ist Das mit ziemlich vielen Dingern, Die man am Arduino anstöpseln kann - fast überall stecken eigene µC drin und der Arduino schwätzt 'nur' mit Diesen - was Die dann daraus machen ... liegt an Deren Programm.
Auch musst Du nicht in jedem loop()-Durchlauf, wo kein GPS-Empfang statt fand (ist eh nur alle 2 Sekunden so) das Display aktualisieren, also 'kein GPS' brauchst Du nur 1x hinschreiben, wenn kein GPS vorhanden ist und wir diese Information NOCH NICHT auf das Display gepinnt haben (wir müssen uns also merken, daß wir Das geschrieben haben, damit wir Das nicht erneut schreiben).
Noch Mal zum Display:
Das LCD ist ein eigenständiger Kontroller - Der bekommt vom Arduino nur gesagt 'Setze den Cursor auf 3/1' und 'Male Da ein H hin'.
Wen nder Arduino keine weiteren Befehle zum Display schickt, macht das Display 'Sein Ding' - also sich um die Anzeige kümmern (der µC Da drauf hat also durchaus was zu tun) - Er ändert aber NICHTS an der Anzeige, solange Du (über den Arduino) Das nicht befiehlst.
So ist Das mit ziemlich vielen Dingern, Die man am Arduino anstöpseln kann - fast überall stecken eigene µC drin und der Arduino schwätzt 'nur' mit Diesen - was Die dann daraus machen ... liegt an Deren Programm.
Auch musst Du nicht in jedem loop()-Durchlauf, wo kein GPS-Empfang statt fand (ist eh nur alle 2 Sekunden so) das Display aktualisieren, also 'kein GPS' brauchst Du nur 1x hinschreiben, wenn kein GPS vorhanden ist und wir diese Information NOCH NICHT auf das Display gepinnt haben (wir müssen uns also merken, daß wir Das geschrieben haben, damit wir Das nicht erneut schreiben).