Real Time Clock in Menü hinzufügen

Hallo,
kann mir jemand dabei helfen diese RTC in mein Menü hinzuzufügen? Mochte das bei Menü 9 einordnen, klappt aber bei mir nicht, ich bekomm es net hin. Könnte mir jemand helfen?
Code Menü:

`//Menü//////////////////////////////////////////////////////
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);   

const byte upButtonPin = 35;
const byte downButtonPin = 39;
const byte rightButtonPin = 30;
const byte leftButtonPin = 32;
const byte tweeterPin = 9;
const byte ledPin = 13;
const byte ledPin_fade = 10; 
int fade = 0;
int L_Haus = 41;
int L_Rot = 43;
int ROT = 24; 
int GELB = 22; 
int GRUEN = 26; 
int F_ROT = 33; 
int F_GRUEN = 45; 
int TasterLesen;
int lastState = LOW;  
int currentState;  
int Sensorwert;  
int L_GRUEN = 13;
int L_ROT = 31;
int SPU = 2048;
Stepper Motor(SPU, 3,5,4,6);


String MenuItems[9] = {  
  "1.Solarenergie",
  "2.Windenergie",
  "3.Garagentor",
  "4.Luftqualitaet",
  "5.Strassenlaternen",
  "6.LED Haus",
  "7.Ampel",
  "8.Akkustand",
  "9.Uhrzeit/Datum",  
  };                                    
////////////////////////////////////////////////////////////
//RealTimeClock/////////////////////////////////////////////  
#include <TimeLib.h>
#include <DS1307RTC.h>
////////////////////////////////////////////////////////////


void setup()
{
  Serial.begin(9600);
///////////////Buttons//////////////////////
  pinMode(upButtonPin, INPUT_PULLUP);
  pinMode(downButtonPin, INPUT_PULLUP);
  pinMode(rightButtonPin, INPUT_PULLUP);
  pinMode(leftButtonPin, INPUT_PULLUP);
////LCD/////////////////////////////////////
  lcd.init();
  lcd.backlight();
////RealTimeClock///////////////////////////
  while (!Serial) ; 
  delay(200);
  Serial.println("RTC Read Test");
  Serial.println("-------------------");
/////////////////////////////////////////////
  pinMode(L_Haus, OUTPUT);
  pinMode(ROT, OUTPUT); 
  pinMode(GELB, OUTPUT);
  pinMode(GRUEN, OUTPUT); 
  pinMode(F_ROT, OUTPUT);  
  pinMode(F_GRUEN, OUTPUT); 
  pinMode(0, INPUT);
  Motor.setSpeed(5);
}

//////MENU/////////////////////////////////////////////////
void menuFunctions(int menu, byte right, byte left)    // funktionen einfügen, verbessern(also die aufteilung), nochmal genau durchlesen damit ich des programm versteh etc. 
{
  if(menu == 1) 
  {   
    if(right == 1)
    { 
      lcd.setCursor(0, 2);
      lcd.print("Stromstaerke=");
      lcd.setCursor(0, 3);
      lcd.print("Spannung=");
      digitalWrite(ledPin, HIGH);
    }
    
  }
  if(menu == 2) 
  {
    if(right == 1)
    {
      lcd.setCursor(0, 2);
      lcd.print("Stromstaerke=");
      lcd.setCursor(0, 3);
      lcd.print("Spannung=");
      digitalWrite(ledPin, HIGH);
    }
    
  }
  
  if(menu == 3)
  {
    if(right == 1)
    { 
      lcd.setCursor(0, 3);
      lcd.print("Closed   ");
      lcd.setCursor(10, 3);
      lcd.print("Open  <<");
      Motor.step(2048); 
      delay(1000); 
    }
    if(left == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Closed <<");
      lcd.setCursor(10, 3);
      lcd.print("Open   ");
      Motor.step(-2048); 
      delay(1000); 
    }
  }
  if(menu == 4)
  {
    if(right||left == 1)
    {
      
      lcd.setCursor(0, 2);
      lcd.print("Luftqulitaet=");
      Sensorwert = analogRead(0);
      Sensorwert = (Sensorwert / 6);
      Serial.println("Luftqualität : ");
      Serial.println(Sensorwert, DEC);
      Serial.println();
    if(Sensorwert >= 50)

{
  
  lcd.setCursor(14,2);
  lcd.print("SCHLECHT");
  

}   
    else(Sensorwert <=49);
{
  lcd.setCursor(14,2);
  lcd.print("GUT");

}
    }

  }
if(menu == 5)
  {
    if(right == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Off   ");
      lcd.setCursor(10, 3);
      lcd.print("On  <<");
      digitalWrite(ledPin, HIGH);
    }
    if(left == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Off <<");
      lcd.setCursor(10, 3);
      lcd.print("On    ");
      digitalWrite(ledPin, LOW);
    }
  }
if(menu == 6)
  {
    if(right == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Off   ");
      lcd.setCursor(10, 3);
      lcd.print("On  <<");
      digitalWrite(L_Haus, HIGH);
    }
    if(left == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Off <<");
      lcd.setCursor(10, 3);
      lcd.print("On    ");
      digitalWrite(L_Haus, LOW);
    }
  }

if(menu == 7)
  {
    if(right||left == 1) //Überlegen was man hinschreiben könnte; Zeit anzeigen lassen wie lange die Ampel noch dauert 
    
{ 
  lcd.setCursor(0, 3);
  lcd.print("druecken <<");
  delay(3000);
  digitalWrite(GRUEN, LOW);    
  digitalWrite(GELB, HIGH);  
  delay(1000);  
  digitalWrite(GELB, LOW);  
  digitalWrite(ROT, HIGH);  


  delay(3000);
  digitalWrite(F_ROT, LOW); 
  digitalWrite(F_GRUEN, HIGH);
  delay(6000);
  digitalWrite(F_GRUEN, LOW);
  digitalWrite(F_ROT, HIGH);
  delay(1000);
  digitalWrite(GELB, HIGH);     
  delay(1000);    
  digitalWrite(ROT, LOW); 
  delay(500);
  digitalWrite(GELB, LOW);
  digitalWrite(GRUEN, HIGH);
}
      
  
  }
if(menu == 8)
  {
    if(right == 1)
    {
      
      lcd.setCursor(0, 2);
      lcd.print("Akkustand=");
    }

  }
if(menu == 9)
  {
    if(right||left == 1)
    {
      lcd.setCursor(0, 2);
      lcd.print("Uhrzeit:");
      //lcd.print(tm.Hour);
      lcd.print(':');
      //lcd.print(tm.Minute);
      lcd.print(':');
      //print2digits(tm.Second);


      lcd.setCursor(0, 3);
      lcd.print("Datum:");
      //lcd.print(tm.Day);
      lcd.print('/');
      //lcd.print(tm.Month);
      lcd.print('/');
      //lcd.print(tmYearToCalendar(tm.Year));
    
    }
    
}
}
template< typename T, size_t NumberOfSize > 
size_t MenuItemsSize(T (&) [NumberOfSize]){ return NumberOfSize; }
int numberOfMenuItems = MenuItemsSize(MenuItems) - 1;
int currentMenuItem = 0;
int previousMenuItem = 1;
byte button_flag = 0;
unsigned long previousMillis = millis();
const int note = 4699;
void beepsOnce()
{
  tone(tweeterPin, note, 125);
  delay(60);
  noTone(tweeterPin);
}

void loop() 
{
//////////MENU/////////////////////////////////////////////////////////////////////////////////////////
  if(digitalRead(rightButtonPin) == LOW && button_flag == 0)
  {
    menuFunctions(currentMenuItem + 1, 1, 0);
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if(digitalRead(leftButtonPin) == LOW && button_flag == 0)
  {
    menuFunctions(currentMenuItem + 1, 0, 1);
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if(digitalRead(upButtonPin) == LOW && button_flag == 0)
  {
    ++currentMenuItem;
    if(currentMenuItem > numberOfMenuItems )
    {
      currentMenuItem = numberOfMenuItems ;
    }
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  else if(digitalRead(downButtonPin) == LOW && button_flag == 0)
  {
    currentMenuItem--;
    if(currentMenuItem < 0)
    {
      currentMenuItem = 0;
    }
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
if(currentMenuItem != previousMenuItem)
  {
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print(MenuItems [currentMenuItem]);
    menuFunctions(currentMenuItem + 1, 0, 0);
    previousMenuItem = currentMenuItem;
  }
  if(millis() - previousMillis >= 400) 
  {
    previousMillis = millis();
    button_flag = 0;
  }
//////RealTimeClock///////////////////////////////////////////////////////

  

}
//////////////////////////////////////////////////////////////////////////////////////////////////////

/////RealTimeClock//////////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////////////////////////`

