OLED Menü scrollen

Hallo,
ich habe ein Menü mit 10 Menüpunkte, bis "Menu 6" wird angezeigt.
Die anderen passen nicht auf das 128X64 Display aber ich bekomme das mit dem scrollen nicht hin.
Könnt ihr mir bitte weiter helfen?

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>

#define OLED_SDA 21
#define OLED_SCL 22

Adafruit_SH1106 display(21, 22);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2

int selected = 0;
int entered = -1;

void displaymenu(void) {

  int down = digitalRead(25);
  int up = digitalRead(26);
  int enter = digitalRead(27);
  int back = digitalRead(14);

  if (up == LOW && down == LOW) {
  };
  if (up == LOW) {
    selected = selected + 1;
    delay(200);
  };
  if (down == LOW) {
    selected = selected - 1;
    delay(200);
  };
  if (enter == LOW) {
    entered = selected;
  };
  if (back == LOW) {
    entered = -1;
  };
  const char *options[10] = {
    " Menu 1",
    " Menu 2",
    " Menu 3",
    " Menu 4 ",
    " Menu 5 ",
    " Menu 6 ",
    " Menu 7 ",
    " Menu 8 ",
    " Menu 9",
    " Menu 10"
  };

  if (entered == -1) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("menu test"));
    display.println("");
    for (int i = 0; i < 10; i++) {
      if (i == selected) {
        display.setTextColor(BLACK, WHITE);
        display.println(options[i]);
      } else if (i != selected) {
        display.setTextColor(WHITE);
        display.println(options[i]);
        //Serial.println(selected);

      }
    }


  } else if (entered == 0) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("Dsn menu test"));
    display.println("Menu option 1");
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.println("Dsn Menu system");
  } else if (entered == 1) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("Dsn menu test"));
    display.println("Menu option 2");
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.println("Dsn Menu system :)");
  }
  else if (entered == 2) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("Dsn menu test"));
    display.println("Menu option 3");
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.println("Dsn Menu system:)");
  } else if (entered == 3) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("Dsn menu test"));
    display.println("Menu option 4");
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.println("Dsn Menu system:)");
  } else if (entered == 4) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("Dsn menu test"));
    display.println("Menu option 5");
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.println("Dsn Menu system:)");
  } else if (entered == 5) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("Dsn menu test"));
    display.println("Menu option 6");
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.println("Dsn Menu system:)");
  } else if (entered == 6) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("Dsn menu test"));
    display.println("Menu option 7");
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.println("Dsn Menu system:)");

  } else if (entered == 7) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("Dsn menu test"));
    display.println("Menu option 8");
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.println("Dsn Menu system:)");
  } else if (entered == 8) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("Dsn menu test"));
    display.println("Menu option 9");
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.println("Dsn Menu system:)");
  } else if (entered == 9) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println(F("Dsn menu test"));
    display.println("Menu option 10");
    display.setTextColor(WHITE);
    display.setTextSize(2);
    display.println("Dsn Menu system:)");
  }

  display.display();
}

void setup() {
  pinMode(25, INPUT_PULLUP);
  pinMode(27, INPUT_PULLUP);
  pinMode(26, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);

  Serial.begin(9600);

  display.begin(SH1106_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  // Draw a single pixel in white
  display.drawPixel(10, 10, WHITE);
  display.display();
  delay(2000); // Pause for 2 seconds
}

void loop() {
  // put your main code here, to run repeatedly:
  displaymenu();
}

Ich würde da ein paar Konstanten rausholen und eine zusätzliche Variable für das sichtbare Fenster einführen. Ungefähr so:

const int NUM_LINES = 10;
const int VISIBLE_LINES = 6;
int windowsStart = 0;


[...]


if(selected < 0) {
  selected = 0;
}
if(selected >= NUM_LINES) {
  selected = NUM_LINES - 1;
}
if(windowStart > selected) {
  windowsStart = selected;
}
if((windowStart + VISIBLE_LINES - 1) < selected) {
  windowStart = selected - VISIBLE_LINES + 1;
}


[...]


for (int i = 0; i < VISIBLE_LINES; i++) {
      if (i + windowsStart >= NUM_LINES) {
        display.println("..."); 
      } else if (i == selected) {
        display.setTextColor(BLACK, WHITE);
        display.println(options[i + windowsStart]);
      } else if (i != selected) {
        display.setTextColor(WHITE);
        display.println(options[i + windowsStart]);
        //Serial.println(selected);

      }
    }
1 Like

oder in anderen Worten, wenn nicht platz für 10 Zeilen ist, halt nur jene Zeilen drucken, die man sehen kann.

Statt:

sowas wie:

for (int i = start; i < start+6; i++) {

danke,
soweit geht das nur der Weiße Hintergrund wird ab "Menu 7" nicht mehr angezeigt.

Ok habe es , vielen dank

} else if (i + windowStart == selected) {
        display.setTextColor(BLACK, WHITE);
        display.println(options[i + windowStart]);

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