GPS Länge/Breite 0

Liebe Community,

ich hoffe, jemand kann mir mit diesem Problem weiter helfen. Das GPS zeigt auf dem Display stets 0 an. Die ist der Sketch dazu (in Blockly erstellt und in ARDUINO 1.8.18 übertragen - bei Blockly klappte es auch nicht):

#include <senseBoxIO.h>

#include <SPI.h>

#include <Wire.h>

#include <Adafruit_GFX.h> 

#include <Adafruit_SSD1306.h> 

#include <SparkFun_u-blox_GNSS_Arduino_Library.h> 

#include <Adafruit_HDC1000.h>

#include <LTR329.h>

#include <VEML6070.h>

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64

#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

SFE_UBLOX_GNSS myGNSS;

Adafruit_HDC1000 hdc = Adafruit_HDC1000();

bool lightsensortype = 0; //0 for tsl - 1 for ltr

//settings for LTR sensor

LTR329 LTR;

unsigned char gain = 1;

unsigned char integrationTime = 0;

unsigned char measurementRate = 3;

VEML6070 veml;

int read_reg(byte address, uint8_t reg)

  {

    int i = 0;

    Wire.beginTransmission(address);

    Wire.write(reg);

    Wire.endTransmission();

    Wire.requestFrom((uint8_t)address, (uint8_t)1);

    delay(1);

    if(Wire.available())

      i = Wire.read();

    return i;

  }

void write_reg(byte address, uint8_t reg, uint8_t val)

  {

    Wire.beginTransmission(address);

    Wire.write(reg);

    Wire.write(val);

    Wire.endTransmission();

  }

void Lightsensor_begin()

  {

    Wire.begin();

    unsigned int u = 0;

    u = read_reg(0x29, 0x80 | 0x0A); //id register

    if ((u & 0xF0) == 0xA0)            // TSL45315

      {

        write_reg(0x29, 0x80 | 0x00, 0x03); //control: power on

        write_reg(0x29, 0x80 | 0x01, 0x02); //config: M=4 T=100ms

        delay(120);

        lightsensortype = 0; //TSL45315

      }

    else

      {

        LTR.begin();

        LTR.setControl(gain, false, false);

        LTR.setMeasurementRate(integrationTime, measurementRate);

        LTR.setPowerUp(); //power on with default settings

        delay(10); //Wait 10 ms (max) - wakeup time from standby

        lightsensortype = 1;                     //

      }

  }

  uint32_t Lightsensor_getIlluminance()

  {

    unsigned int lux = 0;

    if (lightsensortype == 0) // TSL45315

    {

      unsigned int u = (read_reg(0x29, 0x80 | 0x04) << 0);  //data low

      u |= (read_reg(0x29, 0x80 | 0x05) << 8); //data high

      lux = u * 4; // calc lux with M=4 and T=100ms

    }

    else if (lightsensortype == 1) //LTR-329ALS-01

    {

      delay(100);

      unsigned int data0, data1;

      for (int i = 0; i < 5; i++) {

        if (LTR.getData(data0, data1)) {

          if(LTR.getLux(gain, integrationTime, data0, data1, lux));

          if(lux > 0) break;

          else delay(10);

        }

        else {

        byte error = LTR.getError();

      }

    }

  }

  return lux;

  }

float getSMT50Moisture(int analogPin){

   int sensorValue = analogRead(analogPin);

    float voltage = sensorValue * (3.3 / 1024.0);

   return (voltage * 50) / 3;

}

void setup() {

senseBoxIO.powerI2C(true);

delay(2000);

display.begin(SSD1306_SWITCHCAPVCC, 0x3D);

display.display();

delay(100);

display.clearDisplay();

 Wire.begin();

  if (myGNSS.begin() == false) //Connect to the Ublox module using Wire port

  {

    Serial.println(F("Ublox GPS not detected at default I2C address. Please check wiring. Freezing."));

    while (1);

  }

  myGNSS.setI2COutput(COM_TYPE_UBX); //Set the I2C port to output UBX only (turn off NMEA noise)

  myGNSS.saveConfiguration(); //Save the current settings to flash and BBR

hdc.begin();

Lightsensor_begin();

veml.begin();

}