code RTC:

`
#include <TimeLib.h>
#include <DS1307RTC.h>



void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
  lcd.init();
  lcd.backlight();
}

void loop() {

//////RealTimeClock///////////////////////////////////////////
  lcd.begin(16, 2);

  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    lcd.setCursor(0, 0);
    lcd.print(tm.Hour);

    Serial.write(':');
    lcd.print(':');

    print2digits(tm.Minute);
    lcd.print(tm.Minute);

    Serial.write(':');
    lcd.print(':');

    print2digits(tm.Second);
    lcd.print(tm.Second);

    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    lcd.setCursor(0, 1);
    lcd.print(tm.Day);

    Serial.write('/');
    lcd.print('/');
    
    Serial.print(tm.Month);
    lcd.print(tm.Month);

    Serial.write('/');
    lcd.print('/');
    
    Serial.print(tmYearToCalendar(tm.Year));
    lcd.print(tmYearToCalendar(tm.Year));
    
    Serial.println();
  } 
  else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}
//////////////////////////////////////////////////////////////////////////
void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
    lcd.print('0');
  }
  Serial.print(number);
}`

Moin @fe_lix16,

das hier sollte es schon tun:

/*
  Forum: https://forum.arduino.cc/t/real-time-clock-in-menu-hinzufugen/1189915
  Wokwi: https://wokwi.com/projects/381572374518920193
*/

