Sketche mit einem Taster durchschalten

Hallo, ich mal wieder.
Mein Projekt ist nun schon weiter Fortgeschritten.
Ich habe nun ein paar einzelne Sketche, die für sich genauso funktionieren wie ich es mir vorstelle.
Nun meine Frage: wie bekomme ich diese Sketche zusammen gefasst, das diese mit einem Taster durchgeschaltet werden können, oder per Menü mit einem Taster angewählt werden können?

Gruß Christoph

Hallo,

Zeig uns doch mal die Sketches damit wir Dir helfen können. edit: Bitte in Codetages (</>)
Auf jeden Fall müssen alle delays raus.

Grüße,
Donny
Nachtrag:
Eigentlich brauchst Du “nur” eine Art state machine die, die einzelnen Programme durchschaltet. Also im Grunde ein Abfrage auf den Taster, ein switch-case und einen counter (zB: counter++;). Natürlich dürfen sich die einzelnen “Programme” nicht gegenseitig aushebeln. Variablen müssen zurückgesetzt werden oder anders benannt werden, das ist jetzt wieder nur Spekulation.

Hi

Ob Es sinnig ist, die Einzel-Funktionen der Einzel-Sketche auf einen großen Haufen zu kopieren und die Inhalt von loop() und setup() zusammen zu kleben - da habe ich so meine Zweifel.
Wenn NICHTS in den Einzelsketchen in einem anderen Sketch vor kommt, kann Das aber funktionieren - kostet aber wohl unnötig Speicher, da man bestimmt einige der Variablen zusammen fassen kann.

Du könntest versuchen, die einzelnen setup() zu setup_x() durchzunummerieren und in setup() nacheinander aufzurufen und in loop() per Variable entscheiden, in welche loop_x() Du springen willst.

Bedenke, daß Du ebenfalls in der loop() die Abfrage brauchst, um zwischen den Einzel-Sketchen umher zu schalten.

MfG

Mein Tipp:
Grundlagen lernen und die Sketche entsprechend aneinander anpassen, also jeweils neu schreiben.

Also, das sind meine Sketche…

/******************************************************************************
Wire OLED:
  VCC +5v
  GND GND
  SDA Analog pin 4
  SCL Analog pin 5
Wire Thermocouple max6675:
// check your pin connections are in this order!!
  GND to Arduino pinn 2
  VCC to Arduino pin 3   
  SCK to Arduino pin 4
  CS to Arduino pin 5
  SO to Arduino pin 6

******************************************************************************/


  #include <SPI.h>
  #include <Wire.h>
  #include "max6675.h"
  #include <U8g2lib.h>
  

//
  boolean centigrade = true; //Un REM this for Centigrade and REM out line below
//  boolean centigrade = false; // Un REM this for Fahrenheit and REM out line above
//
  
// setup u8g object
 
  U8G2_SSD1327_EA_W128128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
  
//
  double max = 215; // maximum temperature
  double min = -215; // minimum temperature
  int currentTemp = 0;
  String thisTemp = "";
  int maxTemp = 0; // maximum temperature reached
  int minTemp = 0; // minimum temperature reached
  int pad = 0;

//
// Thermocouple MAX 6675
//
  int thermoDO = 6;
  int thermoCS = 5;
  int thermoCLK = 4;
  MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
  int vccPin = 3;
  int gndPin = 2;
//
//
void draw(void) {
  u8g2.setFont(u8g2_font_crox3tb_tf);
  u8g2.drawStr(3,12, "Motortemperatur");
  u8g2.setFont(u8g2_font_7x13B_tf); 
 // show max temp reached 
  u8g2.drawStr(5,32, "max");
  if(maxTemp <= int(currentTemp)){ maxTemp = int(currentTemp);}
  thisTemp = String(maxTemp);
  if(centigrade){
    thisTemp = thisTemp + "\260C";
  }
  else{
    thisTemp = thisTemp + "\260F";    
  }
  const char* maxTempC = (const char*) thisTemp.c_str();
  u8g2.drawStr(29,32, maxTempC); 
 // show the min temp reached 
  u8g2.drawStr(70,32, "min");
  if(minTemp >= int(currentTemp)){ minTemp = int(currentTemp);}
  thisTemp = String(minTemp);
  if(centigrade){
    thisTemp = thisTemp + "\260C";
  }
  else{
    thisTemp = thisTemp + "\260F";    
  }
  const char* minTempC = (const char*) thisTemp.c_str();
  u8g2.drawStr(94,32, minTempC);  
 
  u8g2.setFont(u8g2_font_logisoso38_tf);
  if(currentTemp > 99){pad = 2;}
  if(currentTemp > 9 && currentTemp < 100){pad = 25;}
  if(currentTemp < 10){pad = 18;}  
  thisTemp = String(currentTemp);
  if(centigrade){
    thisTemp = thisTemp + "\260C";
  }
  else{
    thisTemp = thisTemp + "\260F";    
  } 
  const char* newDispC = (const char*) thisTemp.c_str(); 
  u8g2.drawStr(pad,95, newDispC);
}