void loop() {

  display.setCursor(0,0);

  display.setTextSize(1);

  display.setTextColor(WHITE,BLACK);

  display.println((String("Breite") + String(myGNSS.getLatitude())));

  display.setCursor(0,9);

  display.setTextSize(1);

  display.setTextColor(WHITE,BLACK);

  display.println((String("Laenge") + String(myGNSS.getLongitude())));

  display.setCursor(60,9);

  display.setTextSize(1);

  display.setTextColor(WHITE,BLACK);

  display.println((String("H(m)") + String(myGNSS.getAltitudeMSL())));

  display.setCursor(0,18);

  display.setTextSize(1);

  display.setTextColor(WHITE,BLACK);

  display.println((String("T(C:)") + String(hdc.readTemperature())));

  display.setCursor(0,27);

  display.setTextSize(1);

  display.setTextColor(WHITE,BLACK);

  display.println((String("rF(%):") + String(hdc.readHumidity())));

  display.setCursor(0,36);

  display.setTextSize(1);

  display.setTextColor(WHITE,BLACK);

  display.println((String("Lux:") + String(Lightsensor_getIlluminance())));

  display.setCursor(0,45);

  display.setTextSize(1);

  display.setTextColor(WHITE,BLACK);

  display.println((String("UV:") + String(veml.getUV())));

  display.setCursor(60,45);

  display.setTextSize(1);

  display.setTextColor(WHITE,BLACK);

  display.println((String("BrF(%)") + String(getSMT50Moisture(6))));

display.display();

display.clearDisplay();

}

Die Höhenangabe liefert nur Quatsch -17000. Die anderen Sensoren verrichten ihre Arbeit.
Die RTC funktioniert ebenso nicht - stellt sich nach dem Trennen der Energieversorgung des Boards immer wieder zurück auf ein Datum in 2023. Die RTC habe ich jetzt aber mal rausgelassen.

Viele Grüße
Jens

Moin @Jens_Binne, das GPS ist bei uns auch leider dafür bekannt mal lange zu brauchen, bis es zum ersten Mal einen Fix (also die korrekte Position) bekommt. Ich gehe mal davon aus, dass Dein Modul einfach sehr lange braucht um einmal in Gang zu kommen. Das mit der RTC ist allerdings seltsam, da müsste ich hier nochmal testen warum die nicht will. Versuch mal dein GPS über ein paar Stunden draußen unter freiem Himmel zu lassen, evtl bekommt es dann eine Position.

Vielen Dank für deine Antwort PaulReichmuth,

die RTC kriege ich nicht in Gang bzw. die Zeit wird einfach nicht auf der RTC gespeichert.

Das GPS kann ich über diesen Sketch abrufen. KI hat geholfen. Leider ist es mir bisher nicht gelungen, ihn via blockly nachzubilden. Und ich habe das Problem auch nicht hinreichend verstanden.

Warum geht das jetzt? Wie kann ich es via blockly nachbilden?

Viele Grüße

#include <senseBoxIO.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SparkFun_u-blox_GNSS_Arduino_Library.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
SFE_UBLOX_GNSS myGNSS;

unsigned long lastUpdateTime = 0;
const unsigned long updateInterval = 1000; // Aktualisierungsintervall in Millisekunden
const unsigned long gpsTimeout = 300000; // Timeout für den GPS-Fix in Millisekunden (5 Minuten)

void setup() {
senseBoxIO.powerI2C(true);
delay(2000);

Wire.begin();

// Initialisiere das Display
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(„Initialisierung…“);
display.display();

// Initialisiere das GPS-Modul
if (myGNSS.begin() == false) {
Serial.println(F(„Ublox GPS nicht am Standard-I2C-Adress gefunden. Bitte überprüfe die Verkabelung. Programm wird gestoppt.“));
while (1);
}
}

void loop() {
// Überprüfe, ob das GPS-Fix erhalten wurde
if (!myGNSS.getGnssFixOk()) {
// Warte auf gültige GPS-Daten
unsigned long startTime = millis(); // Startzeit erfassen
while (!myGNSS.getGnssFixOk()) {
delay(1000); // Verzögerung von 1 Sekunde
if (millis() - startTime > gpsTimeout) { // Wenn mehr als 5 Minuten vergangen sind
Serial.println(F(„Timeout beim Warten auf GPS-Fix. Fortfahren ohne Fix.“));
break; // Aus der Schleife ausbrechen und ohne Fix fortfahren
}
}
}

// Aktualisiere die Anzeige mit den GPS-Daten
if (millis() - lastUpdateTime >= updateInterval) {
float latitude = myGNSS.getLatitude();
float longitude = myGNSS.getLongitude();

display.clearDisplay();
display.setCursor(0, 0);
display.print("Breite: ");
display.println(latitude, 6);
display.setCursor(0, 10);
display.print("Länge: ");
display.println(longitude, 6);
display.display();

lastUpdateTime = millis(); // Speichern der Zeit der letzten Aktualisierung

}
}

Liebe Community,

mittlerweile konnte ich das Problem auch via blockly beheben, indem ich schlicht den clearDisplay-Befehl, den blockly in der Grundstruktur mit vorgegeben hatte, rausgenommen habe.

Nun funktionieren Längen- und Breitenangabe korrekt (für die Höhe kann ich das noch nicht beurteilen), wenngleich leider nur in Form der Dezimalangabe. Eine Umsetzung Grad, Bogenminuten und Bogensekunden ist mir bislang nicht gelungen.

Zudem geht die Uhr um zwei Stunden falsch. Wie bekomme ich das behoben?

Viele Grüße
Jens