3,5" TFT - Adafruit gfx library - Button mit Wert aus EEPROM

Hallo zusammen,
ich arbeite aktuell an einer Menüführung, wo auf verschiedenen Ebenen Werte für einen Programmablauf eingegeben werden sollen.

Gearbeitet habe ich bisher mit Adafruit library und mit dem Befehl initButton.
Hiermit lässt sich sehr einfach ein Button erstellen, welcher auch mit Befehlen wie justPressed oder justReleased ausgelesen werden kann.
Ebenso kann man einfach eine Farbe zuordnen und den Button benennen.

Jetzt hätte ich nur gerne, das der Button als Bezeichnung einen vorher z.B. im EEPROM gespeicherten Wert einnimmt. Leider erscheinen dann nur irgendwelche Zeichen.
Weiß jemand woran das liegt und ob man es mit diesem Befehl auch anders machen kann?
Wenn nicht, welchen Weg würdet ihr empfehlen?
Danke für eure Hilfe.

Verwendet habe ich folgenden Code aus der Beispielbibliothek.

#if 1

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#define MINPRESSURE 200
#define MAXPRESSURE 1000

// ALL Touch panels and wiring is DIFFERENT
// copy-paste results from TouchScreen_Calibr_native.ino
const int XP = 6, XM = A2, YP = A1, YM = 7; //ID=0x9341
const int TS_LEFT = 907, TS_RT = 136, TS_TOP = 942, TS_BOT = 139;

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

Adafruit_GFX_Button on_btn, off_btn;

int pixel_x, pixel_y;     //Touch_getXY() updates global vars
bool Touch_getXY(void)
{
    TSPoint p = ts.getPoint();
    pinMode(YP, OUTPUT);      //restore shared pins
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   //because TFT control pins
    digitalWrite(XM, HIGH);
    bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
    if (pressed) {
        pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
        pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
    }
    return pressed;
}

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

void setup(void)
{
    Serial.begin(9600);
    uint16_t ID = tft.readID();
    Serial.print("TFT ID = 0x");
    Serial.println(ID, HEX);
    Serial.println("Calibrate for your Touch Panel");
    if (ID == 0xD3D3) ID = 0x9486; // write-only shield
    tft.begin(ID);
    tft.setRotation(0);            //PORTRAIT
    tft.fillScreen(BLACK);
    on_btn.initButton(&tft,  60, 200, 100, 40, WHITE, CYAN, BLACK, "ON", 2);
    off_btn.initButton(&tft, 180, 200, 100, 40, WHITE, CYAN, BLACK, "OFF", 2);
    on_btn.drawButton(false);
    off_btn.drawButton(false);
    tft.fillRect(40, 80, 160, 80, RED);
}

/* two buttons are quite simple
 */
void loop(void)
{
    bool down = Touch_getXY();
    on_btn.press(down && on_btn.contains(pixel_x, pixel_y));
    off_btn.press(down && off_btn.contains(pixel_x, pixel_y));
    if (on_btn.justReleased())
        on_btn.drawButton();
    if (off_btn.justReleased())
        off_btn.drawButton();
    if (on_btn.justPressed()) {
        on_btn.drawButton(true);
        tft.fillRect(40, 80, 160, 80, GREEN);
    }
    if (off_btn.justPressed()) {
        off_btn.drawButton(true);
        tft.fillRect(40, 80, 160, 80, RED);
    }
}
#endif

Hallo Combie,
vielen Dank für deinen Link.
Mir geht es hier nur weniger um die Funktion des EEPROM, als viel mehr darum, als Namen für einen Button einen Wert einzugeben. Also nicht den Namen direkt über "Button1" einzufügen.

also in etwa so:
T3_btn.initButton(&tft, 270, 60, 60, 60, WHITE, CYAN, BLACK, EEPROM.read(13), 2);

oder so:

T3_btn.initButton(&tft, 270, 60, 60, 60, WHITE, CYAN, BLACK, Wert1, 2);

Kann mir hier jemand helfen?
Danke
Christian

? Bahnhof ?

Ich habe dir da gezeigt, wie man Daten im EEPROM ablegt.
Wie man das EEPROM beschreibt.
Wie man es liest.

Was ist dein Problem damit?
Was hindert dich es zu verwenden?

Hallo Combie,
ich glaube wir verstehen uns falsch.

Mein Problem ist nicht, wie man ein EEPROM beschreibt oder ausliest.
Es ist, dass die Anzeige auf dem Button, wenn dieser wie im obigen Beispiel mit initButton erstellt wurde, ich dort als Bezeichnung nur einen von mir geschriebenen Wert eingeben kann. Ich könnte nicht den Button mit einem im EEPROM hinterlegten Wert beschriften, da dann nur komische Zeichen erscheinen. Gleiches passiert übrigens, wenn ich einen anderweitig gespeicherten Wert an dieses Stelle auslesen möchte.

Ich habe einen Button, der z.B. eine Solltemperatur anzeigt. Wenn ich den Button drücke, dann möchte ich diesen Wert verändern können. Leider scheitert es aktuell an der Anzeige der Solltemperatur im Button, da dort nur Zeichen erscheinen.

Danke
Christian

Dein initButton() erwartet an der Stelle einen Zeiger auf einen C-String.
Gib ihm einen!

Hallo Combie,
erneut Danke für deine Hilfe.

Wenn ich es also jetzt richtig verstehe, muss ich den Wert für die Soll-Temp (egal woher er kommt) in einen String wandeln, richtig?

Angenommen er kommt aus dem EEPROM:
String Sollwert= String(EEPROM.read(11));

Dann Sollte Sollwert den Wert aus dem EEPROM haben.
Wie bekomme ich diesen Wert jetzt in den Button?

T3_btn.initButton(&tft, 270, 60, 60, 60, WHITE, CYAN, BLACK, ???, 2);

Ich habe jetzt ne Weile gegoogelt und die Lösung nicht finden können, evtl bin ich auch auf dem Holzweg.

String Sollwert= String(EEPROM.read(11));

Ich spreche explizit von einem Zeiger auf einen C-String.
Nicht ohne Grund!
Und du kommst mit der String Klasse an.....

Aber bitte, wenn du es gerne so "kostenintensiv" möchtest...

T3_btn.initButton(&tft, 270, 60, 60, 60, WHITE, CYAN, BLACK, String(EEPROM[11]).c_str(), 2)

Combie,
vielen Dank.

Ich weiß zwar nicht genau was du mir kostenintensiv meinst, es klappt aber jetzt.
Danke

was du mir kostenintensiv meinst

  • Konstruktor Aufruf
  • Konvertierung von Zahl zu C-String
  • Speicher auf dem Heap allozieren
  • Kopieren des temporären C-String in den allozierten Bereich
  • Methoden Aufruf (Rückgabe (char *))
  • Destruktor Aufruf
  • Heap frei geben.

Das einzige, was davon wirklich nötig ist, ist wohl:

Konvertierung von Zahl zu C-String

Versuche mal sowas (ungetestet):

char Wert1[] = {"Button1"};
...
T3_btn.initButton(&tft, 270, 60, 60, 60, WHITE, CYAN, BLACK, Wert1, 2);

Das Feld Wert1 kann verändert werden und muß daher genügend Elemente für alle möglichen Texte haben und mittels '\0' abgeschkossen sein.

Das Beispiel arduin-o-phone-sketch zeigt die Verwendung eines zweidimensionalen Feldes (buttonlabels).

char buffer[20];
//...
T3_btn.initButton(&tft, 270, 60, 60, 60, WHITE, CYAN, BLACK, itoa(EEPROM[11],buffer,10), 2);