void setup(void) {
  Serial.begin(9600);
  Wire.begin(); 
  u8g2.begin(); 
  // use Arduino pins 
  pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);  
  delay(500); // wait for MAX chip to stabilise
  if(centigrade){
    currentTemp = thermocouple.readCelsius();
    minTemp = int(thermocouple.readCelsius());
    maxTemp = int(thermocouple.readCelsius());    
  }
  else{
    currentTemp = thermocouple.readFahrenheit();   
    minTemp = int(thermocouple.readFahrenheit());
    maxTemp = int(thermocouple.readFahrenheit());    
  }

}

void loop(void) {
  currentTemp = 0;
  for(int f = 0; f <25; f++){
    if(centigrade){
     currentTemp = thermocouple.readCelsius() + currentTemp; 
    }
    else{
      currentTemp = thermocouple.readFahrenheit() + currentTemp;     
    }
  }
  currentTemp = currentTemp/25;  // averages out 25 readings
  // picture loop
  u8g2.firstPage();  
  do {
    draw();
  } while( u8g2.nextPage() );
  
  // rebuild the picture after some delay
  delay(50);
}
// Stellungsschalter
//br - 5V
//GND-10kOhm-ge/bl-13
//GND-10kOhm-ge/ws-12
//GND-10kOhm-ge/sw-10



#include <SPI.h>
#include <Wire.h>
#include "U8g2lib.h"

U8G2_SSD1327_EA_W128128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

const byte T1 = 10;
const byte T2 = 11;
const byte T3 = 12;

bool t1, t2, t3;
char buf[] = "X";

void setup() {
  pinMode(T1, INPUT_PULLUP);
  pinMode(T2, INPUT_PULLUP);
  pinMode(T3, INPUT_PULLUP);
  
  u8g2.begin();

  ausgabe(buf);
}

void loop() {
  t1 = !digitalRead(T1);
  t2 = !digitalRead(T2);
  t3 = !digitalRead(T3);

  if (!t1 && !t2 && !t3) {
    buf[0] = 'N';
  }
  if (!t1 && !t2 && t3) {
    buf[0] = '1';
  }
  if (t1 && !t2 && !t3) {
    buf[0] = '2';
  }
    if (t1 && !t2 && t3) {
    buf[0] = '3';
  }  
    if (!t1 && t2 && !t3) {
    buf[0] = '4';
  }
    if (t1 && t2 && !t3) {
    buf[0] = '5';
  
  }
  ausgabe(buf);
}

void ausgabe(char * text) {
  static char vergleich[] = " ";
  if (0 != strncmp ( vergleich, text, 1 )) {
    strncpy ( vergleich, text, 1 );
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g2_font_6x12_tr);
      u8g2.drawStr(5, 22, "Gang");
      u8g2.setFont(u8g2_font_logisoso58_tf);
      u8g2.drawStr(47, 75, text);
    } while ( u8g2.nextPage() );
  }
}
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <ds3231.h>
#include <RTClib.h>
#include "DHT.h"
#define DHTPIN 2 
#define DHTTYPE DHT11

RTC_DS1307 RTC;
DHT dht(DHTPIN, DHTTYPE, 7);
char str[10];

U8G2_SSD1327_EA_W128128_2_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // ESP32 Thing, HW I2C with pin remapping

void setup () {
  
  
  Wire.begin();
  u8g2.begin();
}

void loop () {
  DateTime now = RTC.now();
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
    u8g2.setCursor(27, 10);
    if (now.day() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.day(), DEC);
    u8g2.print('.');
    if (now.month() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.month(), DEC);
    u8g2.print('.');
    u8g2.print(now.year(), DEC);
    u8g2.setFont(u8g2_font_logisoso38_tn);
    u8g2.setCursor(3, 67);
    if (now.hour() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.hour(), DEC);
    u8g2.print(':');
    if (now.minute() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.minute(), DEC);

    u8g2.setFont(u8g_font_helvB12);

 

  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
  

    
    u8g2.drawStr( 37, 95, dtostrf(t, 5, 2, str));
    u8g2.drawStr( 80, 95, "\260C");
 } while (u8g2.nextPage());
  
  delay (1000);}

