u8g2.userInterfaceSelectionList - Frage

Ich bin dabei ein (Temperatur-)Messgerät auf Basis von 1-Wire-Sensoren zu entwickeln. Die Anzeige erfolgt auf einem I2C-OLED. Über Up/Down/OK/Clr-Tasten soll ein Menü bedient werden, um verschiedene “Messprogramme” aufrufen zu können. In der Hauptschleife läuft dann das Mess-Programm und wenn die Clr-Taste lange gedrückt wird, wird in das Menü verzweigt. Das klappt auch soweit, ich kann die Einträge auswählen, über die serielle Ausgabe sehe ich das. Leider wird in diesen “Unterprogrammen” nichts auf dem OLED ausgegeben. Ich habe schon versucht, clear-Display und clear-Buffer an andere Stellen im Ablauf zu setzen. Leider ohne Erfolg. Verträgt sich die ezButton-Bibliothek vielleicht nicht mit der U8g2-Bibliothek? Weiß jemand einen Rat?

#include <Arduino.h>
#include <U8g2lib.h>
#include <ezButton.h>
#include <Wire.h>

// OLED initialisieren
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// CLR-Taster zuweisen
ezButton CLR_btn(7);

// Menü-Einträge
const char *string_list =
  "Programm 1\n"
  "Porgramm 2";
uint8_t auswahl = 1;      // Menü-Auswahl bei Reboot

void setup(void)
{
  // OLED initialisieren und Taster zuweisen  
  u8g2.begin(8, 5, 6, U8X8_PIN_NONE, U8X8_PIN_NONE, 7);  

   // Schriftgröße
  u8g2.setFont(u8g2_font_helvB10_tf);

  // RS232 initialisieren
  Serial.begin(9600);

  // CLR-Taster initialisieren
  CLR_btn.setDebounceTime(50);

}

void Programm1()
{
  u8g2.clearDisplay();
  Serial.println("Programm '1' wurde gewählt!");
  delay(1500);
}
//
void Programm2()
{
  u8g2.clearDisplay();
  Serial.println("Programm '2' wurde gewählt!");
  u8g2.clearBuffer();
  u8g2.setCursor(0, 15);
  u8g2.print("Hello World!");
  delay(1500);
}

// Menü-Unterprogramm
int auswahl_menu()
{
  uint8_t current_selection = 1;         // Programm-Auswahl bei Aufruf
  u8g2.setFont(u8g2_font_helvB10_tf);
  current_selection = u8g2.userInterfaceSelectionList("Hauptmenü", current_selection, string_list);
  return current_selection;
}
// Hauptschleife
void loop(void)
{
  CLR_btn.loop();
  if (CLR_btn.isPressed())
  {
    auswahl = auswahl_menu();  
  }
  else
  switch (auswahl)
  {
    case 1:
    Programm1();
      break;
    case 2:
    Programm2();
      break;
  }
}

Hallo,
also irgendwie habe ich Dein Problem nicht verstanden. Du kannst mit dem button an pin7 in die function Programm1 oder Program2 verzweigen ? D.h das switch case klappt und einmal bekommst Du “Hello Word” angezeigt. Im anderen Fall sollte das Display leer bleiben. Es steht ja nichts zum Ausgeben in der Function Programm1.

Heinz

Du wählst mit _1_ Buffer Size 1, nutzt aber firstPage()/nextPage() nicht.

Siehe Buffer Size.

@Rentner:
Mit dem Button an Pin 7 springe ich in die Menü-Auswahl. Der Switch-Case funktioniert. “Hello Word” bekomme ich nie angezeigt, was ja mein Problem ist. Die andere Function ist leer, das ist richtig.

@agmue: firstPage()/nextPage() ist doch nur für grafische Anzeigen!?

Nö, das hat generell etwas mit speicherschonendem Vorgehen zu tun. Der Inhalt für die Anzeige wird häppchenweise im µC-Speicher gebildet und übertragen. Man könnte es auch firstPart()/nextPart() nennen.

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