//Menü//////////////////////////////////////////////////////
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const byte upButtonPin = 35;
const byte downButtonPin = 39;
const byte rightButtonPin = 30;
const byte leftButtonPin = 32;
const byte tweeterPin = 9;
const byte ledPin = 13;
const byte ledPin_fade = 10;
int fade = 0;
int L_Haus = 41;
int L_Rot = 43;
int ROT = 24;
int GELB = 22;
int GRUEN = 26;
int F_ROT = 33;
int F_GRUEN = 45;
int TasterLesen;
int lastState = LOW;
int currentState;
int Sensorwert;
int L_GRUEN = 13;
int L_ROT = 31;
int SPU = 2048;
Stepper Motor(SPU, 3, 5, 4, 6);


String MenuItems[9] = {
  "1.Solarenergie",
  "2.Windenergie",
  "3.Garagentor",
  "4.Luftqualitaet",
  "5.Strassenlaternen",
  "6.LED Haus",
  "7.Ampel",
  "8.Akkustand",
  "9.Uhrzeit/Datum",
};
////////////////////////////////////////////////////////////
//RealTimeClock/////////////////////////////////////////////
//#include <TimeLib.h>
//#include <DS1307RTC.h>
#include <RTClib.h>
////////////////////////////////////////////////////////////
RTC_DS1307 rtc;
boolean showTheTime = false;

void setup()
{
  Serial.begin(9600);
  ///////////////Buttons//////////////////////
  pinMode(upButtonPin, INPUT_PULLUP);
  pinMode(downButtonPin, INPUT_PULLUP);
  pinMode(rightButtonPin, INPUT_PULLUP);
  pinMode(leftButtonPin, INPUT_PULLUP);
  ////LCD/////////////////////////////////////
  lcd.init();
  lcd.backlight();
  ////RealTimeClock///////////////////////////
  while (!Serial) ;
  delay(200);
  Serial.println("RTC Read Test");
  Serial.println("-------------------");
  /////////////////////////////////////////////
  pinMode(L_Haus, OUTPUT);
  pinMode(ROT, OUTPUT);
  pinMode(GELB, OUTPUT);
  pinMode(GRUEN, OUTPUT);
  pinMode(F_ROT, OUTPUT);
  pinMode(F_GRUEN, OUTPUT);
  pinMode(0, INPUT);
  Motor.setSpeed(5);

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
}

