Problem mit der EEprom anzeige am Display

hi zusammen, ich hab da ein problem mit der anzeige am Display, und zwar will ich 2 eeprom werte im display anzeigen lassen, doch das passiert nicht. ich bin ziehmlicher anfänger in der programmierung aber ich versuche mein bestes zu geben.

und zwar hab ich folgenden code:

#include "U8glib.h"
#include <EEPROM.h>

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);	// Fast I2C / TWI 


#define KEY_NONE 0
#define KEY_PREV 1
#define KEY_NEXT 2
#define KEY_SELECT 3
#define KEY_BACK 4

byte var1;
byte var2;



// DOGS102 shield configuration values
//uint8_t uiKeyPrev = 2;
//uint8_t uiKeyNext = 4;
//uint8_t uiKeySelect = 5;
//uint8_t uiKeyBack = 3;

// DOGM128-Shield	 configuration values
// DOGXL60-Shield configuration values
uint8_t uiKeyPrev = 7;
uint8_t uiKeyNext = 3;
uint8_t uiKeySelect = 2;
uint8_t uiKeyBack = 8;

uint8_t uiKeyCodeFirst = KEY_NONE;
uint8_t uiKeyCodeSecond = KEY_NONE;
uint8_t uiKeyCode = KEY_NONE;


void uiSetup(void) {
  // configure input keys 
  
  pinMode(uiKeyPrev, INPUT_PULLUP);           // set pin to input with pullup
  pinMode(uiKeyNext, INPUT_PULLUP);           // set pin to input with pullup
  pinMode(uiKeySelect, INPUT_PULLUP);           // set pin to input with pullup
  pinMode(uiKeyBack, INPUT_PULLUP);           // set pin to input with pullup
}

void uiStep(void) {
  uiKeyCodeSecond = uiKeyCodeFirst;
  if ( digitalRead(uiKeyPrev) == LOW )
    uiKeyCodeFirst = KEY_PREV;
  else if ( digitalRead(uiKeyNext) == LOW )
    uiKeyCodeFirst = KEY_NEXT;
  else if ( digitalRead(uiKeySelect) == LOW )
    uiKeyCodeFirst = KEY_SELECT;
  else if ( digitalRead(uiKeyBack) == LOW )
    uiKeyCodeFirst = KEY_BACK;
  else 
    uiKeyCodeFirst = KEY_NONE;
  
  if ( uiKeyCodeSecond == uiKeyCodeFirst )
    uiKeyCode = uiKeyCodeFirst;
  else
    uiKeyCode = KEY_NONE;
}


#define MENU_ITEMS 2
const char *menu_strings[MENU_ITEMS] = { "Wert1: "+ var1, "Wert2: "+ var2};

uint8_t menu_current = 0;
uint8_t menu_redraw_required = 0;
uint8_t last_key_code = KEY_NONE;


void drawMenu(void) {
  u8g.setFont(u8g_font_9x15);
  u8g.drawStr( 0, 10, "Mein Menue");
  
  uint8_t i, h;
  u8g_uint_t w, d;

  u8g.setFont(u8g_font_6x13);
  u8g.setFontRefHeightText();
  u8g.setFontPosTop();
  
  
  h = u8g.getFontAscent()-u8g.getFontDescent();
  w = u8g.getWidth();
  for( i = 0; i < MENU_ITEMS; i++ ) {
    d = (w-u8g.getStrWidth(menu_strings[i]))/2;
    u8g.setDefaultForegroundColor();
    if ( i == menu_current ) {
      u8g.drawBox(0, 30+i*h+1, w, h);
      u8g.setDefaultBackgroundColor();
    }
    u8g.drawStr(d, 30+i*h, menu_strings[i]);
  }
}

void updateMenu(void) {
  if ( uiKeyCode != KEY_NONE && last_key_code == uiKeyCode ) {
    return;
  }
  last_key_code = uiKeyCode;
  
  switch ( uiKeyCode ) {
    case KEY_NEXT:
      menu_current++;
      if ( menu_current >= MENU_ITEMS )
        menu_current = 0;
      menu_redraw_required = 1;
      break;
    case KEY_PREV:
      if ( menu_current == 0 )
        menu_current = MENU_ITEMS;
      menu_current--;
      menu_redraw_required = 1;
      break;
  }
}


