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

paulpaulson:
Moin,
hier kommt der Sketch, der für die I²C Schnittstelle angepasst worden ist.

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows
const int numOfInputs = 3;
const int inputPins[numOfInputs] = {6,7,8};
int         inputState     [numOfInputs];
int         lastInputState [numOfInputs];
/////////////////////////////////////////////////////
//LCD Menu Logic
const int   numOfScreens = 4;
int         currentScreen = 0;

//////////////////////////////////////////////////////
struct Parameter_s {
   const char*     name;
   const char*     units;
   long            delta;
   long            min;;
   long            max;
   long            val;
} parameters [] = {
   { "Counter1", "cyc",  500, 0, 4000 },
   { "Counter2", "cyc",  250, 0, 2000 },
   { "Timer1",   "msec", 10,  0, 100  },
   { "Timer2",   "msec", 250, 0, 2000 },
};
#define N_SCREENS   (sizeof(parameters)/sizeof(Parameter_s))
int idx = 0;
void setup()
{
   for (int i = 0; i < numOfInputs; i++) {
       pinMode (inputPins[i], INPUT_PULLUP);
       lastInputState [i] = digitalRead (inputPins[i]);
   }
   Serial.begin (9600);
   lcd.init(); // initialize the lcd
   lcd.backlight();
   lcd.setContrast(255);
   lcd.setCursor (0,0);
   lcd.print ("   :::Menu:::");
   lcd.setCursor (5,1);
}
//////////////////////////////////////////////////////
void loop()
{
 chkInputs ();
}
//////////////////////////////////////////////////////
void chkInputs ()
{
   for (int i = 0; i < numOfInputs; i++) {
       int reading = digitalRead (inputPins[i]);
       if (lastInputState[i] != reading) {
           lastInputState[i] = reading;
           if (LOW == reading)  {
               inputAction (i);
               printScreen ();
           }
          delay (10);     // debounce
       }
   }
}
/////////////////////////////////////////////////////
void inputAction (int input)
{
   switch (input) {
   case 0:
       idx++;
       idx %= N_SCREENS;
       break;
   case 1:
       parameterChange (0);
       break;
   case 2:
       parameterChange (1);
       break;
   }
}
////////////////////////////////////////////////////////
void
parameterChange (int key)
{
   Parameter_s *p = &parameters [idx];
   switch (key)  {
   case 0:
       p->val += p->delta;
       if (p->val > p->max)
           p->val = p->max;
       break;
   case 1:
       p->val -= p->delta;
       if (p->val < p->min)
           p->val = p->min;
       break;
   }
}
////////////////////////////////////////////////////////
void printScreen () {
   lcd.clear ();
   char s [40];
   Parameter_s *p = &parameters [idx];
   lcd.setCursor (0,0);
   lcd.print (p->name);
   sprintf (s, "%4ld %s", p->val, p->units);
   lcd.setCursor (0,1);
   lcd.print (s);
}

Werde es mir anschauen wenn ich zu Hause bin. Ubrigens ich benutze ein Nano.
Danke

Hi paulpaulson... Bei mir tut es auch jetzt funktionieren mit dem OledDisplay...
Nur mit dem LCD kriege ich es einfach nicht ans laufen. Werde zu diesen Zeitpunkt nicht mehr Zeit mit dem LCD verlieren. Hab 2 Oled´s vor zwei Tagen bekommen. Werde diese auf jeden Fall in mein Foerderband Projekt benutzen. Folgt de Code mit OledDisplay.
Danke nochmal fuer deine Hilfe und Danke dier auch Rentner fuerr deine Hilfe

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET     LED_BUILTIN // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define LOGO_HEIGHT   16
#define LOGO_WIDTH    100
const int numOfInputs = 3;
const int inputPins[numOfInputs] = {6,7,8};
int         inputState     [numOfInputs];
int         lastInputState [numOfInputs];
/////////////////////////////////////////////////////
//LCD Menu Logic
const int   numOfScreens = 4;
int         currentScreen = 0;