//////MENU/////////////////////////////////////////////////
void menuFunctions(int menu, byte right, byte left)    // funktionen einfügen, verbessern(also die aufteilung), nochmal genau durchlesen damit ich des programm versteh etc.
{
  if (menu == 1)
  {
    if (right == 1)
    {
      lcd.setCursor(0, 2);
      lcd.print("Stromstaerke=");
      lcd.setCursor(0, 3);
      lcd.print("Spannung=");
      digitalWrite(ledPin, HIGH);
    }

  }
  if (menu == 2)
  {
    if (right == 1)
    {
      lcd.setCursor(0, 2);
      lcd.print("Stromstaerke=");
      lcd.setCursor(0, 3);
      lcd.print("Spannung=");
      digitalWrite(ledPin, HIGH);
    }

  }

  if (menu == 3)
  {
    if (right == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Closed   ");
      lcd.setCursor(10, 3);
      lcd.print("Open  <<");
      Motor.step(2048);
      delay(1000);
    }
    if (left == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Closed <<");
      lcd.setCursor(10, 3);
      lcd.print("Open   ");
      Motor.step(-2048);
      delay(1000);
    }
  }
  if (menu == 4)
  {
    if (right || left == 1)
    {

      lcd.setCursor(0, 2);
      lcd.print("Luftqulitaet=");
      Sensorwert = analogRead(0);
      Sensorwert = (Sensorwert / 6);
      Serial.println("Luftqualität : ");
      Serial.println(Sensorwert, DEC);
      Serial.println();
      if (Sensorwert >= 50)

      {

        lcd.setCursor(14, 2);
        lcd.print("SCHLECHT");


      }
      else(Sensorwert <= 49);
      {
        lcd.setCursor(14, 2);
        lcd.print("GUT");

      }
    }

  }
  if (menu == 5)
  {
    if (right == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Off   ");
      lcd.setCursor(10, 3);
      lcd.print("On  <<");
      digitalWrite(ledPin, HIGH);
    }
    if (left == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Off <<");
      lcd.setCursor(10, 3);
      lcd.print("On    ");
      digitalWrite(ledPin, LOW);
    }
  }
  if (menu == 6)
  {
    if (right == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Off   ");
      lcd.setCursor(10, 3);
      lcd.print("On  <<");
      digitalWrite(L_Haus, HIGH);
    }
    if (left == 1)
    {
      lcd.setCursor(0, 3);
      lcd.print("Off <<");
      lcd.setCursor(10, 3);
      lcd.print("On    ");
      digitalWrite(L_Haus, LOW);
    }
  }

  if (menu == 7)
  {
    if (right || left == 1) //Überlegen was man hinschreiben könnte; Zeit anzeigen lassen wie lange die Ampel noch dauert

    {
      lcd.setCursor(0, 3);
      lcd.print("druecken <<");
      delay(3000);
      digitalWrite(GRUEN, LOW);
      digitalWrite(GELB, HIGH);
      delay(1000);
      digitalWrite(GELB, LOW);
      digitalWrite(ROT, HIGH);


      delay(3000);
      digitalWrite(F_ROT, LOW);
      digitalWrite(F_GRUEN, HIGH);
      delay(6000);
      digitalWrite(F_GRUEN, LOW);
      digitalWrite(F_ROT, HIGH);
      delay(1000);
      digitalWrite(GELB, HIGH);
      delay(1000);
      digitalWrite(ROT, LOW);
      delay(500);
      digitalWrite(GELB, LOW);
      digitalWrite(GRUEN, HIGH);
    }


  }
  if (menu == 8)
  {
    if (right == 1)
    {

      lcd.setCursor(0, 2);
      lcd.print("Akkustand=");
    }

  }
  if (menu == 9)
  {
      showTheTime = true;
  }
  if (menu != 9) { showTheTime = false;};
}

template< typename T, size_t NumberOfSize >
size_t MenuItemsSize(T (&) [NumberOfSize]) {
  return NumberOfSize;
}
int numberOfMenuItems = MenuItemsSize(MenuItems) - 1;
int currentMenuItem = 0;
int previousMenuItem = 1;
byte button_flag = 0;
unsigned long previousMillis = millis();
const int note = 4699;