oder gibt es eine möglichkeit das in eine art menü unterzubringen?

Hi

Die RTC1307 solltest Du gegen eine 3231/3232 tauschen, wenn Du nicht schon in zwei Stunden einen Minutenversatz haben willst.
Die 3231 hat nur wenige Sekunden im JAHR (ist Temperatur-kompensiert, darum kann man von Ihr auch die Umgebungstemperatur auslesen - wird alle 64 Sekunden aktualisiert).

Die U8G2-Instanz ist in allen drei Sketchen die Gleiche - 1x reicht.

In setup() Alles rein, was in den setup()s steht - aber eben nur 1x.
Du musst z.B. nicht 3x wire.begin schreiben :wink:

Die loop()s sturr in den Sketch kopiert und loop_1() bis loop_3() genannt.
Vorerst in loop() nur eine der loop_?() aufrufen - kompilieren.
Fehler beseitigen, neu kompilieren, hochladen.
Andere loop_? eintragen (oder im 10 Sekunden-Takt wechseln lassen) und testen.

Nun überlegst Du Dir, wie Du die Umschaltung machen kannst - und programmierst auch Das.

Motortemperatur 'riecht' etwas nach KFZ - Du brauchst im KFZ eine saubere Spannung für Deine Elektronik.
Auch kannst Du Dir böse Störungen auf Deine Sensoren rein holen - Das kann eine ganze Zeit gut gehen, muß aber nicht.
Wenn Aus weil kaputt, dann Aus weil kaputt.

Letztes nur, daß Du Das gehört hast und bei Ausfall nicht aus allen Wolken fällst.

MfG

Hi postmaster,
eigentlich benutze ich eine DS3231, wenn ich die zeile

RTC_DS1307 RTC;

weg nehme funktioniert es nicht mehr, warum auch immer.

Ja, du hast recht. Es soll ein Zusatzinstument für ein Motorrad werden.
Als Spannungsversorgung würde ich ein LM2596S Step down Modul nehmen.

ich werde es mal ausprobieren.

wie wurde so etwas als menü funktionieren?

ähnlich aufgebaut wie dieses?

/*
Copyright (c) by Ruebn Gaertner
2017-09-19
*/

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

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

int pic = 0;
int maxPics_L1 = 5;
int maxPics_L2 = 3;

int button_brd = 12;

OneButton button(button_brd,true);

long lastmillis = 0;
long maxtime = 30000;

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup()   {
button.attachClick(click);
button.attachDoubleClick(doubleclick);
button.attachLongPressStop(longPressStop);
button.attachLongPressStart(longPressStart);

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)
display.clearDisplay();
}

