Bitte hilft mir, die Werte über das Anzeigemenü mit 3 Tasten zu ändern

Hallo,

Thema scheint ja jetzt beendet zu sein, dennoch. Ich hatte da vor einiger Zeit mal was gemacht und habe das jetzt noch etwas allgemeiner gefasst. Der Sketch arbeitet mit der One Butten Lib. Es werden insgesamt 3 Seiten auf einem 128x64 Display angezeigt. Seite 1 zeigt die Liste der 5 Parameter. Die Anzahl der Parameter ist beliebig , bei dem verwendeten Display passen aber nur 5 drauf. Seite 2 u 3 sind frei. Die Parameter werden auf EEprom gespeichert und bleiben damit erhalten. Das Display wir immer nur einmalig neu geschrieben, dazu wird eine Statusvariable verwendet.

Heinz

/* 3 Button Menue auf Basis der OneButton Lib
  Stellt ein Eingabemenue für meherer Variable zur Verfügung
  Anzeige von 3 Seiten auf einem Display
  Taster select
    dblClick wechset den Modus
    lick wechset die Variable oder Seite
  Taster +- Werte ändern
    click +-1
    long +-10, nach 5s +-100
  Datenspeicherung von/auf EEprom
                                    Datum 04.21
*/
#include <EEPROM.h>
#include <OneButton.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // DISP display width, in pixels
#define SCREEN_HEIGHT 64 // DISP display height, in pixels
#define DISP_RESET -1

//#define debug 1

// Definition der Texte legt die Anzahl fest
const char*Vartext[] {"Text_0", "Text_1", "Text_2",
  "Text_3", "Text_4"
};
// Anzahl berechnen
const byte maxAnz = sizeof(Vartext) / sizeof(Vartext[0]);

const int mindata[maxAnz] {0, 0, 0, 0, 0}; // Anzahl beachten
const int maxdata[maxAnz] {10000, 200, 300, 500, 1000};
uint32_t longstart;
byte Varindex;
byte Seite = 0;
bool eingabe;     // Modus Eingabe der Werte
bool changed;     // Display geändert neu schreiben
bool datachanged ;// Daten wurden geändert -> auf Epprom

// Daten in Struct um sie auf EEprom zu speichern
struct mydaten {
  int VarData[maxAnz];
} daten;

// Pins festlegen
const byte pinsel = 2;    // select Button
const byte pinplus = 4;   // Plus Button
const byte pinminus = 3;  // Minus Button

// Instanzen
OneButton Btnsel(pinsel, true);
OneButton Btnplus(pinplus, true);
OneButton Btnminus(pinminus, true);
Adafruit_SSD1306 DISP(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, DISP_RESET);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  //Serial.println (maxAnz);

  EEPROM.get(0, daten); // Daten aus Eprom lesen
  for (byte i = 0; i < maxAnz; i++) {
    checkminmax();
  }
  changed = true;
  //button Ereignisse festlegen
  Btnsel.attachClick(selClick);
  Btnsel.attachDoubleClick(selDblClick);
  Btnplus.attachClick(plusClick);
  Btnplus.attachDuringLongPress(plusDurPress);
  Btnplus.attachLongPressStart(LongStart);
  Btnminus.attachClick(minusClick);
  Btnminus.attachDuringLongPress(minusDurPress);
  Btnminus.attachLongPressStart(LongStart);

  DISP.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  DISP.clearDisplay();  // Begrüßung
  DISP.setTextWrap(false);
  DISP.setTextSize(2);
  DISP.setTextColor(WHITE);
  DISP.setCursor(10, 10); DISP.print(F("3-Button"));
  DISP.setCursor(20, 30); DISP.print(F("Menue"));
  DISP.setTextSize(2);
  DISP.display();
  delay(2000);
}

