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);
}
}