void loop() {
  button.tick();

//JUMP TO DEFAULT IF NO CLICK IS DETECTED
if (millis() >= (lastmillis + maxtime))
{
    pic = 0;
}

if (pic == 0)
{
  header();
  display.setCursor(0,11);
  display.print  ("UNIT: none");
  display.setTextSize(4);
  display.setCursor(  0,   21);
  display.print ("0.0");
  refresh();
}
//LAYER 1////////////////////////////////////////////////////
if (pic == 1)
{
  header();
  display.setCursor(0,11);  display.print (">PARAMETERS");
  display.setCursor(0,20);  display.print (" DATA RECORD");
  display.setCursor(0,29);  display.print (" DISPLAY");
  display.setCursor(0,47);  display.print (" HELP");
  display.setCursor(0,56);  display.print (" PROJECT INFO");
  refresh();
}

if (pic == 2)
{
  header();
  display.setCursor(0,11);  display.print (" PARAMETERS");
  display.setCursor(0,20);  display.print (">DATA RECORD");
  display.setCursor(0,29);  display.print (" DISPLAY");
  display.setCursor(0,47);  display.print (" HELP");
  display.setCursor(0,56);  display.print (" PROJECT INFO");
  refresh();
}

if (pic == 3)
{
  header();
  display.setCursor(0,11);  display.print (" PARAMETERS");
  display.setCursor(0,20);  display.print (" DATA RECORD");
  display.setCursor(0,29);  display.print (">DISPLAY");
  display.setCursor(0,47);  display.print (" HELP");
  display.setCursor(0,56);  display.print (" PROJECT INFO");
  refresh();
}

if (pic == 4)
{
  header();
  display.setCursor(0,11);  display.print (" PARAMETERS");
  display.setCursor(0,20);  display.print (" DATA RECORD");
  display.setCursor(0,29);  display.print (" DISPLAY");
  display.setCursor(0,47);  display.print (">HELP");
  display.setCursor(0,56);  display.print (" PROJECT INFO");
  refresh();
}

if (pic == 5)
{
  header();
  display.setCursor(0,11);  display.print (" PARAMETERS");
  display.setCursor(0,20);  display.print (" DATA RECORD");
  display.setCursor(0,29);  display.print (" DISPLAY");
  display.setCursor(0,47);  display.print (" HELP");
  display.setCursor(0,56);  display.print (">PROJECT INFO");
  refresh();
}

//LAYER 2////////////////////////////////////////////////////
if (pic == 11)
{
  header();
  display.setCursor(0,11);  display.print ("PARAMETERS");
  display.setCursor(0,20);  display.print (">UNIT:");
  display.setCursor(90,20); display.print ("none");
  display.setCursor(0,29);  display.print (" SIGNALS:");
  display.setCursor(90,29); display.print ("6");
  display.setCursor(0,38);  display.print (" DIAMETER [mm]:");
  display.setCursor(90,38); display.print ("9999");
  refresh();
}

if (pic == 21)
{
  header();
  display.setCursor(0,11);  display.print ("PARAMETERS");
  display.setCursor(0,20);  display.print (" UNIT:");
  display.setCursor(90,20); display.print ("none");
  display.setCursor(0,29);  display.print (">SIGNALS:");
  display.setCursor(90,29); display.print ("6");
  display.setCursor(0,38);  display.print (" DIAMETER [mm]:");
  display.setCursor(90,38); display.print ("9999");
  refresh();
}

if (pic == 31)
{
  header();
  display.setCursor(0,11);  display.print ("PARAMETERS");
  display.setCursor(0,20);  display.print (" UNIT:");
  display.setCursor(90,20); display.print ("none");
  display.setCursor(0,29);  display.print (" SIGNALS:");
  display.setCursor(90,29); display.print ("6");
  display.setCursor(0,38);  display.print (">DIAMETER [mm]:");
  display.setCursor(90,38); display.print ("9999");
  refresh();
}

if (pic == 12)
{
  header();
  display.setCursor(0,11);  display.print ("DATA RECORD");
  display.setCursor(0,20);  display.print ("VAL0");
  display.setCursor(0,29);  display.print ("VAL1");
  display.setCursor(0,38);  display.print ("VAL2");
  display.setCursor(0,47);  display.print ("VAL3");
  display.setCursor(0,56);  display.print ("VAL4");
  refresh();
}

if (pic == 13)
{
  header();
  display.setCursor(0,11);  display.print ("DISPLAY");
  display.setCursor(0,20);  display.print ("VAL0");
  display.setCursor(0,29);  display.print ("VAL1");
  display.setCursor(0,38);  display.print ("VAL2");
  display.setCursor(0,47);  display.print ("VAL3");
  display.setCursor(0,56);  display.print ("VAL4");
  refresh();
}

if (pic == 14)
{
  header();
  display.setCursor(0,11);  display.print ("HELP");
  display.setCursor(0,20);  display.print ("VAL0");
  display.setCursor(0,29);  display.print ("VAL1");
  display.setCursor(0,38);  display.print ("VAL2");
  display.setCursor(0,47);  display.print ("VAL3");
  display.setCursor(0,56);  display.print ("VAL4");
  refresh();
}

if (pic == 15)
{
  header();
  display.setCursor(0,11);  display.print ("PROJECT INFO");
  display.setCursor(0,20);  display.print ("NAME:");
  display.setCursor(50,20); display.print ("OLED_MENU");
  display.setCursor(0,29);  display.print ("DATE:");
  display.setCursor(50,29); display.print ("2017/09/19");
  display.setCursor(0,38);  display.print ("BY:");
  display.setCursor(50,38); display.print ("R. GAERTNER");
  refresh();
}

}

////////////////////////////////////////////////////////////////////////////////////////////////////////
void click(){
  lastmillis = millis();
  if(pic>=0 && pic<10)
  {
    if (pic >= maxPics_L1)
    {
      pic=1;
    }
    else if(pic < maxPics_L1)
    {
      pic++;
    }
  }

  if(pic>=10 && pic<100)
  {
    if (pic > 30)
    {
      pic=11;
    }
    else if (pic < 30)
    {
      pic=pic+10;
    }
  }
}

void doubleclick(){
  lastmillis = millis();
  if (pic == 11 || pic == 21 || pic == 31) pic=1;
  if (pic == 12) pic=2;
  if (pic == 13) pic=3;
  if (pic == 14) pic=4;
  if (pic == 15) pic=5;
}