void loop() {
  // put your main code here, to run repeatedly:
  Btnsel.tick();
  Btnplus.tick();
  Btnminus.tick();
  if (eingabe)AnzeigeEingabe();
  else Anzeige(Seite);

}

// ------one Button Ereignisse auswerten-------

void selClick() {
  changed = true;
  if (eingabe) {  // Variable wechseln
    Varindex++;
    if (Varindex >= maxAnz) Varindex = 0;
  }
  else { // Seite wechseln
    Seite++;
    if (Seite >= 3) Seite = 0;
  }
}
void selDblClick() {
  if (eingabe) saveEEprom(); // Eingabe ist beendet
  eingabe = !eingabe; // toggle Mode
  changed = true;
#ifdef debug
  for (byte i = 0; i < maxAnz; i++) {
    Serial.print(Vartext[i]); Serial.print('\t');
    Serial.println(daten.VarData[i]);
  }
  Serial.print("Bildmodus ändern "); Serial.println(eingabe);
  Serial.print("Index "); Serial.println(Varindex);
#endif
}

void plusClick() {
  click(1);
}
void minusClick() {
  click(-1);
}
void plusDurPress() {
  longclick(1);
}
void minusDurPress() {
  longclick(-1);
}
void LongStart() {
  longstart = millis();
}
void click(int inc) {
  if (eingabe) {
    changed = true;
    datachanged = true;
    daten.VarData[Varindex] += inc;
    checkminmax();
    Serausgabe();
  }
}
void longclick(int richtung) {
  static uint32_t altzeit;
  int inc = 10;
  if (millis() - longstart > 5000) inc = 100;
  if (millis() - altzeit >= 100 && eingabe) {
    altzeit = millis();
    changed = true;
    datachanged = true;
    daten.VarData[Varindex] += inc * richtung;
    checkminmax();
    Serausgabe();
  }
}

void Serausgabe() {
#ifdef debug
  Serial.print(Vartext[Varindex]);
  Serial.print ("\t"); Serial.println(daten.VarData[Varindex]);
#endif
}

void checkminmax() {
  if (daten.VarData[Varindex] < mindata[Varindex]) {
    daten.VarData[Varindex] = mindata[Varindex];
  }
  if (daten.VarData[Varindex] > maxdata[Varindex]) {
    daten.VarData[Varindex] = maxdata[Varindex];
  }
}

void AnzeigeEingabe() { // Anzeige bei Eingabe
  if (changed ) {
    changed = false;
    DISP.clearDisplay();
    DISP.setTextSize(2);
    DISP.setCursor(0, 0); DISP.print("Eingabe");
    DISP.setCursor(0, 20); DISP.print(Vartext[Varindex]);
    DISP.setCursor(10, 40); DISP.print(daten.VarData[Varindex]);
    DISP.display();
  }
}

void Anzeige(byte seite) { // Anzeige Seiten
  if (changed) { // wenn sich werte geändert haben
    changed = false;
    DISP.clearDisplay();
    if (seite == 0) { // Anzeige Liste der Werte
      DISP.setTextSize(1);
      DISP.setCursor(0, 0);
      DISP.print("variable Werte");
      for (byte i = 0; i < maxAnz; i++) {
        byte zeile = i * 10 + 10;
        DISP.setCursor(0, zeile);
        DISP.print(Vartext[i]);
        DISP.setCursor(80, zeile );
        DISP.print(daten.VarData[i]);
      }
    }
    else if (seite == 1) { // Beliebige Werte
      DISP.setTextSize(2);
      DISP.setCursor(0, 0); DISP.print("Seite 1");
    }
    else if (seite == 2) { // Beliebige Werte
      DISP.setTextSize(2);
      DISP.setCursor(0, 0); DISP.print("Seite 2");
    }
    DISP.display();
  }
}

void saveEEprom() {
  if (datachanged) {
    datachanged = false;
#ifdef debug
    Serial.println("Save in EEprom");
#endif
    EEPROM.put(0, daten);
  }
}