void setup() {
  if (var1 == ' '){
  EEPROM.write(1, 1);
  
}
if (var2 == ' '){
  EEPROM.write(2, 15);
  
}

  // rotate screen, if required
  // u8g.setRot180();
  
  uiSetup();                                // setup key detection and debounce algorithm
  menu_redraw_required = 1;     // force initial redraw
}

void loop() {  
var1=EEPROM.read(1);
var2=EEPROM.read(2);
  uiStep();                                     // check for key press
    
  if (  menu_redraw_required != 0 ) {
    u8g.firstPage();
    do  {
      drawMenu();
    } while( u8g.nextPage() );
    menu_redraw_required = 0;
  }

  updateMenu();                            // update menu bar
  
}

am display wird mir dann nur der Headertext also hier im beispiel Mein menue angezeigt und darunter dann die 2 menüpunkte. alles was nach den doppelpunkten angezeigt werden soll fehlt.

was bzw wie muss ich das machen damit mir das alles angezeigt wird.

das 2. problem, wenn ich mit den down oder up button den menüpunkt ändern will wird mir der headertext abgeschnitten.

psyqjo: und zwar hab ich folgenden code: ...

Der Code lässt sich IMO sehr schlecht lesen und macht auf mich den Eindruck als hättest Du nicht programmiert, sondern Teile anderswo ausgeschnitten und eingefügt.

Mein Vorschlag: Formuliere möglichst genau, was Du erreichen möchtest und was dazu erledigt werden muss. Male zum Beispiel einen Programmablaufplan. Dann nimmst Du Dir Schritt für Schritt vor und programmierst. Wenn Du dann einen Code hast, der immer noch nicht das tut, was Du möchtest, formatierst Du den halbwegs (für den Anfang tut es Strg-T) und schlägst damit erneut hier auf.

Gruß

Gregor

stimmt der cod war der original u8glib menücod den ich für meinen zweck mangels programierungserfahrungen in arduino versuche an meine bedürfnisse anzupassen.

habe das sketch mal mit hochgeladen.

was ich erreichen will ist eigentlich nur eine anzeige bei der ich werte angezeigt bekomme und diese bei bedarf auch ändern kann.

beispielsweise bei wert 1 der ein zahlenwert und bei wert 2 evtl auch ein anschlusspin von dem was ausgelesen werden soll.

gedacht hab ich mir das so, wenn ich auf den menüpunkt klicke soll ich mit den up und down tasten den wert ändern können und durch erneutes klicken der auswahl taste speichern. leider fange ich erst an mich in die programmierung einzuarbeiten und versuche das lerning by doing prinziep. daher auch der beispielcode der umgeschrieben werden soll. so verstehe ich wie was zusammen hängt und was ich wo wann wie ändern muss wenn ich das anpassen will.

leider hackt es schon bei solchen kleinigkeiten.

testmenu.ino (3.54 KB)

psyqjo: stimmt der cod war der original u8glib menücod den ich für meinen zweck mangels programierungserfahrungen in arduino versuche an meine bedürfnisse anzupassen. ... leider hackt es schon bei solchen kleinigkeiten.

Mit dem Programmieren anzufangen, indem man Fremdcode nimmt und anzupassen versucht, ist meiner Meinung nach ein schlechter Weg. Dabei lernst Du hauptsächlich, wie cut'n'paste funktioniert.

Male Dir wirklich mal einen Programmablaufplan auf. Mir hat das erst neulich geholfen, weil ich erst dadurch darauf kam, warum ich mir einen im Grunde simplen Algorithmus nicht im Kopf zurechtbasteln konnte – und ich programmiere seit ein paar Jahrzehnten, seit 8 Jahren C/C++. Mit dem PAP erledigst Du oft schon einen großen Teil der Programmierung und siehst bei vielen Dingen bereits, welche Befehle oder Konstrukte Du einsetzen musst.

Das eintippen des Codes ist dann häufig nur noch „Fleißarbeit“.