void longPressStart(){
  lastmillis = millis();
  if (pic>0 & pic<10)
  {
    pic=pic+10;
  }
}

void longPressStop(){
    ;
}

void header()
{
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(22,0);  display.print("rg-electronics");
  display.drawLine (0,9,128,9, WHITE);
}

void refresh()
{
  display.display();
  delay(00);
  display.clearDisplay();
}

Ok, Dein Mopped wird keine 49 Tage 'am Stück' fahren - aber Das solltest Du Dir trotzdem anders angewöhnen:

if (millis() >= (lastmillis + maxtime))
{
    pic = 0;
}

Diese Vergleiche IMMER millis()-Startzeit>=Wartezeit.

Sobald Startzeit (lastmillis) + Wartezeit überläuft (>32 Bit wird), ist das Ergebnis gaaaanz klein und diese Zeile trifft danach IMMER zu, bis millis() überläuft (alle 49,batsch Tage).
Beim Abziehen kompensiert sich dieser Überlauf (bzw. die beiden Überläufe, Der von millis() und Der der Berechnung).

Auch musst Du das Display nur mit neuem Inhalt fluten, wenn neuer Inhalt da ist.
Nicht in jeder loop()-Runde gibt's was Neues für auf's Display.
Schon Deinen Arduino und sabbel das Display nicht unnötig voll :wink:

Kurz überflogen sehe ich nicht, warum Das nicht funktionieren sollte.
Der Kompiler wird meine Meinung bestimmt widerlegen - dann musst Du Dich um Ihn kümmern.

MfG

So, habe nun ein Menü gefunden welches meinen Vorsellungen entspricht, leider bekomme ich es nicht ans laufen / bekomme es nicht auf das SSD1327 mit U8g2 umgeschrieben, wo ist mein Fehler?

Original Sketch

/*
Copyright (c) by Ruebn Gaertner
2017-09-19
*/

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

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

int pic = 0;
int maxPics_L1 = 5;
int maxPics_L2 = 3;

int button_brd = 12;

OneButton button(button_brd,true);

long lastmillis = 0;
long maxtime = 30000;

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup()   {
button.attachClick(click);
button.attachDoubleClick(doubleclick);
button.attachLongPressStop(longPressStop);
button.attachLongPressStart(longPressStart);

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)
display.clearDisplay();
}