//////////////////////////////////////////////////////
struct Parameter_s {
    const char*     name;
    const char*     units;

    long            delta;
    long            min;;
    long            max;
    long            val;
} parameters [] = {
    { "Counter1", "cyc",  500, 0, 4000 },
    { "Counter2", "cyc",  250, 0, 2000 },
    { "Timer1",   "msec", 10,  0, 100  },
    { "Timer2",   "msec", 250, 0, 2000 },
};

#define N_SCREENS   (sizeof(parameters)/sizeof(Parameter_s))

int idx = 0;

void setup()
{
    for (int i = 0; i < numOfInputs; i++) {
        pinMode (inputPins[i], INPUT_PULLUP);
        lastInputState [i] = digitalRead (inputPins[i]);
    }

    
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  display.clearDisplay();
  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(0,0);             // Start at top-left corner
  display.println(F("     :::MENU:::"));
  display.display();
}
//////////////////////////////////////////////////////
void loop()
{
  chkInputs ();
}
//////////////////////////////////////////////////////
void chkInputs ()
{
    for (int i = 0; i < numOfInputs; i++) {
        int reading = digitalRead (inputPins[i]);

        if (lastInputState[i] != reading) {
            lastInputState[i] = reading;

            if (LOW == reading)  {
                inputAction (i);
                printScreen ();
            }
           delay (10);     // debounce
        }
    }
}
/////////////////////////////////////////////////////
void inputAction (int input)
{
    switch (input) {
    case 0:
        idx++;
        idx %= N_SCREENS;
        break;

    case 1:
        parameterChange (0);
        break;

    case 2:
        parameterChange (1);
        break;
    }
}
////////////////////////////////////////////////////////
void
parameterChange (int key)
{
    Parameter_s *p = &parameters [idx];

    switch (key)  {
    case 0:
        p->val += p->delta;
        if (p->val > p->max)
            p->val = p->max;
        break;

    case 1:
        p->val -= p->delta;
        if (p->val < p->min)
            p->val = p->min;
        break;
    }
}
////////////////////////////////////////////////////////

void printScreen () {
    display.clearDisplay();
  display.setTextSize(1);  
  display.setTextColor(SSD1306_WHITE);
    char s [40];
    Parameter_s *p = &parameters [idx];

    display.setCursor(0,0);
    display.print (p->name);

    sprintf (s, "%4ld %s", p->val, p->units);
    display.setCursor(0,20);
    display.print (s);
  display.display();
}

Hallo
super Sache und Danke für deine Rückmeldung :slight_smile:

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

Hallo Rentner....
Nein. nein....das Thema ist noch nicht beendet. Ich bin noch nicht mal zur EEPROM gekommen... :slight_smile:
Jetzt momentan bin ich dabei den Oled Display kennen zu lernen. Ausprobieren wie man Textgrosse, byte arrays um bilder anzuzeigen etc.. Ich hab ein ssd1306 128x32.
Wie gesagt ich bin nicht mal zur EEPROM gekommen. Ich werde mir auf jeden Fall dein Sketch angucken. So werde ich auch die One Button Lib kennen lernen.
Danke fuer dein Code und deine Hilfe. Ich werde mich sichelich melden.

Morgen zusammen , Morge @Rentner .
Hab in den letzten zwei drei Tage vesucht den oberen code mit den 3 Button Menue auf Basis der OneButton Lib in mein Foederband Projekt einzubinden haber irgenwie gelingt es mir nicht so ganz. Ich stosse immer wieder auf unterschiedliche Problemen wegen meinen geringen C++ Kentnisse.
Den oberen Code ab ich schon auf mein 128x32 anpepasst, so das halles lesbar ist und so das man zwischen den verschiedenen menu wandern kann. Folgt der angepasster Code fuer mein Dispaly.

