Probleme mit LCD Variablen wiedergabe

Hallo,

ich habe folgendes Problem:

Nachdem ich meinen sketch in erster Version aufgebaut habe, unterteilt in verschiedene tabs habe ich festgestellt, dass ich ein ziemliches "abfrage/abtast" problem habe, da ich einen sensor, taster, led, pwm in und out abfragen muss und das nahezu echtzeitfähig.

das sketch funktioniert und zeigt auf meinem lcd display (Arduino LCD zwei variablen an. einen integer und eine real zahl.

also habe ich nach einer lösung gesucht und bin bei frerRTOS hängen geblieben. nun habe ich statt in tabs alles in tasks umgebaut und es läuft super. schnell. aber. nach einigen anlaufschwieirgkeiten und abgeschossenen arduino micros habe ich dann alles ans laufen bekommen. nur die "ausgabe" der beiden variablen funktioniert nicht mehr. und ich bin echt ratlos.

hier ein Auszug aus meinem Sketch ( ///... ...// bedeutet dass dazwischen noch anderer code steht, der nichts mit der funktion zu utn hat):

//#################################################################//
// LIBRARIES
//#################################################################//

/********************************************************************/
// General
#include <TFT.h>  
#include <Arduino_FreeRTOS.h>



//#################################################################//
// GLOBALE VARIABLEN
//#################################################################//

// LCD
char IntensityCharArray[6];       // String Intensität
char TemperaturCharArray[10];     // String Temperatur




//#################################################################//
// TASK LCD
//#################################################################//
void Task_LCD(void *pvParameters)  
{
  (void) pvParameters;

  String IntensityStr;
  String TemperaturStr;

  for (;;)
  {


//...

...//

    /********************************************************************/
    // EncoderWert für Ausgabe vorbereiten
    IntensityStr = String(EncoderWert);
    IntensityStr.toCharArray(IntensityCharArray,6); 

//...
...// 

    /********************************************************************/
    // Temperaturwert für Ausgabe vorbereiten
    TemperaturStr = String(TemperaturWert);
    TemperaturStr.toCharArray(TemperaturCharArray,10); 

//...
...//


    /********************************************************************/
    // Ausgabe
    LCD.stroke(255,0,255);    // Textfarbe
    LCD.setTextSize(3);        // Textgröße     
    
    LCD.text(IntensityCharArray,10,32);
    LCD.text(TemperaturCharArray,36,92);


    vTaskDelay( 1000 / portTICK_PERIOD_MS );
  }
} // Ende-Task_LCD
//#################################################################//

im original sketch ist das identisch programmiert und funktioniert auch.

Was ich ausprobiert habe:
Ausgabe eines eingetragenen strings:

LCD.text("Hallo",10,32);  // ERGEBNIS: Hallo

Ausgabe eines strings

testString = "Hallo";
LCD.text("Hallo",10,32);  // ERGEBNIS: ''

ich finde keine lösung dazu, es hindert mich aber stark :slight_smile:
ich weiß, dass die ausgabe einer variablen als char array sein muss, wie es auch in meinem sketch wie oben gezeigt umgesetzt ist.

ich hoffe ihr könnt mir helfen.

Meiner Meinung nach brauchst du weder FreeRTOS noch String Objekte.

Schmeiss erstmal die String Objekte raus.

Hallo michael_x

danke für deine Antwort.

als ich den beitrag geschrieben habe, habe ich unten zwei beispiele angehangen, welche NICHT im kleinstmöglichen sketch drin sind, um zu zeigen, was ich probiert habe. und oben habe ich den "langen" sketch angehangen mit dem problem.

das zweite beispiel hat natürlich einen fehler

testString = "Hallo";
LCD.text("Hallo",10,32); // ERGEBNIS: ''

korrekt wäre

LCD.text(testString ,10,32); // ERGEBNIS: ''

aber das konnte ich nach dem absenden nicht mehr ändern.

dass die variablen einen wert haben habe ich auch geprüft, mit serial.println(variable);
dort wurden beide variablen mit wert angezeigt.

daher muss der fehler in der umwandlung der "zahl, gleitpunktzahl" in einen string liegen.
und m.E. muss das auch was mit dem freeRTOS zutun haben, da im normalen sketch ohne freeRTOS geht ja alles.

EDIT:
wie kann ich denn die zahlen als text auf dem lcd sonst ausgeben wenn nicht als string?

das beispiel -> GettingStarted hat es ja so vorgegeben.

wenn es einen eleganteren weg gibt bin ich da gerne offen.

wie kann ich denn die zahlen als text auf dem lcd sonst ausgeben wenn nicht als string?

Normalerweise mit print. ?

Sonst hängt es natürlich von deinen geheimen Variablen-Typen von EncoderWert und TemperaturWert ab.

itoa ( int to ascii )
dtostrf ( eine avr Spezialfunktion für floats, um etwas platz zu sparen )

michael_x:
Normalerweise mit print. ?

warum gibt es ein getting started mit der funktion
text(string,int posx, int posy) und dann soll es einfach mit print gehen?

das lcd was ich habe, habe ich oben als link mit dazu gepackt.
es ist irgendwie ein wenig verwirrend, insofern die bibliotheken ggf falsch sind die ich nutze o.Ä.

ich habe mir das arduino robot lcd gekauft, nutze aber die bibliothek laut beispiel TFT.h
kann das zu einem problem führen? gibt es ggf überhaupt einen unterschied?

und wenn das mit print geht, wo kann ich dann sagen, wo auf meinem bildschirm das stehen soll?

es kann sein, dass wir ein wenig an einander vorbei reden, aber das möchte ich gerne ausschließen.

mfg
sven

Das musst Du den Autor des getting started fragen, nicht uns.

Oft werden da entweder Teile aus anderen Programmen rein kopiert oder wenig gedacht. Hauptsache es geht schnell und funktioniert halbwegs. Mehr muss es nicht bringen.
Deshalb haben ja auch alle Anfängerbeispiele das unsägliche delay() drin. Es reicht für das Beispiel, ist einfach und mehr ist uninteressant.
Wenn Du dann mehr (oder besser Mehreres) machen willst, fällst Du auf die Nase.

Gruß Tommy

Sickone4:
und wenn das mit print geht, wo kann ich dann sagen, wo auf meinem bildschirm das stehen soll?

Üblicherweise positionierst Du den Cursor an eine Stelle und gibst dann Text aus.

so langsam merke ich dass wir tatsächlich an einander vorbei reden!

ich positioniere auf meinem display per koordinate. bitte den link oben anklicken und sehen dass es KEIN zeilendisplay ist!!

ich habe nun beide variablen mit den von michael angegebenen funktionen umgewandelt und es wird nun korrekt ausgegeben!
danke schon einmal dafür.

jetzt scheitere ich daran, dass mein char array für den TemperaturWert mit einer Größe (jetzt) von [5] im falle eines kabelbruchs einen ersatzwert bekommen soll.

beispiel:
chararr_TempValue = 23.50 (grad celsius)
jetzt kabelbruch -> -err-

aber irgendwie bekomme ich diese 5 buchstaben nicht in das array rein....
ich arbeite dran

ich habe das jetzt so gelöst... aber hey das muss doch einfacher gehen^^ aber ich stehe gerade voll auf dem schlauch....

if ((TempValue != -127.0) && (TempValue != NULL) && (SteuerungEin == true)) {
  dtostrf(TempValue, 5, 2,Char_TempValue);
}

else {
  Char_TempValue[0] = '-';
  Char_TempValue[1] = 'e';
  Char_TempValue[2] = 'r';
  Char_TempValue[3] = 'r';
  Char_TempValue[4] = '-';
  Char_TempValue[5] = NULL;
}

Du suchst strcpy.

Gruß Tommy

Sickone4:
so langsam merke ich dass wir tatsächlich an einander vorbei reden!

ich positioniere auf meinem display per koordinate. bitte den link oben anklicken und sehen dass es KEIN zeilendisplay ist!!

Ich meine ein Grafikdisplay, auf dem Text ausgegeben wird. Das sieht beispielsweise so aus:

  tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
  tft.setCursor(STATUS_X, STATUS_Y);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(1);
  tft.print(msg);

Mit setCursor wird positioniert, mit print der Text ausgegeben.

Sorry, wenn ich daneben liegen sollte.

hi agmue

ich habe dein beispiel mit entsprechenden bibliotheken nicht zum laufen bekommen.
liegt das ggf daran, dass ich mit meinem tft screen die ardafruit bib gar nicht nutzen kann, ich komme da nicht ganz mit. dein kurzes beispiel ist einfach und verständlich, aber irgendwie finde ich diese darstellung auch in keinem tutorial, was mit meinem discplay zutun hat.