void loop() {
  button.tick();

//JUMP TO DEFAULT IF NO CLICK IS DETECTED
if (millis() >= (lastmillis + maxtime))
{
    pic = 0;
}

if (pic == 0)
{
  header();
  display.setCursor(0,11);
  display.print  ("UNIT: none");
  display.setTextSize(4);
  display.setCursor(  0,   21);
  display.print ("0.0");
  refresh();
}
//LAYER 1////////////////////////////////////////////////////
if (pic == 1)
{
  header();
  display.setCursor(0,11);  display.print (">PARAMETERS");
  display.setCursor(0,20);  display.print (" DATA RECORD");
  display.setCursor(0,29);  display.print (" DISPLAY");
  display.setCursor(0,47);  display.print (" HELP");
  display.setCursor(0,56);  display.print (" PROJECT INFO");
  refresh();
}

if (pic == 2)
{
  header();
  display.setCursor(0,11);  display.print (" PARAMETERS");
  display.setCursor(0,20);  display.print (">DATA RECORD");
  display.setCursor(0,29);  display.print (" DISPLAY");
  display.setCursor(0,47);  display.print (" HELP");
  display.setCursor(0,56);  display.print (" PROJECT INFO");
  refresh();
}

if (pic == 3)
{
  header();
  display.setCursor(0,11);  display.print (" PARAMETERS");
  display.setCursor(0,20);  display.print (" DATA RECORD");
  display.setCursor(0,29);  display.print (">DISPLAY");
  display.setCursor(0,47);  display.print (" HELP");
  display.setCursor(0,56);  display.print (" PROJECT INFO");
  refresh();
}

if (pic == 4)
{
  header();
  display.setCursor(0,11);  display.print (" PARAMETERS");
  display.setCursor(0,20);  display.print (" DATA RECORD");
  display.setCursor(0,29);  display.print (" DISPLAY");
  display.setCursor(0,47);  display.print (">HELP");
  display.setCursor(0,56);  display.print (" PROJECT INFO");
  refresh();
}

if (pic == 5)
{
  header();
  display.setCursor(0,11);  display.print (" PARAMETERS");
  display.setCursor(0,20);  display.print (" DATA RECORD");
  display.setCursor(0,29);  display.print (" DISPLAY");
  display.setCursor(0,47);  display.print (" HELP");
  display.setCursor(0,56);  display.print (">PROJECT INFO");
  refresh();
}

//LAYER 2////////////////////////////////////////////////////
if (pic == 11)
{
  header();
  display.setCursor(0,11);  display.print ("PARAMETERS");
  display.setCursor(0,20);  display.print (">UNIT:");
  display.setCursor(90,20); display.print ("none");
  display.setCursor(0,29);  display.print (" SIGNALS:");
  display.setCursor(90,29); display.print ("6");
  display.setCursor(0,38);  display.print (" DIAMETER [mm]:");
  display.setCursor(90,38); display.print ("9999");
  refresh();
}

if (pic == 21)
{
  header();
  display.setCursor(0,11);  display.print ("PARAMETERS");
  display.setCursor(0,20);  display.print (" UNIT:");
  display.setCursor(90,20); display.print ("none");
  display.setCursor(0,29);  display.print (">SIGNALS:");
  display.setCursor(90,29); display.print ("6");
  display.setCursor(0,38);  display.print (" DIAMETER [mm]:");
  display.setCursor(90,38); display.print ("9999");
  refresh();
}

if (pic == 31)
{
  header();
  display.setCursor(0,11);  display.print ("PARAMETERS");
  display.setCursor(0,20);  display.print (" UNIT:");
  display.setCursor(90,20); display.print ("none");
  display.setCursor(0,29);  display.print (" SIGNALS:");
  display.setCursor(90,29); display.print ("6");
  display.setCursor(0,38);  display.print (">DIAMETER [mm]:");
  display.setCursor(90,38); display.print ("9999");
  refresh();
}

if (pic == 12)
{
  header();
  display.setCursor(0,11);  display.print ("DATA RECORD");
  display.setCursor(0,20);  display.print ("VAL0");
  display.setCursor(0,29);  display.print ("VAL1");
  display.setCursor(0,38);  display.print ("VAL2");
  display.setCursor(0,47);  display.print ("VAL3");
  display.setCursor(0,56);  display.print ("VAL4");
  refresh();
}

if (pic == 13)
{
  header();
  display.setCursor(0,11);  display.print ("DISPLAY");
  display.setCursor(0,20);  display.print ("VAL0");
  display.setCursor(0,29);  display.print ("VAL1");
  display.setCursor(0,38);  display.print ("VAL2");
  display.setCursor(0,47);  display.print ("VAL3");
  display.setCursor(0,56);  display.print ("VAL4");
  refresh();
}

if (pic == 14)
{
  header();
  display.setCursor(0,11);  display.print ("HELP");
  display.setCursor(0,20);  display.print ("VAL0");
  display.setCursor(0,29);  display.print ("VAL1");
  display.setCursor(0,38);  display.print ("VAL2");
  display.setCursor(0,47);  display.print ("VAL3");
  display.setCursor(0,56);  display.print ("VAL4");
  refresh();
}

if (pic == 15)
{
  header();
  display.setCursor(0,11);  display.print ("PROJECT INFO");
  display.setCursor(0,20);  display.print ("NAME:");
  display.setCursor(50,20); display.print ("OLED_MENU");
  display.setCursor(0,29);  display.print ("DATE:");
  display.setCursor(50,29); display.print ("2017/09/19");
  display.setCursor(0,38);  display.print ("BY:");
  display.setCursor(50,38); display.print ("R. GAERTNER");
  refresh();
}

}

////////////////////////////////////////////////////////////////////////////////////////////////////////
void click(){
  lastmillis = millis();
  if(pic>=0 && pic<10)
  {
    if (pic >= maxPics_L1)
    {
      pic=1;
    }
    else if(pic < maxPics_L1)
    {
      pic++;
    }
  }

  if(pic>=10 && pic<100)
  {
    if (pic > 30)
    {
      pic=11;
    }
    else if (pic < 30)
    {
      pic=pic+10;
    }
  }
}

void doubleclick(){
  lastmillis = millis();
  if (pic == 11 || pic == 21 || pic == 31) pic=1;
  if (pic == 12) pic=2;
  if (pic == 13) pic=3;
  if (pic == 14) pic=4;
  if (pic == 15) pic=5;
}

void longPressStart(){
  lastmillis = millis();
  if (pic>0 & pic<10)
  {
    pic=pic+10;
  }
}

void longPressStop(){
    ;
}

void header()
{
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(22,0);  display.print("rg-electronics");
  display.drawLine (0,9,128,9, WHITE);
}