#include <EEPROM.h>
#include <OneButton.h>
#include <SPI.h>
#include <Wire.h>//This library allows you to communicate with I2C / TWI devices
#include <Adafruit_SSD1306.h>//This is a library for our Monochrome OLEDs based on SSD1306 drivers
#define SCREEN_WIDTH 128// OLED display width, in pixels
#define SCREEN_HEIGHT 32// OLED display height, in pixels
#define display_RESET -1

// Definition der Texte legt die Anzahl fest
const char*Vartext[] {"Zyklen:", "W.Zeit_1:", "W.Zeit_2:",
  "W.Zeit_3:", "W.Zeit_4:"
};

// Anzahl berechnen
const byte maxAnz = sizeof(Vartext) / sizeof(Vartext[0]);
unsigned long mindata[maxAnz] {0, 0, 0, 0, 0}; // Anzahl beachten
unsigned long maxdata[maxAnz] {80000, 200, 300, 500, 1000};
uint32_t longstart;
byte Varindex;
byte Seite = 0;
bool eingabe;     // Modus Eingabe der Werte
bool changed;     // displaylay geändert neu schreiben
bool datachanged ;// Daten wurden geändert -> auf Epprom

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

// Pins festlegen
const byte upPin = 6;  // Select Button
const byte downPin     = 7;  // Plus Button
const byte selectPin   = 8;  // Minus Button

// Instanzen
OneButton Btnsel(selectPin, true);
OneButton Btnup(upPin, true);
OneButton Btndown(downPin, true);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, display_RESET);

//-------------------------------------------------
void setup() {
  // Setup-Code hier eingeben, um ihn einmal auszuführen:
  Serial.begin(9600);

  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);
  Btnup.attachClick(plusClick);
  Btnup.attachDuringLongPress(plusDurPress);
  Btnup.attachLongPressStart(LongStart);
  Btndown.attachClick(minusClick);
  Btndown.attachDuringLongPress(minusDurPress);
  Btndown.attachLongPressStart(LongStart);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();  // Begrüßung
  display.setTextWrap(false);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0); display.print(F("3-Button"));
  display.setCursor(10, 20); display.print(F("Menue"));
  display.setTextSize(1);
  display.display();
  delay(2000);
}
//-------------------------------------------------
void loop() {
  //Hier den Hauptcode eingeben, um ihn wiederholt auszuführen:
  Btnsel.tick();
  Btnup.tick();
  Btndown.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 >= 4) 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++)
#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 = 100;
  if (millis() - longstart > 3000) inc = 500;
  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;
    display.clearDisplay();
    display.setTextSize(1);
    display.setCursor(0, 0); display.print("(EINGABE)");
    display.setTextSize(1);
    display.setCursor(2, 20); display.print(Vartext[Varindex]);
    display.setTextSize(2);
    display.setCursor(60, 12); display.print(daten.VarData[Varindex]);
    display.display();
  }
}
//-------------------------------------------------
void Anzeige(byte seite) { // Anzeige Seiten
  if (changed) { // wenn sich werte geändert haben
    changed = false;
    display.clearDisplay();
    if (seite == 0) { // Anzeige Liste der Werte
      for (byte i = 0; i < maxAnz; i++) {
        display.setTextSize(1);
        display.setCursor(0, 0);
        display.print(Vartext[0]);
        display.setTextSize(2);
        display.setCursor(35, 10 );
        display.print(daten.VarData[0]);
      }
    }
    else if (seite == 1) { // Beliebige Werte
      display.setTextSize(1);
      display.setCursor(0, 0); display.print("Start");
    }
    else if (seite == 2) { // Beliebige Werte
      display.setTextSize(1);
      display.setCursor(0, 0); display.print("Stop");
    }
    else if (seite == 3) { // Beliebige Werte
      display.setTextSize(1);
      display.setCursor(0, 0); display.print("Info");
    }
    display.display();
  }
}
//-------------------------------------------------
void saveEEprom() {
  if (datachanged) {
    datachanged = false;
#ifdef debug
    Serial.println("Save in EEprom");
#endif
    EEPROM.put(0, daten);
  }
}

