ESP32 + 1306 Display + u8g2 // Simples Menu und Navigation

Hallo Zusammen,

ich bin gerade an meinem ersten Arduino-Projekt dran. Ich habe eine Espresso-Maschine und eine Bluetooth-Waage. Die Espresso kann man via Pullup anzapfen - Das ist mein Plan.

Die Programm-Logic bekomme ich hin, woran ich gerade scheitere ist ein gescheites Menü, konkret frage ich mich wie ich am geschicktesten durchs Menü navigieren kann (Mit einem Rotary Encoder).

U8g2 liegt im "loop()" block und iteriert sich unendlich. Die angegebenen Werte kann ich dynamisch anpassen, sodass die u8g2 library diese dann ändert. Wenn ich den Menüpunkt aktivieren möchte, habe ich eine Variable gesetzt, die dann den wert "current_screen" anpasst und somit ins untermenü springt. Wenn ich dort jetzt aber eine Abfrage zum setzen der Gramm-Anzahl habe bin ich überfordert wie ich dies anstellen soll.

Habt ihr Tipps, Buzzwords etc nach denen ich Googeln kann? Mir fällt tatsächlich nichts mehr ein.

Danke!

/*

1 Shot Gramm --> 45  | Angabe des Gewichts in Gramm für einen Single-Shot
2 Shot Gramm  --> 22,5 | Angabe des Gewichts in Gramm für einen Duo-Shot
BLE-Mac -> 00:12:12:12:12: | Angabe der MAC-Addresse für die Bluetooth-Verbindung
Clean --> Reinigungsroutine 
Info: --> 


*/


#include <U8g2lib.h>
#include <AiEsp32RotaryEncoder.h>
#include <Wire.h>

// Setup Display
U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// Pins for Rotary Encoder
#define ROTARY_ENCODER_A_PIN 25
#define ROTARY_ENCODER_B_PIN 26
#define ROTARY_ENCODER_BUTTON_PIN 27
#define ROTARY_ENCODER_VCC_PIN -1
#define ROTARY_ENCODER_STEPS 4


// Variables Declaration
const int NUM_ITEMS = 5;         // number of items in the list and also the number of screenshots and screenshots with QR codes (other screens)
const int MAX_ITEM_LENGTH = 20;  // maximum characters for the item name

char menu_items[NUM_ITEMS][MAX_ITEM_LENGTH] = {  // array with item names
  { "1 Shot gramm" },
  { "2 Shot gramm" },
  { "BLE-Mac" },
  { "Clean" },
  { "Info" }
};

int item_selected = 0;  // which item in the menu is selected
int item_sel_previous;  // previous item - used in the menu screen to draw the item before the selected one
int item_sel_next;      // next item - used in the menu screen to draw next item after the selected one

int current_screen = 1;  // 0 - Dashboard, 1 = Menu, 2 = 1Shot ...



AiEsp32RotaryEncoder rotaryEncoder(ROTARY_ENCODER_A_PIN, ROTARY_ENCODER_B_PIN, ROTARY_ENCODER_BUTTON_PIN, ROTARY_ENCODER_VCC_PIN, ROTARY_ENCODER_STEPS);

// Menüeinstellungen

void IRAM_ATTR readEncoderISR() {
  rotaryEncoder.readEncoder_ISR();
}


void setup() {
  // Serial Begin
  Serial.begin(115200);

  // Init Display
  oled.begin();

  // init Rotary Encoder
  rotaryEncoder.begin();
  rotaryEncoder.setup(readEncoderISR);
  rotaryEncoder.setBoundaries(0, NUM_ITEMS - 1, false);
}

void loop() {
  //Switch Menu Rotary Encoder
  if (rotaryEncoder.encoderChanged()) {
    item_selected = rotaryEncoder.readEncoder();
    if (item_selected < 0) item_selected = NUM_ITEMS - 1;
    if (item_selected >= NUM_ITEMS) item_selected = 0;
  }

  if (rotaryEncoder.isEncoderButtonClicked()) {
    rotary_onButtonClick(item_selected);
  } else if (rotaryEncoder.isEncoderButtonClicked() && current_screen == 4) {
    rotary_onButtonClick(1);
  }

  Serial.println(rotaryEncoder.readEncoder());

  // set correct values for the previous and next items
  item_sel_previous = item_selected - 1;
  if (item_sel_previous < 0) { item_sel_previous = NUM_ITEMS - 1; }  // previous item would be below first = make it the last
  item_sel_next = item_selected + 1;
  if (item_sel_next >= NUM_ITEMS) { item_sel_next = 0; }  // next item would be after last = make it the first



  if (current_screen == 1) {
    MenuContent();
  } else if (current_screen == 2) {
    OneShotContent();
  } else if (current_screen == 3) {
    TwoShotContent();
  } else if (current_screen == 4) {
    InfoContent();
  }
  delay(50);
}

}

  void MenuContent() {
    oled.firstPage();
    do {
      oled.setFont(u8g2_font_9x15_tf);

      oled.drawStr(20, 10, menu_items[item_sel_previous]);

      oled.drawStr(20, 25, menu_items[item_selected]);

      oled.drawStr(20, 40, menu_items[item_sel_next]);

    } while (oled.nextPage());
  }

  void OneShotContent() {
    do {
      oled.setFont(u8g2_font_9x15_tf);
      oled.drawStr(5, 15, "1 Shot");
    } while (oled.nextPage());
  }

  void TwoShotContent() {
    do {
      oled.setFont(u8g2_font_9x15_tf);
      oled.drawStr(5, 15, "2 Shot");
    } while (oled.nextPage());
  }

  void BLEMACContent() {
    do {
      oled.setFont(u8g2_font_9x15_tf);
      oled.drawStr(5, 15, "BLE-MAC");
    } while (oled.nextPage());
  }

  void CleanContent() {
    do {
      oled.setFont(u8g2_font_9x15_tf);
      oled.drawStr(5, 15, "Clean");
    } while (oled.nextPage());
  }


  void InfoContent() {
    oled.firstPage();
    do {
      oled.setFont(u8g2_font_9x15_tf);
      oled.drawStr(5, 15, "Info");
    } while (oled.nextPage());
  }

  void rotary_onButtonClick(int page) {
    current_screen = page;
  }

Hallo,
das nötige Menu ist ja recht übersichtlich. Eine Seite Übersicht und drei Variable eingeben und eventuell auf Erom speichern, damit sie nach einem Neustart nicht weg sind. Ich würde das eventuell mit einem 3Tasten Menu machen.
Mit der BLE Adresse wird das etwas aufwendiger , da ist ja letztlich jeder Block eine eigene "Variable" die einzeln geändert werden muss. Da bietet sich eventuell ein Array an, das man letztlich wieder zu einem String zusammensetzt.

Ich hatte da vor einiger Zeit mal was gemacht schau mal hier. Allerdings werden da nur Variable gleichen Typs verwendet und dazu ein Array genutzt. Das müsstest Da dann anpassen.

Menu´s mit Rotary gibts hier aber sicher auch

Heinz

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