void refresh()
{
  display.display();
  delay(00);
  display.clearDisplay();
}

Mein umgeschriebener Sketch

#include <Adafruit_GFX.h>
#include <U8g2lib.h>
#include <OneButton.h>



int pic = 0;
int maxPics_L1 = 5;
int maxPics_L2 = 3;

int button_brd = 12;

OneButton button(button_brd,true);

long lastmillis = 0;
long maxtime = 30000;

U8G2_SSD1327_EA_W128128_2_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup()   {
button.attachClick(click);
button.attachDoubleClick(doubleclick);
button.attachLongPressStop(longPressStop);
button.attachLongPressStart(longPressStart);

u8g2.begin();
u8g2.clearDisplay();
u8g2.firstPage();
do{


}
void loop() {
  button.tick();

//JUMP TO DEFAULT IF NO CLICK IS DETECTED
if (millis() >= (lastmillis + maxtime))
{
    pic = 0;
}

if (pic == 0)
{
  header();
  u8g2.setCursor(0,11);
  u8g2.print  ("UNIT: none");
  u8g2.setFont(u8g2_font_crox2hb_tr);
  u8g2.setCursor(  0,   21);
  u8g2.print ("0.0");
  refresh();
}
//LAYER 1////////////////////////////////////////////////////
if (pic == 1)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print (">START");
  u8g2.setCursor(0,20);  u8g2.print (" MOTORTEMPERATUR");
  u8g2.setCursor(0,29);  u8g2.print (" UHRZEIT");
  u8g2.setCursor(0,47);  u8g2.print (" GANG");
  u8g2.setCursor(0,56);  u8g2.print (" RDKS");
  refresh();
}

if (pic == 2)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print (" START");
  u8g2.setCursor(0,20);  u8g2.print (">MOTORTEMPERATUR");
  u8g2.setCursor(0,29);  u8g2.print (" UHRZEIT");
  u8g2.setCursor(0,47);  u8g2.print (" GANG");
  u8g2.setCursor(0,56);  u8g2.print (" RDKS");
  refresh();
}

if (pic == 3)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print (" START");
  u8g2.setCursor(0,20);  u8g2.print (" MOTORTEMPERATUR");
  u8g2.setCursor(0,29);  u8g2.print (">UHRZEIT");
  u8g2.setCursor(0,47);  u8g2.print (" GANG");
  u8g2.setCursor(0,56);  u8g2.print (" RDKS");
  refresh();
}

if (pic == 4)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print (" START");
  u8g2.setCursor(0,20);  u8g2.print (" MOTORTEMPERATUR");
  u8g2.setCursor(0,29);  u8g2.print (" UHRZEIT");
  u8g2.setCursor(0,47);  u8g2.print (">GANG");
  u8g2.setCursor(0,56);  u8g2.print (" RDKS");
  refresh();
}

if (pic == 5)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print (" START");
  u8g2.setCursor(0,20);  u8g2.print (" MOTORTEMPERATUR");
  u8g2.setCursor(0,29);  u8g2.print (" UHRZEIT");
  u8g2.setCursor(0,47);  u8g2.print (" GANG");
  u8g2.setCursor(0,56);  u8g2.print (">RDKS");
  refresh();
}

//LAYER 2////////////////////////////////////////////////////
if (pic == 11)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print ("START");
  u8g2.setCursor(0,20);  u8g2.print (">UNIT:");
  u8g2.setCursor(90,20); u8g2.print ("none");
  u8g2.setCursor(0,29);  u8g2.print (" SIGNALS:");
  u8g2.setCursor(90,29); u8g2.print ("6");
  u8g2.setCursor(0,38);  u8g2.print (" DIAMETER [mm]:");
  u8g2.setCursor(90,38); u8g2.print ("9999");
  refresh();
}

if (pic == 21)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print ("START");
  u8g2.setCursor(0,20);  u8g2.print (" UNIT:");
  u8g2.setCursor(90,20); u8g2.print ("none");
  u8g2.setCursor(0,29);  u8g2.print (">SIGNALS:");
  u8g2.setCursor(90,29); u8g2.print ("6");
  u8g2.setCursor(0,38);  u8g2.print (" DIAMETER [mm]:");
  u8g2.setCursor(90,38); u8g2.print ("9999");
  refresh();
}

if (pic == 31)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print ("START");
  u8g2.setCursor(0,20);  u8g2.print (" UNIT:");
  u8g2.setCursor(90,20); u8g2.print ("none");
  u8g2.setCursor(0,29);  u8g2.print (" SIGNALS:");
  u8g2.setCursor(90,29); u8g2.print ("6");
  u8g2.setCursor(0,38);  u8g2.print (">DIAMETER [mm]:");
  u8g2.setCursor(90,38); u8g2.print ("9999");
  refresh();
}