Gruß

Gregor

psyqjo: leider hackt es schon bei solchen kleinigkeiten.

Wenn es schon bei Kleinigkeiten hakt, dann solltest du dich erst um die Grundlagen kümmern. Die Beispiele in der IDE eignen sich wunderbar dazu, um Grundlagen zu lernen. Diese solltest du erst durcharbeiten und dich anschließend an derartige Projekte rantrauen.

Danach wirst du sicher einige deiner Probleme selbst lösen können.

Allerdings musst du an einem Problem selbst arbeiten, das ist die Schift-Taste am PC. Entweder ist die defekt oder du nutzt diese nicht. Dadurch wird dein Text leider nicht verständlicher.

Den Rest hatte Gregor ja schon angesprochen.

so wie ich mich kenne, wird das ganze dann weil es einfach keine hillfestellungen gibt irgendwann uninteressant und ich schmeiß den ganzen scheiß ins eck. hab einfach keine gedult mir den mist über monate lang zu erarbeiten ohne irgend ein beispiel. wie soll ich mir denn das ganze erarbeiten wenn ich kein projekt habe bei dem ich schauen kann wie es gemacht wird. für jeden mist gibts tutorials aber ausgerechnet dafür nichts...

Wieso gibt es keine Hilfestellung ? Wir haben dir doch schon den Tipp gegeben, an deinen Grundlagen zu arbeiten. Ist das keine Hilfestellung ?

Was nutzt es dir, wenn wir deinen kopierten Sketch überarbeiten und du es nicht verstehst.

Den Sketch habe ich mir angesehen, finde aber die genannten Doppelpunkte nicht.

Ich vermute, der Wurm hat sich hier hinein gebohrt:

const char *menu_strings[MENU_ITEMS] = { "Wert1: "+ var1, "Wert2: "+ var2};

Kenne mich mit den char und strings aber nicht gut aus; vielleicht weiß einer, wie es korrekt aussehen soll. Wenn die Syntax stimmt, dann sind die var1 und var2 evtl. leer?

So weit habe ich mir den Code aber nicht angesehen.

rpt007: Ich vermute, der Wurm hat sich hier hinein gebohrt:

const char *menu_strings[MENU_ITEMS] = { "Wert1: "+ var1, "Wert2: "+ var2};

Kenne mich mit den char und strings aber nicht gut aus; vielleicht weiß einer, wie es korrekt aussehen soll. Wenn die Syntax stimmt, dann sind die var1 und var2 evtl. leer?

So weit habe ich mir den Code aber nicht angesehen.

Du hast Recht, das funktioniert nicht. Ich habe es jedenfalls nicht zum Laufen gebracht.

Evtl. sollte der TO mal mitteilen, was da passieren soll.

  int var1 = 10;
   const char* msg0 = "Var1 = ";   
   Serial.println(msg0); // kein Problem

   const char* msg1 = "Var1 = "+ var1;
   Serial.println(msg1); // undefiniertes Verhalten

   const char* msg2 = "Ein langer Text, Var1 = "+ var1;
   Serial.println(msg2); // liefert " Text, Var1 = "

c/c++ erlaubt viel Unsinn. Dies ist ein schönes Beispiel.

Wer denkt, das + Zeichen würde zwei Texte zusammenketten, hat sich geschnitten. Wer darüber hinaus denkt, eine Zahl würde, damit das passiert, heimlich in einen zweiten Text verwandelt, ist naiv. Wer sich gar nichts dabei denkt, sollte doch lieber mit python auf dem raspberry spielen.

Es gibt (leider) Gründe, warum die Zeilen oben keinen Compilier-Fehler produzieren. Und das 3. Beispiel sollte erläutern, was es mit dem + eigentlich auf sich hat. ;)

Wer darüber hinaus denkt, eine Zahl würde, damit das passiert, heimlich in einen zweiten Text verwandelt, ist naiv.

Oder hat Visual Basic gelernt :zipper_mouth_face:

Na ja, die Zeigerarithmetik sollte man wenigstens etwas kennen. Und vor allem, was das * so bedeutet.