Display sekundenuntauglich - wer bremst meine Idee???

Hallo zusammen,

ein Mega2560 R3 steuert ein 3,2" TFT an (über die zweireihige Buchsenleiste).

Geplant war eine Uhr mit abzubilden.

Problem -> der Zyklus des Arduino beträgt 6ms - wenn er weder GPS noch LCD bearbeiten muss.

Für GPS kommen ca. 1Sekunde (bedingt durch ein Smartdelay von 1000ms)
für das LCD ganze 2 Sekunden dazu.
Eine Uhr mit Sekundenanzeige funktioniert also nicht.
Versuche mit gestaffelter Übertragung der Displaydaten haben zwar den Zyklus auf knappe 700ms gebracht, aber das reicht auch noch nicht aus.

ich komme in dem Projekt auch ohne Sekundenanzeige aus, aber mich würde trotzdem interessieren wer mich hier jetzt ausbremst? Ist es der Arduino der einfach für die Übertragung diese Zeit benötigt, oder liegt es am Display welches nicht schneller kann.
Wäre eine alternative Datenübertragung möglich die schneller wäre (unabhängig von meinem Display)?

Viele Grüße
Oliver

BullSimons:
Für GPS kommen ca. 1Sekunde (bedingt durch ein Smartdelay von 1000ms)

Was ist daran smart?

Ohne Deinen Sketch bleiben da nur Spekutationen.

Du kannst auch eine Uhr als Zähler laufen lassen, die Du mittels GPS synchronisierst. Oder Du nimmst eine RTC wie DS3231, die übers Jahr nur wenige Sekunden Abweichung hat und stellst diese mittels GPS einmal am Tag. DS3231 kannst Du sekündlich auslesen.

Hallo,
das ist ohne Sketch (in CodeTag´s, oben links, Editor) schlecht zu sagen.
GPS und SekundenAnzeige geht ohne Probleme. Der GPS läuft ja unabhängig, und
wirft alle Sekunde seine Sätze raus. Der Arduino braucht aber bei weitem nicht
eine Sekunde um diese zu lesen und zu verarbeiten.

In das TFT würde ich nur schreiben wenn sich etwas ändert, und dann auch nur
das- neu schreiben, was sich geändert hat.
Du hast Dich da verzettelt.
Gruß und Spaß
Andreas

Danke für die Antworten!

Whandall:
Was ist daran smart?

Keine Ahnung - das war im Beispielsketch drin. Man kann es auch auf gute 500ms kürzen und es funktioniert trotzdem. Es gibt auch Varianten ohne das Smartdelay, aber ich wollte zuerst nach dem Display schauen, weil das der Verursacher ist.

agmue:
Ohne Deinen Sketch bleiben da nur Spekutationen.

Du kannst auch eine Uhr als Zähler laufen lassen, die Du mittels GPS synchronisierst. Oder Du nimmst eine RTC wie DS3231, die übers Jahr nur wenige Sekunden Abweichung hat und stellst diese mittels GPS einmal am Tag. DS3231 kannst Du sekündlich auslesen.

Diese RTC ist verbaut. Es bringt mir aber nichts, wenn ich jede Sekunde auslesen könnte, aber der Arduino 2 Sekunden lang Daten an das Display sendet… Diese zwei Sekunden fehlen mir ja trotzdem und die Anzeige “ruckelt”.

SkobyMobil:
Hallo,
das ist ohne Sketch (in CodeTag´s, oben links, Editor) schlecht zu sagen.
GPS und SekundenAnzeige geht ohne Probleme. Der GPS läuft ja unabhängig, und
wirft alle Sekunde seine Sätze raus. Der Arduino braucht aber bei weitem nicht
eine Sekunde um diese zu lesen und zu verarbeiten.

In das TFT würde ich nur schreiben wenn sich etwas ändert, und dann auch nur
das- neu schreiben, was sich geändert hat.
Du hast Dich da verzettelt.
Gruß und Spaß
Andreas

Das Problem liegt auch definitiv an der Kommunikation Arduino <-> LCD.
Ich habe 5 analoge Werte und die Uhrzeit.
Die 5 Werte hätte ich schon gerne so oft wie möglich aktualisiert. Sende ich nur diese Werte benötigt der Arduino knappe 700ms für eine komplette Loop. Das ist leider trotzdem so lange, dass die Sekunden “ruckeln”.
Die Zeit ändert sich auch nicht wenn ich den Beispielsketch nehme und feste Werte übertrage. Daher bin ich der Meinung, es liegt nicht am Sketch sondern an der Geschwindigkeit mit der der Arduino die Daten (verarbeitet?) an das LCD schickt und dort evtl. einen Handshake abwartet (keine Ahnung ob es das hier überhaupt gibt).

Evtl. hätte ich als Frage stellen sollen → welche Variante ist die schnellste um Daten vom Arduino an ein Display zu übertragen?

