GPS-Modul auslesen


#1

Ich habe ein kleines Testprogramm geschrieben, um das GPS-Modul auszulesen. Leider kommen überhaupt keine Daten an obwohl ich auch zu Testzwecken das Modul ins Freie gelegt habe. Ist das Modul zu unempfindlich oder liegt der Fehler in der Programmierung?
Bei meiner GPS-Maus gelingt der Empfang im Zimmer
Hier mein Programm:

/* GPS-Testprogramm mit Anzeige auf dem  Display
 *  V.0.1 vom 20.4.2020
 */

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "SenseBoxMCU.h"

GPS gps;
float Breite;
float Laenge;
float Hoehe;

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

float latitude;
float longitude;
float height;

void setup() {
  Serial.begin(9600);
  senseBoxIO.powerI2C(true);
delay(2000);
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
display.display();
delay(100);
display.clearDisplay();
gps.begin();

  // Startmeldung Display
display.setCursor(0,0);
display.setTextSize(2);
display.println(" Start");
display.display();
delay(2000);

Serial.println("Start");
delay(5000);

  
}

void loop() {

gps.getGPS();
latitude = gps.getLatitude();
longitude = gps.getLongitude();
height = gps.getAltitude();
Serial.print(" Breite: ");
Serial.println(latitude);
display.clearDisplay();
  Breite = latitude;
  Laenge = longitude;
  Hoehe = height;
    display.clearDisplay();
    display.setCursor(0,0);
    display.setTextSize(1);
    display.setTextColor(WHITE,BLACK);
    display.print("Breite:" );
    display.println(Breite);
    
    display.setTextSize(1);
    display.setTextColor(WHITE,BLACK);
    display.print("Laenge:");
    display.println(Laenge);
    
    display.setTextSize(1);
    display.setTextColor(WHITE,BLACK);
    display.print("Hoehe: ");
    display.println(Hoehe);
    
  display.display();
  delay(5000);

}

#2

Hi @altprog,

versuche mal bitte anstelle des Warte Blocks (delay(5000);) den Messintervall Block zu nutzen.
25
Es kann gut sein, dass das GPS Modul nicht kontinuierlich nach Signalen sucht wenn delay(5000); genutzt wird. Hier (GNSS module: Lat/lon readings always 0.0) hatte jemand das gleiche Problem und konnte es mit dem Messintervall Block lösen.

Viele Grüße
Felix


#3

Hi @Felix

habe gemäß Deinem Rat ein einfaches Testprogramm zu schreiben ohne delay im loop-Teil.
Teils nach der Anleitung im senseBuch zum GPS-Modul, teilweise nach Blockly zur Ausgabe auf dem Display. Habe das ganze mit einer Powerbank draußen auf den Balkon gelegt, nichts immer nur Null.
Hier das testprogramm:

'''/*GPS_simple  Testprogramm für GPS-Modul
V.0.1 vom 28.4.2020

*/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "SenseBoxMCU.h"

const long interval = 5000;
long time_start = 0;
long time_actual = 0;
float lat; // Geografische Breite
float lon; // Geografische Länge
bool debug=0;


#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

GPS gps;
void setup() {
  senseBoxIO.powerI2C(true);
  delay(2000);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
  display.display();
  delay(100);
  display.clearDisplay();
  gps.begin();
  if (debug) {
  Serial.begin(9600);
  }
}  

void loop() {
  time_start = millis();
  if (time_start > time_actual + interval) {
    time_actual = millis();
    lat = gps.getLatitude();
    lon = gps.getLongitude();
    if (debug) {
  Serial.print("Breite: ");
  Serial.println(lat);
  Serial.print("Länge: ");
  Serial.println(lon);
   }
   display.setCursor(0,0);
   display.setTextSize(2);
   display.setTextColor(WHITE,BLACK);
   display.print("Breite: ");
   display.println(lat);
   display.display();
  }
 
}

Ich habe den Eindruck das GPS-Modul macht noch mehr Leuten Schwierigkeiten.
Im Projekt “Mobiler Datenlogger für Feinstaubwerte” taucht eine clevere Modul names smartDelay auf aber wenn ich mir das Modul anschaue, habe ich den Eindruck das GPS-Modul ist dort über die serielle Schnitstelle angesschlossen?

Wo liegt der Hase im Pfeffer?

Gruß Altprog


#4

Hi @altprog,

das Problem ist, dass du nun nur alle 5 Sekunden in der Loop das GPS Modul ausliest.
Probiere mal folgendes Blockly Programm:

In Blockly ist es bereits so gelöst, dass das Modul immer dauerhaft in der Loop ausgelesen und einer Variablen zugewiesen wird. Ich schaue mal, dass ich noch eine Überprüfung einbaue, die verhindert, dass man die GPS Blöcke in Kombination mit dem Delay verwendet.

Beste Grüße
Mario


#5

Danke für die blitzschnelle Antwort.
Kann es sein. dass in dem Sketch nach der Ausgabe der Daten das Display sofort wieder gelöscht wird?
Ich habe mal das Clear display auskommentiert, wohlweislich, dass dann die Werte überschrieben werden, aber so sehe ich wenigsten ob es funktioniert


#6

Ich habe mal im Projekt “Mobiler Datenlogger für Feinstaubwerte (LoRA)” nachgelesen. Da gibt es eine smarte Funktion “smartDelay” die dafür sorgt, dass das Gps-Modul weiter ausgelesen wird.
Wenn ich den Code in mein Testprogramm einbaue, meckert der Compiler, dass es keine Methode gps.encode gibt.
Anscheinend gibt es zwei Librarys GPS und TinyGPS++?