Go Down

Topic: GPS Funktioniert nicht im Switch case? (Read 370 times) previous topic - next topic

Soulfly

Apr 19, 2019, 05:31 pm Last Edit: Apr 19, 2019, 06:01 pm by Soulfly
Hey Leute,

habe folgendes Problem: ich will die geschwindigkeit eines GPS sensors fortlaufend in einem display anzeigen...

ich hatte den alten code bereits laufen und es lief eigentlich ordentlich da ich nur einen screen hatte...

jetzt habe ich eine switchcase struktur darum aufgebaut um zwischen den verschiedenen bildschirmen hin und her zu schalten das funktioniert ohne weitere strukur auch super das problem ist nun allerdings das wenn ich nun versuche TinyGPS einzubinden in die case struktur (also innerhalb des falles ) passiert irgendwie quasi nichts... die bilddschirme lassen sich hin und her schalten allerdings werden im bildschirm die daten des gps nicht angezeigt...


Liegt es irgendwie and dem break der case struktur oder warum kann er die daten nicht anzeigen? sobald ich das alte (funktionierende programm) aufspielt funktioniert es ohne probleme

https://pastebin.com/LemDkvix

Hier der Code

Code: [Select]
    case 1: //Home screen with values

      tft.drawRect(170,200, 50, 40,GREEN); //draw selected Mode1

               if (Serial1.available())
     {
     
        gps.encode(Serial1.read());
       
        if (gps.location.isUpdated())//when gps fix is stable
        {
              //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~GPS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         
            Serial.println(gps.speed.kmph()); // Speed in kilometers per hour (double!) 
 
         
              //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Time~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            unsigned long startm1, finishedm1, elapsedm1;
            int s = 0;
            int ms = 0;
            unsigned long overm1;



      tft.setCursor(0, 30);         
      tft.setTextColor(WHITE);
      tft.setTextSize(3);
      tft.setCursor(155, 30);
        tft.setTextColor( GREEN , BLACK);
        tft.println(gps.speed.kmph(), 1);
      tft.println("");
      tft.setTextSize(2);
      tft.setCursor(180, 77);
      tft.println("s++ms");
      tft.println("");
      tft.setCursor(180, 110);
      tft.println("difference, 2");
      tft.println("");
      tft.setCursor(180, 142);
      tft.println("X.XX");
      tft.println("");
        }
        }
 
   break;

wapjoe

#1
Apr 19, 2019, 05:57 pm Last Edit: Apr 19, 2019, 06:03 pm by wapjoe
Wo ist der Sketch? Bitte deinen Code mit Code-Tags [*code][*/code] oder über die Schaltfläche </> einbinden. Hat sich erledigt.

Soulfly

Editiert ...der ganze code würde glaube ich den ramen sprengen kann ich im falle des falles aber auch posten... letzten endes hängt es aber an der stelle die gps.kmph anzuzeigen irgendwie macht er das nicht...

HotSystems

Editiert ...der ganze code würde glaube ich den ramen sprengen kann ich im falle des falles aber auch posten... letzten endes hängt es aber an der stelle die gps.kmph anzuzeigen irgendwie macht er das nicht...
Du solltest den kompletten Sketch posten, mit dem Fragment ist nichts anzufangen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Soulfly

#4
Apr 19, 2019, 07:47 pm Last Edit: Apr 19, 2019, 08:40 pm by Soulfly
https://pastebin.com/CUGfqNft


leider sprengt er hier den rahmen deswegen pastebin

Edit: habe es eben mit nem einfachen millis getstet der durch den gps wert ersetzt wurde... er geht irgendwie nur einmal in den case und schreibt dann den wert statisch aufs display... da muss es doch nen anderen weg geben ?
Hab irgendwie grade nen knoten im kopf :v

Edit2: Hab jetzt  die komplette switch case struktur mal raus geschmissen... durch eine einzige if - Bedingung ( if (Mode ==1) )ersetzt und fakt ist irgendwie das der override befehl irgendwie nicht funktionieren will.... er geht immer wieder in die schleife rein die den wert anzeigen soll - mittlerweile erhöhe ich sogar einfacch nur ne int varibale bei durchlauf - aber ändert ihn auf dem display iregendwie ums verrecken nicht.... ich weiss ehrlich gesagt nicht wieso :/ selbst ein delay mal in die schleife reingemacht da ich erst dachte das das display einfach nicht hinterher kommt aber trotzdem will er nicht...

Tommy56

Wenn er zu gross ist, dann hänge ihn bitte als Attachment an. Auf den anderen Servern wird er irgendwann gelöscht und dann fehlen hier die Infos.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Soulfly


HotSystems

Was passiert, wenn du statischen Text in der Case anzeigen willst ?
Ich vermute, deine Abfrage landet immer nur sehr kurz in der Case und springt gleich wieder raus, da sich der Inhalt in Mode geändert hat.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Soulfly

#8
Apr 19, 2019, 10:46 pm Last Edit: Apr 19, 2019, 10:48 pm by Soulfly
ja das dachte ich mittlerweile auch... aber ich hab mittlerweile den kompletten case rauskommentiert und durch ein einzlenes if ersetzt das de  mode auf 1 abfragt ... hier geht es ja trotzdem in die if rein und ändert den wert aber schreibt es irgendwie nicht ins display :/

HotSystems