Sketch schaue ich mal wie ich den hier hoch bekomme…

Viele Grüße Oliver

Hallo,
“Sende ich nur diese Werte benötigt der Arduino knappe 700ms für eine komplette Loop”

Da haste den Fehler doch schon direkt vor Dir liegen…
Gruß und Spaß
Andreas

Hier in #6

Ohne Sketch können wir Dir nicht viel sagen.
Nur soviel: schmeiß alle delays raus.
grüße Uwe

Uwes Kristallkugel hätte eigentlich noch auf lcd.clear tippen können, das auch lange benötigt. Ach, steht da schon:

SkobyMobil:
In das TFT würde ich nur schreiben wenn sich etwas ändert, und dann auch nur
das- neu schreiben, was sich geändert hat.

Sodele hier der "Problemcode".

Zu den restlichen Hinweisen:

Ich verwende kein lcd.clear, ich verwende kein Delay (abgesehen vom Smartdelay bei GPS welches aber nicht zu den 2 Sekunden zählt).

In dieser Variante komme ich auf eine Zykluszeit von knappen 700ms. Entferne ich den Switch Case benötige ich die knappen 2 Sekunden.

Die Zeiten ändern sich nicht, wenn ich die Variablen auf feste Werte ändere.

Viele Grüße Oliver

void LCD() {


  switch (g_LCD_Auswahl) {
    case 1:
      //// Batterie
      myGLCD.setFont(BigFont);
      myGLCD.setColor(255, 255, 255);
      myGLCD.setBackColor(255, 20, 0);
      myGLCD.print(g_Cell_1_LCD, 25, 286);
      myGLCD.print(g_Cell_2_LCD, 142, 286);
      myGLCD.print(g_Cell_3_LCD, 259, 286);
      myGLCD.print(g_Cell_4_LCD, 376, 286);
      g_LCD_Auswahl++;
      break;
    case 2:
      //Akkupack Daten
      myGLCD.setColor(255, 255, 255);
      myGLCD.setFont(Grotesk32x64);
      myGLCD.setBackColor(0, 0, 0);
      myGLCD.print(g_Pack_LCD, 4, 210);

      myGLCD.setFont(Grotesk16x32);
      myGLCD.print(g_Ampere_LCD, 230, 210);
      myGLCD.print(g_Pack_AH_LCD, 236, 240);
      g_LCD_Auswahl++;
      break;
    case 3:
      //Uhrzeit / Loc / Höhe
      myGLCD.setColor(255, 255, 255);
      myGLCD.setFont(Grotesk32x64);
      myGLCD.setBackColor(0, 0, 0);
      myGLCD.print(g_Locator, 5, 5);
      myGLCD.print(g_String_Zeit_UTC, 220, 5);

      myGLCD.setFont(Grotesk16x32);
      myGLCD.setBackColor(0, 0, 0);
      myGLCD.print(g_String_Hoehe, 5, 70);
      myGLCD.print(g_String_Sats, 110, 70);
      g_LCD_Auswahl++;
      break;
    case 4:
      myGLCD.setFont(BigFont);
      myGLCD.setBackColor(0, 0, 0);
      myGLCD.print(g_String_Zeit_MESZ, 348, 70);
      myGLCD.print(g_String_Datum, 348, 85);
      myGLCD.print(g_String_Bake_20m, 63, 115);
      myGLCD.print(g_String_Bake_17m, 63, 130);
      myGLCD.print(g_String_Bake_15m, 63, 145);
      myGLCD.print(g_String_Bake_12m, 63, 160);
      myGLCD.print(g_String_Bake_10m, 63, 175);
      g_LCD_Auswahl++;
      break;
    default:
      break;
  }
  if (g_LCD_Auswahl >= 5) {
    g_LCD_Auswahl = 1 ;
  }
}

Mit der Bibliothek habe ich noch keinerlei Erfahrung, da kann ich leider nicht helfen :frowning:

wenn du dazu nur

void loop() {
  LCD();
}

packst, und alles andere vorher initialisiert ist, sollte das Display eher flimmern als 700 ms pro Umlauf brauchen...

Wenn doch, würde ich mal testen, wie lang die einzelnen Methoden ( setFont ? ) brauchen...

Poste bitte den kompletten Kode.

michael_x:
wenn du dazu nur

void loop() {

LCD();
}


packst, und alles andere vorher initialisiert ist, sollte das Display eher flimmern als 700 ms pro Umlauf brauchen... 

Wenn doch, würde ich mal testen, wie lang die einzelnen Methoden ( setFont ? ) brauchen...

Es flackert nicht direkt - man sieht halt, dass sich etwas ändert. Schreibe ich Festwerte rein sieht man davon auch fast nichts (also ich sehe nichts).

setFont werde ich mal ausprobieren.

Whandall:
Poste bitte den kompletten Kode.