if (pic == 12)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print ("MOTORTEMPERATUR");
  u8g2.setCursor(0,20);  u8g2.print ("VAL0");
  u8g2.setCursor(0,29);  u8g2.print ("VAL1");
  u8g2.setCursor(0,38);  u8g2.print ("VAL2");
  u8g2.setCursor(0,47);  u8g2.print ("VAL3");
  u8g2.setCursor(0,56);  u8g2.print ("VAL4");
  refresh();
}

if (pic == 13)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print ("UHRZEIT");
  u8g2.setCursor(0,20);  u8g2.print ("VAL0");
  u8g2.setCursor(0,29);  u8g2.print ("VAL1");
  u8g2.setCursor(0,38);  u8g2.print ("VAL2");
  u8g2.setCursor(0,47);  u8g2.print ("VAL3");
  u8g2.setCursor(0,56);  u8g2.print ("VAL4");
  refresh();
}

if (pic == 14)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print ("GANG");
  u8g2.setCursor(0,20);  u8g2.print ("VAL0");
  u8g2.setCursor(0,29);  u8g2.print ("VAL1");
  u8g2.setCursor(0,38);  u8g2.print ("VAL2");
  u8g2.setCursor(0,47);  u8g2.print ("VAL3");
  u8g2.setCursor(0,56);  u8g2.print ("VAL4");
  refresh();
}

if (pic == 15)
{
  header();
  u8g2.setCursor(0,11);  u8g2.print ("RDKS");
  u8g2.setCursor(0,20);  u8g2.print ("NAME:");
  u8g2.setCursor(50,20); u8g2.print ("OLED_MENU");
  u8g2.setCursor(0,29);  u8g2.print ("DATE:");
  u8g2.setCursor(50,29); u8g2.print ("2017/09/19");
  u8g2.setCursor(0,38);  u8g2.print ("BY:");
  u8g2.setCursor(50,38); u8g2.print ("R. GAERTNER");
  refresh();
}

}

////////////////////////////////////////////////////////////////////////////////////////////////////////
void click(){
  lastmillis = millis();
  if(pic>=0 && pic<10)
  {
    if (pic >= maxPics_L1)
    {
      pic=1;
    }
    else if(pic < maxPics_L1)
    {
      pic++;
    }
  }

  if(pic>=10 && pic<100)
  {
    if (pic > 30)
    {
      pic=11;
    }
    else if (pic < 30)
    {
      pic=pic+10;
    }
  }
}

void doubleclick(){
  lastmillis = millis();
  if (pic == 11 || pic == 21 || pic == 31) pic=1;
  if (pic == 12) pic=2;
  if (pic == 13) pic=3;
  if (pic == 14) pic=4;
  if (pic == 15) pic=5;
}

void longPressStart(){
  lastmillis = millis();
  if (pic>0 & pic<10)
  {
    pic=pic+10;
  }
}

void longPressStop(){
    ;
}

void header()
{
  u8g2.setFont(u8g2_font_crox2hb_tr);
  u8g2.setCursor(22,0);  u8g2.print("rg-electronics");

}

void refresh()
{
  } while (u8g2.nextPage());
  delay(00);
  u8g2.clearDisplay();
}

Hi

Kommentare werden hierzulande deutlich überbewertet ... äh, nein, eigentlich gar nicht.

'Bekomme nicht zum laufen' ist - Mist.
Was klappt, was nicht?
Ist der Fehler reproduzierbar?

Was mir an Deinem Sketch nicht gefällt: Du gibst zig Mal den gleichen Text aus, einziger Unterschied, irgendwo ist ein > statt eines Leerzeichen.
Ok, solange man noch genug Platz hat ... oder einen dickeren Arduino nehmen kann, ist Das eine durchaus funktionierende Vorgehensweise.

Pic ist Deine aktuelle Menü-'Seite'?
maxPics_L? ist die Anzahl der Menüpunkte des Layer '?' ??

Ich möchte micht nicht hier durch Deinen Sketch hindurch denken müssen, Das hast Du bereits getan und kannst mir Da deutlich Zeit einsparen - auch für Dich werden die Kommentare in spätestens einer Woche Gold wert sein.

MfG

Mit dem SSD1306 Display funktioniert er( es wird auf auf dem Display angezeigt und lässt sich schalten)
Das SSD1327 bleibt dunkel.
Ich habe display durch u8g2 ersetzt