Wie gesagt, dah ich es nicht inkriege den Code in mein Projekt einzubenden wegen meinen geringen C++ Kentnissen, habe ich versucht selber ein Menu fuers Display zu erstellen . Wo ich eine Zyklenzahl am Display ablesen kann , die gewunschte Zyklenzahl mit buttons verhandern und zuruckstellen kann. Folgender Code ist dabei rausgekommen und der Arbeitet bei mir. Folgt Code.

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define LOGO_HEIGHT   16
#define LOGO_WIDTH    100

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);

#define sensorleft    2
#define sensorright   3
#define startbutton   4
#define stopbutton    5
#define upbutton      6
#define downbutton    7
#define selectbutton  8

const byte relaisLinks     =  11;
const byte relaisRechts    =  12;

enum {relaisAn, relaisAus};
enum {warten, on, rechts, haltrechts, links, haltlinks, off, zyklusstoppen, stoppen};
enum {hauptmenu, maxmenu};
byte schrittmenu = hauptmenu;
byte schritt = warten;
byte zyklus = 0;

//void Setup
void setup() {
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x62
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }

  Serial.begin(9600);

  pinMode(sensorleft, INPUT_PULLUP);
  pinMode(sensorright, INPUT_PULLUP);
  pinMode(startbutton, INPUT_PULLUP);
  pinMode(stopbutton, INPUT_PULLUP);
  pinMode(upbutton, INPUT_PULLUP);
  pinMode(downbutton, INPUT_PULLUP);
  pinMode(selectbutton, INPUT_PULLUP);
  pinMode(relaisLinks, OUTPUT);
  digitalWrite(relaisLinks, relaisAus);
  pinMode(relaisRechts, OUTPUT);
  digitalWrite(relaisRechts, relaisAus);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

int mehr = 0;
int weniger = 0;
int mehrState = 0;
int wenigerState = 0;
int lastmehrState = 0;
int lastwenigerState = 0;
unsigned long maxzyklus = 40000;

//Void loop
void loop() {
  
  oledzyklenUpDown();
  schrittkette();
}

//Oled Menu Anzeige
void oledzyklenUpDown(){

  switch (schrittmenu) {

    case hauptmenu:
      if (zyklus < maxzyklus) {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(0, 0);
        display.println("Zyklen");
        display.println(maxzyklus);
        display.println(zyklus);
        display.display();
      }
      zyklenUpDown();
      schrittmenu = maxmenu;
      break;

    case maxmenu:
      if (zyklus == maxzyklus) {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(15, 0);
        display.print(F(":::Maxzyklus:::"));
        display.setCursor(0, 10);
        display.println(maxzyklus);
        display.setCursor(0, 20);
        display.println(F("Reset = EnterButton"));
        display.display();
      }
      reset();
      schrittmenu = hauptmenu;
      break;
  }
}
//Zyklenzähler auf Null stellen
void reset() {
  int selectPin = digitalRead(selectbutton);

  if (selectPin == LOW) {
    zyklus = 0;
  }
}

//Zyklenzahl verhändern
void zyklenUpDown() {
  int upPin = digitalRead(upbutton);
  int downPin = digitalRead(downbutton);

  mehrState = (upPin == LOW);
  if (mehrState != lastmehrState) {
    if (mehrState == LOW) {
      maxzyklus += 1;
    }
  }
  lastmehrState = mehrState;
  wenigerState = (downPin == LOW);
  if (wenigerState != lastwenigerState) {
    if (wenigerState == LOW) {
      maxzyklus -= 1;
    }
  }
  lastwenigerState = wenigerState;
}