Kann ich noch nachreichen - nicht falsch verstehen, aber als Laie -> wenn der komplette Sketch ohne den LCD Teil in wenigen ms abgearbeitet ist - was kann dann außerhalb des LCD void die Verzögerung verursachen? Die Verzögerung besteht ebenfalls, wenn ich nur den void LCD nehme und in ein komplett neues Sheet kopiere ohne meine ganze andere Programmierung.

Viele Grüße
Oliver

Auch wenn ich die Infos meiner Vorredner wiederhole, es ist immer wichtig den kompletten Sketch zu sehen, damit wir auch die Zusammenhänge erkennen können.

Grundsätzlich solltest du dein Display nicht ständig überschreiben, sondern nur dann, wenn sich etwas geändert hat.
Eine Sekundenaktalisierung deiner Anzeige wird funktionieren, wenn du den kompletten Sketch darauf abgestimmt hast.

HotSystems:
Auch wenn ich die Infos meiner Vorredner wiederhole, es ist immer wichtig den kompletten Sketch zu sehen, damit wir auch die Zusammenhänge erkennen können.

Darüber hinaus hat jemand Lust den Sketch praktisch auszuprobieren und zu verändern, dass er richtig läuft. Postest du nur einen Schnipsel, dann nimmst du dir diese Chance.

Außerdem können sich Tücken auch in den verwendeten Librarys, der Variablendeklaration und der Initialisierung verbergen.

Links zu den verwendeten Librarys sind zur Fehlersuche oft auch hilfreich. Oft gibt es verschiedene Versionen.

Hallo,
wenn es die Lib von „Adafruit“ ist, dann läuft diese fehlerfrei.
Aber das:

myGLCD.setFont(BigFont);
      myGLCD.setColor(255, 255, 255);
      myGLCD.setBackColor(255, 20, 0);

kannst Du machen, solltest Du aber nicht.

Dieses:

myGLCD.setBackColor(255, 20, 0);

solltest Du einmal- ins SetUp setzen. Dann nicht wieder verwenden.
Wenn mich nicht alles täuscht, dann wird der Inhalt des TFT neu aufgebaut-
und das kostet Zeit.
Gruß und Spaß
Andreas

Hi

Ein Oszi würde vll. auch bei der Suche helfen - oder ein Blick in die verwendete(n) Library(s).

So wie ich den Snipped oben lese, wird 'nur' bei jedem LCD-Aufruf ein weiterer 'Bildschirm' gesendet.
... egal, wie viel ich zum Display sende - Das kann eigentlich keine 700ms dauern.
Selbst, wenn jedes Zeichenbit einzeln per Buschtrommel auf dem I²C-Bus übertragen wird.

Da ist in Deinem Code irgend was mächtig unrund - sind noch weitere Librarys verbaut, Die sich gegenseitig stören können?

MfG

Sodele - Problem gefunden - setFont ist der Verursacher...

michael_x:
wenn du dazu nur

void loop() {

LCD();
}


packst, und alles andere vorher initialisiert ist, sollte das Display eher flimmern als 700 ms pro Umlauf brauchen... 

Wenn doch, würde ich mal testen, wie lang die einzelnen Methoden ( setFont ? ) brauchen...

Kommentiere ich alle setFont aus habe ich einen Zyklus um 100 bis 200ms. Ich muss jetzt nur noch alle Blöcke passend abändern (und hoffen, dass es auch klappt).

SkobyMobil:
Hallo,
wenn es die Lib von „Adafruit“ ist, dann läuft diese fehlerfrei.
Aber das:

myGLCD.setFont(BigFont);

myGLCD.setColor(255, 255, 255);
      myGLCD.setBackColor(255, 20, 0);



kannst Du machen, solltest Du aber nicht.

Dieses:


myGLCD.setBackColor(255, 20, 0);



solltest Du einmal- ins SetUp setzen. Dann nicht wieder verwenden.
Wenn mich nicht alles täuscht, dann wird der Inhalt des TFT neu aufgebaut-
und das kostet Zeit.
Gruß und Spaß
Andreas

Ich setze hier die Backcolor für einen Text. Setze ich den in das Setup wird alles blau und nicht nur der Text den ich möchte. Ich habe auch mal alle setBackcolor auskommentiert - hat ca. 50ms gebracht...

Jetzt setze ich mich mal ans optimieren und dann schauen wir mal was passiert. DAnke für die Antworten und Denkanstöße!
Schönen Sonntag
Oliver

Was ein Smartdelay ist weis immer noch niemand.

Ulli

beeblebrox:
Was ein Smartdelay ist weis immer noch niemand.

Ulli

ist aus dem Beispielsketch für GPS:

// This custom version of delay() ensures that the gps object
// is being "fed".
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

@ BullSimons: die Zeilen

if (ss.available()) {
gps.encode(ss.read());
}

kannst Du aber auch in die loop schmeissen, dann wird der restliche Sketch nicht ausgebremst, und GPS Daten werden trotzdem empfangen (funktioniert jedenfalls bei mir)