ja das dachte ich mittlerweile auch... aber ich hab mittlerweile den kompletten case rauskommentiert und durch ein einzlenes if ersetzt das de  mode auf 1 abfragt ... hier geht es ja trotzdem in die if rein und ändert den wert aber schreibt es irgendwie nicht ins display :/
Dann solltest du zumindest testweise den Wert in der Loop in eine globale Variable schreiben und diesen dann in der Case auf das Display übertragen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Soulfly

tatsächlich tue ich dies mit der bereits vordefinierten difference variable
die global ist. :/

HotSystems

tatsächlich tue ich dies mit der bereits vordefinierten difference variable
die global ist. :/
Dann solltest du das unbedingt nochmal überprüfen.

Ich kann nicht erkennen, wo du im "aktiven" Sketch diese Variable in der Loop füllst.
Oder zeigst du uns einen falschen Sketch ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Soulfly

#12
Apr 20, 2019, 05:24 pm Last Edit: Apr 20, 2019, 06:08 pm by Soulfly
So ich habe nochmals den code raus gekramt bei dem es einfach so funktionier der ist auch wesentlich kürzer als der den ich geostet habe...
Code: [Select]
#include <TinyGPS++.h>
#include <Elegoo_GFX.h>    // Core graphics library
#include <Elegoo_TFTLCD.h> // Hardware-specific library

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD:
// For the Arduino Uno, Duemilanove, Diecimila, etc.:
//   D0 connects to digital pin 8  (Notice these are
//   D1 connects to digital pin 9   NOT in order!)
//   D2 connects to digital pin 2
//   D3 connects to digital pin 3
//   D4 connects to digital pin 4
//   D5 connects to digital pin 5
//   D6 connects to digital pin 6
//   D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).

// Assign human-readable names to some common 16-bit color values:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

#define TEXT_COLOR_GR GREEN     // Zur Vermeidung des Ziffern überschreibens nötig!
#define TEXT_COLOR_W WHITE      // Zur Vermeidung des Ziffern überschreibens nötig!
//------------------------------------------GPS--------------------------------------

TinyGPSPlus gps;
Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// If using the shield, all control and data lines are fixed, and
// a simpler declaration can optionally be used:
// Elegoo_TFTLCD tft;

int test=0;                         //<----------------------------------------------------------------

//---------------------------------------------------------------------------------------------
void setup() {
 Serial.begin(9600);

 Serial1.begin(9600);

#ifdef USE_Elegoo_SHIELD_PINOUT
 Serial.println(F("Using Elegoo 2.8\" TFT Arduino Shield Pinout"));
#else
 Serial.println(F("Using Elegoo 2.8\" TFT Breakout Board Pinout"));
#endif

 Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());

 tft.reset();

 uint16_t identifier = tft.readID();
    identifier=0x9341;
 if(identifier == 0x9325) {
   Serial.println(F("Found ILI9325 LCD driver"));
 } else if(identifier == 0x9328) {
  Serial.println(F("Found ILI9328 LCD driver"));
 } else if(identifier == 0x7575) {
   Serial.println(F("Found HX8347G LCD driver"));
 } else if(identifier == 0x9341) {
   Serial.println(F("Found ILI9341 LCD driver"));
 } else if(identifier == 0x8357) {
   Serial.println(F("Found HX8357D LCD driver"));
 } else {
   Serial.print(F("Unknown LCD driver chip! pls check wiring! "));

   return;
 }

 tft.begin(identifier);

 Serial.println(F("Done!"));
 tft.setRotation(3);
 tft.fillScreen(BLACK);     // Zur Vermeidung des Ziffern überschreibens nötig!
 tft.setCursor(0, 0);
 tft.setTextColor(WHITE);
 tft.setTextSize(3);
 tft.println("Speed");
 tft.println("");
 tft.println("Time ");
 tft.println("");
 tft.println("Difference");
 tft.println("");
 tft.println("Distance");
 tft.println("");
 tft.setCursor(270, 145);
 tft.setTextColor(WHITE);
 tft.println("KM");
 

}

void loop() {


          tft.setTextColor( TEXT_COLOR_GR , BLACK);  
          tft.setCursor(250, 0);
          tft.println(test++); <---------------------------------------------------------------------------
          tft.setCursor(250, 50);
          tft.println();
          tft.setCursor(250, 100);
          tft.println();
        }



Hier läuft der wert permanent auf dem display durch

den code oben habe ich jetzt nochmal komplett auf ohne gps umgebaut und genauso umgeschrieben aber es funktioniert irgendwie einfach nicht...


Habe ebenfalls noch pfeile dazuefügt das man sieht welche variable (test) ich meine

Edit:ok habe einen kleinen fehler gefunden warum er nur einmal durchlief... lag daran das das nur bei druck aufs display getan hat... das eigentliche problem scheint aber nicht daran zu liegen... es ist wie als würde er das tft.prinln total ignorieren... hab die selbe kette mit einem if nochmal drunter programmiert .... er zählt nach wie vor den wert ordnungsgemäß nun auch außerhalb der switch case struktur hoch aber überschreibt den wert nicht... und das obwohl das hochzählen des wertes in dem tft.pintln passiert

Soulfly

Servus,

habs zum laufen gekriegt

http://forum.arduino.cc/index.php?topic=509705.0

siehe hier habe vergessen die pins zu refreshen deswegen kamen die befehle nicht am display an

Go Up