Okay, here we go.
I think i just need a loop that reads the GPS data until it gets a valid sentence
and then it can move on.
There must be something wrong with this while loop that i have.
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Adafruit_STMPE610.h>
#include <TinyGPS++.h>
#include <SPI.h>
#include <Wire.h>
#include <avr/pgmspace.h>
// Erstelle Objekte
Adafruit_STMPE610 ts = Adafruit_STMPE610(44);
Adafruit_ILI9341 tft = Adafruit_ILI9341(45,46);
TinyGPSPlus gps;
// Interface Variablen
int battPower = 100;
int batteryChange = 0;
int GPSSatChange = 0;
int GPSErrChange = 0;
// Serial Communication Variablen
char serialInData[10];
int serialIndex;
boolean serialStarted = false;
boolean serialEnded = false;
// GPS Variablen
float latitude;
float longitude;
float aSeaLevel;
int UTCDay;
int UTCMonth;
int UTCYear;
int UTCHour;
int UTCMinute;
int UTCSecond;
boolean validGPS = false;
int timeout;
// Sprite Grafiken
//Batterie Icons
const unsigned char BattFrame [] PROGMEM = {
Hidden
};
const unsigned char BattBar_1 [] PROGMEM = {
Hidden
};
const unsigned char BattBar_2 [] PROGMEM = {
Hidden
};
const unsigned char BattBar_3 [] PROGMEM = {
Hidden
};
const unsigned char BattBar_4 [] PROGMEM = {
Hidden
};
const unsigned char BattBar_5 [] PROGMEM = {
Hidden
};
const unsigned char BattBar_6 [] PROGMEM = {
Hidden
};
const unsigned char BattBar_7 [] PROGMEM = {
Hidden
};
const unsigned char BattBar_8 [] PROGMEM = {
Hidden
};
// GPS Icons
const unsigned char GPSBar_1 [] PROGMEM = {
Hidden
};
const unsigned char GPSBar_2 [] PROGMEM = {
Hidden
};
const unsigned char GPSBar_3 [] PROGMEM = {
Hidden
};
const unsigned char GPSBar_4 [] PROGMEM = {
Hidden
const unsigned char GPSBar_5 [] PROGMEM = {
Hidden
};
const unsigned char GPSBar_6 [] PROGMEM = {
Hidden
};
const unsigned char GPSBar_clear [] PROGMEM = {
Hidden
};
void setup() {
tft.begin();
tft.fillScreen(ILI9341_WHITE);
tft.setRotation(1);
tft.fillRect(0,0,320,26,ILI9341_BLACK);
tft.drawBitmap(260,1,GPSBar_1,24,24,ILI9341_WHITE);
tft.setTextWrap(false);
tft.setTextColor(ILI9341_BLACK,ILI9341_WHITE);
tft.setTextSize(1);
Serial.begin(9600);
Serial1.begin(38400); // Standard Baud Rate des iTead GPS Shield
Serial1.print("$PUBX,41,1,0007,0003,4800,0*13\r\n"); // Ändern der iTead Baud Rate
Serial1.flush();
delay(50);
Serial1.begin(4800); // Reset Serial Baud Rate
Serial1.flush();
delay(500);
}
void loop() {
battPower = serialCom(battPower);
batteryStatus();
GPSStatus ();
GUIUpdate();
//deBug ();
}
// Funktionen
int serialCom (int battPower){
while(Serial.available() > 0)
{
char aChar = Serial.read();
if(aChar == '<')
{
serialStarted = true;
serialIndex = 0;
serialInData[serialIndex] = '\0';
}
else if(aChar == '>')
{
serialEnded = true;
}
else if(serialStarted)
{
serialInData[serialIndex] = aChar;
serialIndex++;
serialInData[serialIndex] = '\0';
}
}
if(serialStarted && serialEnded)
{
// Convert the string to an integer
int serialInput = atoi(serialInData);
battPower = serialInput;
Serial.print("Eingabe war: ");
Serial.println(serialInput);
Serial.print("Batterie: ");
Serial.println(battPower);
// Get ready for the next time
serialStarted = false;
serialEnded = false;
serialIndex = 0;
serialInData[serialIndex] = '\0';
}
return battPower;
}
void batteryStatus (){
if (batteryChange != battPower){
tft.drawBitmap(298,9,BattBar_8,24,16,ILI9341_BLACK);{tft.drawBitmap(298,9,BattFrame,24,16,ILI9341_WHITE); }
if (battPower >= 1 && battPower <= 12) {tft.drawBitmap(298,9,BattBar_1,24,16,ILI9341_RED); }
if (battPower >= 13 && battPower <= 25) {tft.drawBitmap(298,9,BattBar_2,24,16,ILI9341_WHITE); }
if (battPower >= 26 && battPower <= 37) {tft.drawBitmap(298,9,BattBar_3,24,16,ILI9341_WHITE); }
if (battPower >= 38 && battPower <= 50) {tft.drawBitmap(298,9,BattBar_4,24,16,ILI9341_WHITE); }
if (battPower >= 51 && battPower <= 62) {tft.drawBitmap(298,9,BattBar_5,24,16,ILI9341_WHITE); }
if (battPower >= 63 && battPower <= 75) {tft.drawBitmap(298,9,BattBar_6,24,16,ILI9341_WHITE); }
if (battPower >= 76 && battPower <= 87) {tft.drawBitmap(298,9,BattBar_7,24,16,ILI9341_WHITE); }
if (battPower >= 88 && battPower <= 100){tft.drawBitmap(298,9,BattBar_8,24,16,ILI9341_WHITE); }
batteryChange = battPower;
}
}
void GPSStatus (){
while (Serial1.available() >0) // <----- Here is the Problem!!
{ // Maybe a loop that reads until a valid sentence is received?
gps.encode(Serial1.read());
}
if (Serial.available()==0)
{
timeout++;
}
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected!"));
while(true);
}
latitude = gps.location.lat();
longitude = gps.location.lng();
aSeaLevel = gps.altitude.meters();
UTCDay = gps.date.day();
UTCMonth = gps.date.month();
UTCYear = gps.date.year();
UTCHour = gps.time.hour();
UTCMinute = gps.time.minute();
UTCSecond = gps.time.second();
}
void GUIUpdate(){
// Location
if (gps.location.isValid() && gps.location.isUpdated()) // VALID Location ?
{
tft.setCursor(5, 40);
tft.print("Lat : ");
tft.print(latitude, 6);
tft.print(" ");
tft.setCursor(5, 50);
tft.print("Long : ");
tft.print(longitude, 6);
tft.print(" ");
tft.setCursor(5, 60);
tft.print("Level: ");
tft.print(aSeaLevel);
tft.print(" ");
GPSErrChange == 0;
}
// Date
if (gps.date.isValid() && gps.date.isUpdated())
{
tft.setCursor(5, 70);
tft.print("Date : ");
tft.print(UTCDay);
tft.print(".");
tft.print(UTCMonth);
tft.print(".");
tft.print(UTCYear);
tft.print(" ");
GPSErrChange == 0;
}
// Time
if (gps.time.isValid() && gps.time.isUpdated())
{
tft.setCursor(5, 80);
tft.print("Time : ");
tft.setCursor(5, 80);
tft.print("Time : ");
if (UTCHour < 10) tft.print("0");
tft.print(UTCHour);
tft.print(":");
if (UTCMinute < 10) tft.print("0");
tft.print(UTCMinute);
tft.print(":");
if (UTCSecond < 10) tft.print("0");
tft.print(UTCSecond);
GPSErrChange == 0;
}
if (GPSSatChange != gps.satellites.value()){ // Update HUD Satellite Icon
tft.drawBitmap(260,1,GPSBar_clear,24,24,ILI9341_BLACK);
if (gps.satellites.value() == 0 ) {tft.drawBitmap(260,1,GPSBar_1,24,24,ILI9341_WHITE); }
if (gps.satellites.value() >= 1 && gps.satellites.value() <= 2) {tft.drawBitmap(260,1,GPSBar_2,24,24,ILI9341_WHITE); }
if (gps.satellites.value() >= 3 && gps.satellites.value() <= 4) {tft.drawBitmap(260,1,GPSBar_3,24,24,ILI9341_WHITE); }
if (gps.satellites.value() >= 5 && gps.satellites.value() <= 6) {tft.drawBitmap(260,1,GPSBar_4,24,24,ILI9341_WHITE); }
if (gps.satellites.value() >= 7 && gps.satellites.value() <= 9) {tft.drawBitmap(260,1,GPSBar_5,24,24,ILI9341_WHITE); }
if (gps.satellites.value() >= 10 ) {tft.drawBitmap(260,1,GPSBar_6,24,24,ILI9341_WHITE); }
tft.setCursor(5, 30); // Update Satellites Info
tft.print("Satellites: ");
tft.print(gps.satellites.value());
tft.print(" ");
GPSSatChange = gps.satellites.value();
}
if (GPSErrChange == 0 && gps.satellites.value() == 0) { // INVALID GPS DATA TFT DISPLAY (Once)
tft.setCursor(5, 30); // Update Satellites Info
tft.print("Satellites: No Signal!");
tft.setCursor(5, 40);
tft.print("Lat : --.------");
tft.setCursor(5, 50);
tft.print("Long : --.------");
tft.setCursor(5, 60);
tft.print("Level: --.------");
GPSErrChange = 1;
}
}
void deBug (){
tft.setCursor(5, 140);
tft.print("------- Debugging -------");
tft.setCursor(5, 170);
tft.print("Error Switch: ");
tft.print(GPSErrChange);
tft.setCursor(5, 180);
tft.print("Satellites : ");
tft.print(gps.satellites.value());
tft.setCursor(5, 190);
tft.print("Chars proc : ");
tft.print(gps.charsProcessed());
tft.setCursor(5, 200);
tft.print("Sent w Fix : ");
tft.print(gps.sentencesWithFix());
tft.setCursor(5, 210);
tft.print("Failed Check: ");
tft.print(gps.failedChecksum());
tft.setCursor(5, 220);
tft.print("Passed Check: ");
tft.print(gps.passedChecksum());
tft.setCursor(150, 170);
tft.print("Serial1 read: ");
tft.print(Serial1.read());
tft.print(" ");
tft.setCursor(150, 180);
tft.print("Seria1 avail: ");
tft.print(Serial1.available(),DEC);
tft.print(" ");
tft.setCursor(150, 190);
tft.print("Timeouts : ");
tft.print(timeout);
tft.print(" ");
}