//Foederband Schritkette
void schrittkette() {
  int startPin = digitalRead(startbutton);
  int stopPin = digitalRead(stopbutton);
  int sensorLinksEnd = digitalRead(sensorleft);
  int sensorRechtsEnd = digitalRead(sensorright);

  static unsigned long lastmillis;
  const unsigned long pauseZeit = 2000; // in ms

  if (stopPin == LOW )
  {
    schritt = off;
  }
  switch (schritt)
  {
    case warten: //Überwachung von Anlage Warten
      if (startPin == LOW )
      {
        schritt = on;
      }
      anhalten();
      break;
    case on: //Überwachung von Anlage An
      digitalWrite(LED_BUILTIN, HIGH);
      schritt = rechts;
      break;
    case rechts: //Überwachung von Rechtslauf
      nachrechts();
      if (sensorRechtsEnd == LOW )
      {
        schritt = haltrechts;
        lastmillis = millis();
      }
      break;
    case haltrechts: //Überwachung von Haltrechts
      anhalten();
      if (millis() - lastmillis > pauseZeit)
      {
        schritt = links;
      }
      break;
    case links: //Überwachung von Linkslauf
      nachlinks();
      if (sensorLinksEnd == LOW )
      {
        schritt = haltlinks;
        lastmillis = millis();
      }
      break;
    case haltlinks: //Überwachung von Haltlinks
      anhalten();
      if (millis() - lastmillis > pauseZeit)
      {
        if (zyklus == maxzyklus)
        {
          schritt = zyklusstoppen;
        }
        else
        {
          zyklus++;
          schritt = rechts;
        }
      }
      break;
    case off:  // Anlage ausgeschaltet
      digitalWrite(LED_BUILTIN, LOW);
      schritt = warten;
      break;
    case zyklusstoppen: // Überwachung von Maximun Zyklen
      anhalten();{
        if (zyklus == 0) {
          schritt = rechts;
        }
        else
        {
          schritt = off;
        }
      }
      break;
  }
}

//Motoren Anhalten
void anhalten() {
  digitalWrite(relaisRechts, relaisAus);
  digitalWrite(relaisLinks, relaisAus);
}

//Motoren Links laufend
void nachlinks() {
  digitalWrite(relaisRechts, relaisAus);
  digitalWrite(relaisLinks, relaisAn);
}

//Motoren Rechts laufend
void nachrechts() {
  digitalWrite(relaisLinks, relaisAus);
  digitalWrite(relaisRechts, relaisAn);
}

Haber ich wurde gerne auf den Code vom @Rentner aufbauen so das die one Button Lib und das abspeichern auf der Eeprom erfolgt.
Kann mir jemand dabei helfen.
Danke in vorraus

Hallo,
Dann nimm doch mal meine von Dir geänderte Vorlage und passe die Pinns auf Deine gewünschen Pins an, hast Du ja schon gemacht. Du hast die Ablaufsteuerung für das Förderband doch schon in einer eigene Funktion, dann kannst Du die ja einfach zusammnen mit den Motorfunktionen in die geänderte Vorlage kopieren. Dann die restlichen pins ergänzen.

Ich muss jetzt noch mal nachfragen was Dein Förderband eigentlich machen soll.
Du benötigst eine Zyklusanzahl und zwei Wartezeiten so wie ich das derzeit sehe.

  1. warten auf Taster start
  2. nach rechts bis Endschalter rechts
  3. Wartezeit 1
  4. nach links bis Endschalter links
  5. Wartezeit 2
  6. Wenn Zyklus erreicht stop dann auf 1
    ansonsten auf 2.

Da gibts jetzt eventuell noch ein kleines Problem wenn Du die Werte ändern willst während der Ablauf schon gestartet wurde. Am einfachsten kannst Du das verhindern in dem Du die Daten im aktuelle Schritt in Arbeitsvariable umlädst.
Heinz

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.