void beepsOnce()
{
  tone(tweeterPin, note, 125);
  delay(60);
  noTone(tweeterPin);
}

void print2Digits(int no){
  if (no >= 0 && no <10){
   lcd.print("0");
  }
  lcd.print(no);
}

void showTime(){
      DateTime now = rtc.now();
      lcd.setCursor(0, 2);
      lcd.print("Uhrzeit:");
      print2Digits(now.hour());
      lcd.print(':');
      print2Digits(now.minute());
      lcd.print(':');
      print2Digits(now.second());
      lcd.setCursor(0, 3);
      lcd.print("Datum:");
      print2Digits(now.day());
      lcd.print('/');
      print2Digits(now.month());
      lcd.print('/');
      lcd.print(now.year());
}

void loop()
{
  if (showTheTime){
    showTime();
  }
  //////////MENU/////////////////////////////////////////////////////////////////////////////////////////
  if (digitalRead(rightButtonPin) == LOW && button_flag == 0)
  {
    menuFunctions(currentMenuItem + 1, 1, 0);
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if (digitalRead(leftButtonPin) == LOW && button_flag == 0)
  {
    menuFunctions(currentMenuItem + 1, 0, 1);
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if (digitalRead(upButtonPin) == LOW && button_flag == 0)
  {
    ++currentMenuItem;
    if (currentMenuItem > numberOfMenuItems )
    {
      currentMenuItem = numberOfMenuItems ;
    }
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  else if (digitalRead(downButtonPin) == LOW && button_flag == 0)
  {
    currentMenuItem--;
    if (currentMenuItem < 0)
    {
      currentMenuItem = 0;
    }
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  if (currentMenuItem != previousMenuItem)
  {
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print(MenuItems [currentMenuItem]);
    menuFunctions(currentMenuItem + 1, 0, 0);
    previousMenuItem = currentMenuItem;
  }
  if (millis() - previousMillis >= 400)
  {
    previousMillis = millis();
    button_flag = 0;
  }
}

Siehe auch zum Testen: RTC Menu - Wokwi ESP32, STM32, Arduino Simulator

Ich würde aber an Deiner Stelle den Code umstrukturieren; also die einzelnen Funktionen nicht in der Menüstruktur integrieren, sondern diese nur von dort steuern lassen (ein/umschalten) und die Funktionen dann aus der loop() heraus aufrufen, so wie ich dass auch mit der RTC-Uhr gemacht habe. Das ist übersichtlicher und einfacher erweiterbar!

Vielleicht mal googeln, was eine "State Machine" so macht ...

Ich habe die RTC Bibliothek gewechselt, weil die von Dir genutzte eine Lib aufruft, die Wokwi nicht bereits integriert hat. Das Zeitabrufen und -anzeigen funktioniert aber mit der RTCLib - zumindest bei Wokwi - genau so gut.

Viel Spaß!

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Ich habe mal die irren ifs entfernt

/*
  Forum: https://forum.arduino.cc/t/real-time-clock-in-menu-hinzufugen/1189915
  Wokwi: https://wokwi.com/projects/381572374518920193
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
#include <RTClib.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const byte upButtonPin = 35;
const byte downButtonPin = 39;
const byte rightButtonPin = 30;
const byte leftButtonPin = 32;
const byte tweeterPin = 9;
const byte ledPin = 13;

const byte  L_Haus = 41;
const byte  L_Rot = 43;
const byte  ROT = 24;
const byte  GELB = 22;
const byte  GRUEN = 26;
const byte  F_ROT = 33;
const byte  F_GRUEN = 45;
int Sensorwert;
int L_GRUEN = 13;
int L_ROT = 31;
int SPU = 2048;
Stepper Motor(SPU, 3, 5, 4, 6);

String MenuItems[9] = {
  "1.Solarenergie",
  "2.Windenergie",
  "3.Garagentor",
  "4.Luftqualitaet",
  "5.Strassenlaternen",
  "6.LED Haus",
  "7.Ampel",
  "8.Akkustand",
  "9.Uhrzeit/Datum",
};

RTC_DS1307 rtc;

template< typename T, size_t NumberOfSize >
size_t MenuItemsSize(T (&) [NumberOfSize]) {
  return NumberOfSize;
}
int numberOfMenuItems = MenuItemsSize(MenuItems) - 1;
int currentMenuItem = 0;
int previousMenuItem = 1;
byte button_flag = 0;
unsigned long previousMillis;
const int note = 4699;

void setup() {
  Serial.begin(115200);
  ///////////////Buttons//////////////////////
  pinMode(upButtonPin, INPUT_PULLUP);
  pinMode(downButtonPin, INPUT_PULLUP);
  pinMode(rightButtonPin, INPUT_PULLUP);
  pinMode(leftButtonPin, INPUT_PULLUP);
  ////LCD/////////////////////////////////////
  lcd.init();
  lcd.backlight();
  ////RealTimeClock///////////////////////////
  while (!Serial) ;
  delay(200);
  Serial.println("RTC Read Test");
  Serial.println("-------------------");
  /////////////////////////////////////////////
  pinMode(ledPin, OUTPUT);
  pinMode(L_Haus, OUTPUT);
  pinMode(ROT, OUTPUT);
  pinMode(GELB, OUTPUT);
  pinMode(GRUEN, OUTPUT);
  pinMode(F_ROT, OUTPUT);
  pinMode(F_GRUEN, OUTPUT);
  pinMode(0, INPUT);
  
  Motor.setSpeed(5);

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
}

void menuFunctions(int menu, byte right, byte left) {   
  switch (menu) {
    case 1:
      if (right == 1) {
        lcd.setCursor(0, 2);
        lcd.print("Stromstaerke=");
        lcd.setCursor(0, 3);
        lcd.print("Spannung=");
        digitalWrite(ledPin, HIGH);
      }
      break;
    case 2:
      if (right == 1) {
        lcd.setCursor(0, 2);
        lcd.print("Stromstaerke=");
        lcd.setCursor(0, 3);
        lcd.print("Spannung=");
        digitalWrite(ledPin, HIGH);
      }
      break;
    case 3:
      if (right == 1) {
        lcd.setCursor(0, 3);
        lcd.print("Closed   ");
        lcd.setCursor(10, 3);
        lcd.print("Open  <<");
        Motor.step(2048);
        delay(1000);
      }
      if (left == 1) {
        lcd.setCursor(0, 3);
        lcd.print("Closed <<");
        lcd.setCursor(10, 3);
        lcd.print("Open   ");
        Motor.step(-2048);
        delay(1000);
      }
      break;
    case 4:
      if (right || left == 1) {
        lcd.setCursor(0, 2);
        lcd.print("Luftqulitaet=");
        Sensorwert = analogRead(0);
        Sensorwert = (Sensorwert / 6);
        Serial.println("Luftqualität : ");
        Serial.println(Sensorwert, DEC);
        Serial.println();
        if (Sensorwert >= 50) {
          lcd.setCursor(14, 2);
          lcd.print("SCHLECHT");
        } else {
          lcd.setCursor(14, 2);
          lcd.print("GUT");
        }
      }
      break;
    case 5:
      if (right == 1) {
        lcd.setCursor(0, 3);
        lcd.print("Off   ");
        lcd.setCursor(10, 3);
        lcd.print("On  <<");
        digitalWrite(ledPin, HIGH);
      }
      if (left == 1) {
        lcd.setCursor(0, 3);
        lcd.print("Off <<");
        lcd.setCursor(10, 3);
        lcd.print("On    ");
        digitalWrite(ledPin, LOW);
      }
      break;
    case 6:
      if (right == 1) {
        lcd.setCursor(0, 3);
        lcd.print("Off   ");
        lcd.setCursor(10, 3);
        lcd.print("On  <<");
        digitalWrite(L_Haus, HIGH);
      }
      if (left == 1) {
        lcd.setCursor(0, 3);
        lcd.print("Off <<");
        lcd.setCursor(10, 3);
        lcd.print("On    ");
        digitalWrite(L_Haus, LOW);
      }
      break;
    case 7:
      if (right || left == 1) {//Überlegen was man hinschreiben könnte; Zeit anzeigen lassen wie lange die Ampel noch dauert
        lcd.setCursor(0, 3);
        lcd.print("druecken <<");
        delay(3000);
        digitalWrite(GRUEN, LOW);
        digitalWrite(GELB, HIGH);
        delay(1000);
        digitalWrite(GELB, LOW);
        digitalWrite(ROT, HIGH);

        delay(3000);
        digitalWrite(F_ROT, LOW);
        digitalWrite(F_GRUEN, HIGH);
        delay(6000);
        digitalWrite(F_GRUEN, LOW);
        digitalWrite(F_ROT, HIGH);
        delay(1000);
        digitalWrite(GELB, HIGH);
        delay(1000);
        digitalWrite(ROT, LOW);
        delay(500);
        digitalWrite(GELB, LOW);
        digitalWrite(GRUEN, HIGH);
      }
      break;
    case 8:
      if (right == 1) {
        lcd.setCursor(0, 2);
        lcd.print("Akkustand=");
      }
      break;
    case 9:
      //showTime;
      break;
  }
}

void beepsOnce() {
  tone(tweeterPin, note, 125);
  delay(60);
  noTone(tweeterPin);
}

void print2Digits(int no) {
  if (no >= 0 && no < 10) {
    lcd.print("0");
  }
  lcd.print(no);
}

void showTime() {
  DateTime now = rtc.now();
  lcd.setCursor(0, 2);
  lcd.print("Uhrzeit:");
  print2Digits(now.hour());
  lcd.print(':');
  print2Digits(now.minute());
  lcd.print(':');
  print2Digits(now.second());
  lcd.setCursor(0, 3);
  lcd.print("Datum:");
  print2Digits(now.day());
  lcd.print('/');
  print2Digits(now.month());
  lcd.print('/');
  lcd.print(now.year());
}

void loop() {
  if (currentMenuItem+1 == 9)  showTime();

  if (digitalRead(rightButtonPin) == LOW && button_flag == 0) {
    menuFunctions(currentMenuItem + 1, 1, 0);
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  } else if (digitalRead(leftButtonPin) == LOW && button_flag == 0) {
    menuFunctions(currentMenuItem + 1, 0, 1);
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  } else if (digitalRead(upButtonPin) == LOW && button_flag == 0) {
    currentMenuItem++;
    if (currentMenuItem > numberOfMenuItems) {
      currentMenuItem = numberOfMenuItems ;
    }
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  } else if (digitalRead(downButtonPin) == LOW && button_flag == 0) {
    currentMenuItem--;
    if (currentMenuItem < 0) {
      currentMenuItem = 0;
    }
    button_flag = 1;
    previousMillis = millis();
    beepsOnce();
  }
  
  if (currentMenuItem != previousMenuItem) {
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print(MenuItems [currentMenuItem]);
    menuFunctions(currentMenuItem + 1, 0, 0);
    previousMenuItem = currentMenuItem;
  }
  if (millis() - previousMillis >= 400) {
    previousMillis = millis();
    button_flag = 0;
  }
}

Frage an @wwerner, @ec2021 warum wird nicht benutzt F Makro?
Bei so vielen statischen (nicht veränderbaren) Ausgaben wird doch die helfe des RAM gespart, nur an den Schnipsel habe 24 Byte mehr.(281 zu 257 getestet mit Nano R3)

  lcd.setCursor(0, 2);
  lcd.print(F("Stromstaerke="));
  lcd.setCursor(0, 3);
  lcd.print(F("Spannung="));

Da gibt es noch viel mehr Optimierungspotential. Eins nach dem andern. Damit man es auch nachvollziehen kann.

Dat schon, doch der TO hat ganzen Brocken abgeliefert, dann sollte die Finger bewegen, und alles was mit

lcd.print ("xxxxxxx"); 

ist in

lcd.print(F("xxxxxxx"));

ändern :wink:

@fe_lix16 wenn du so eine Darstellung mit Umlauten haben willst

dann nehme die NoiascaLiquidCrystal.h
Arduino: Noiasca Liquid Crystal Library with support of special characters (UTF-8)

So ist's...

Stimmt, aber ich hatte nicht so viel Zeit... :wink:
Wenn Du Lust hast, kannst Du aber gerne weitermachen...

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