Arduino Wecker, Uhrzeit flackert

Hallo zusammen.
Ich bin momentan dabei mir einen Wecker aufzubauen, welcher mit einem Motor den Lichtschalter meiner Deckenbeleuchtung betätigt, sobald meine eingestellte Weckzeit erreicht ist.

Ich verwende einen Nano,
ein 4x3 Tastenfeld zur Eingabe der Weckzeit
Einen Steppermotor
Eine RTC
und ein 128x64 OLED Display.

Es funktioniert bereits alles wie gewünscht. Doch nun zu meinem Problem:
Die Uhrzeit auf dem OLED Display flackert, wenn ich keinen Delay programmiere, da bei jedem neuen Schleifendurchlauf die Uhrzeit des Displays überschreibe. Doch wenn ich einen Delay > 1s programmiere, reagiert der Arduino extrem verzögert oder gar nicht auf Eingaben.

Habt ihr vielleicht eine Idee wie ich die Uhrzeit mindestens minütlich aktualisiere, ohne das die Zeit quasi dauerhaft neu geschrieben wird und ich trotzdem meine Funktionen (Setzen des Alarms durch * und deaktivierung durch #) beibehalte?

Ich hänge den Code mal an, dieser ist jedoch relativ lang und mein Problem liegt eigentlich nur bei der Uhrzeit. (Zeilen 90 bis 105)

Vielen Dank für eure Hilfe

LG

[code]



// Einbinden der Bibliotheken
#include <Stepper.h>
#include <Keypad.h>                               // Syntax: https://playground.arduino.cc/Code/Keypad/
#include <TimeLib.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <DS1307RTC.h>

#define I2C 0x3C                                  // OLED Adresse wird nun durch "I2C" beschrieben
#define RST_PIN -1

// Keypad funktionstüchtig machen
const byte Spalten = 3;                           // Größe des Keypads definieren
const byte Zeilen  = 4;


char Tasten[Zeilen][Spalten]={                    // Ziffern in Array speichern
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'},
  };
  

byte SpaltenPins[Spalten] = {6, 7, 8};            // Zuweisung der 3 Spalten an die Pins am Arduino
byte ZeilenPins[Zeilen]   = {2, 3, 4, 5};         // Zuweisung der 4 Zeilen an die Pins am Arduino
                                                   /*Pin 1 kann hier leider nicht angesprochen,
                                                     da kein i/o an Pin 1 und Pin 0 möglich ist,
                                                     solange eine serielle Ausgabe erfolgt.
                                                     Serielle Ausgabe erfolgt immer automatisch,
                                                     wenn der Arduino an einen PC angeschlossen ist.
                                                     Vielleicht kann ich es ja wie gewollt anschließen,
                                                     wenn ich fertig bin?*/
char Taste;                                       // Instanzierung der gedrückten Taste

Keypad Tastenfeld = Keypad(makeKeymap(Tasten), ZeilenPins, SpaltenPins, Zeilen, Spalten);

//Bildschirm funktionstüchtig machen
SSD1306AsciiWire oled;               // Bezeichner: oled
                                                        
// Motor funktionstüchtig machen                       
int SpU = 2048;                                   // Schritte pro Umdrehung
Stepper Motor(SpU,  9, 11, 10, 12);               // Bezeichner: Motor, SpU: 2048, angeschlossene Pins

// Clock funktionstüchtig machen
DS1307RTC Uhr;

// Variablen für später definieren

int i1,i2,i3,i4;
char c1,c2,c3,c4;
char knopfdruck,keypressedx;

int A_hour=NULL;
int A_minute=NULL;
int Snooze = NULL;
int AlarmIsActive=NULL;

void setup() {
  Serial.begin(9600);                             // Stellt die Datenrate auf 9600 Bit/s ein
  Motor.setSpeed(10);

  #if RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C, RST_PIN);
#else // RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C);
#endif // RST_PIN >= 0

  oled.setFont(Adafruit5x7);
  delay(1000);
  setSyncProvider(RTC.get);


}
                                                  /* Bis hierhin fehlerfrei kompiliert*/
                                                  
void loop() {
tmElements_t tm;
 
  while(knopfdruck == NO_KEY)
  {
    knopfdruck = Tastenfeld.getKey();
    
     oled.set2X();
      printDay();
      oled.println();
      oled.print(day());
      oled.print(".");
      oled.print(month());
      oled.print(".");
      oled.println(year());
      
      oled.println("       ");
      oled.print(hour());
      oled.print(":");
      minuteMit0();
      oled.print(" ");
      oled.print("Uhr");
      
      oled.println("");
      
    setSyncProvider(RTC.get);

    if(hour() == A_hour && minute() == A_minute && AlarmIsActive == 1){
    
        Motor.step(1000);
        oled.clear();
        oled.println("Good Morning"); 
        oled.println("     ");
        oled.println("Mr. Grünert");
        delay(60000);
        Motor.step(-1000);
        
    }
    if(hour() == A_hour && minute() == (A_minute+2) && AlarmIsActive == 1){
    for (int n = 0; n<10; n++)
        Motor.step(1000);
        Motor.step(-1000);
    } 
    keypressedx == NO_KEY;
  }
      

      
    if (knopfdruck == '*'){
            oled.clear();
            oled.println("When may I");
            oled.println("turn on ");
            oled.print("the light?  ");
            delay(2000);
            oled.clear();
              
              
              
             char keypressed1 = Tastenfeld.waitForKey();  
                  if (keypressed1 != NO_KEY && keypressed1 !='#')
                     {
                     c1 = keypressed1;
                     
                 oled.print(c1);
                     }
                       
             char keypressed2 = Tastenfeld.waitForKey(); 
                  if (keypressed2 != NO_KEY && keypressed2 !='#')
                       {
                     c2 = keypressed2;
                     oled.print(c2);
                     oled.print(":");
                     }
                     
                  i1 = (c1-48)*10;
                  i2 = c2-48;
                  A_hour = i1+i2;
                  delay(500);

                    
               
               char keypressed3 = Tastenfeld.waitForKey(); 
                    if (keypressed3 != NO_KEY && keypressed3 !='#')
                       {
                       c3 = keypressed3;
                       oled.print(c3);
                       }
               char keypressed4 = Tastenfeld.waitForKey(); 
                    if (keypressed4 != NO_KEY && keypressed4 !='#')
                       {
                       c4 = keypressed4;
                       oled.print(c4);
                       }

                    i3 = (c3-48)*10;
                    i4 = c4-48;
                    A_minute = i3+i4;
                    Snooze   = A_minute + 2;
                    delay(500);
                    
                    oled.clear();
                    AlarmIsActive=1;
                    knopfdruck=NO_KEY;
                    oled.println("Wecker auf");
                    oled.print(c2);
                    oled.print(":");
                    oled.print(c3);
                    oled.print(c4);
                    oled.println(" Uhr");
                    oled.print("eingestellt");
                    delay(3000);
                    oled.clear();
             }
  
             if (knopfdruck == '#')
             {
              oled.clear();
              oled.println("Alarm ist");
              oled.println("deaktiviert");
              AlarmIsActive=0;
              knopfdruck=NO_KEY;
              delay(3000);
              oled.clear();
             }
             
             
             
}

void minuteMit0(){
  int minute0;
  minute0 = minute();
  if (minute0 <10){
    oled.print("0");
    oled.print(minute0);
  } else {
    oled.print(minute0);
  }
  }
void printDay(){  
int day;
day = weekday(); // Die Wochentage sollen abhängig vom Datum angezeigt werden.
if(day == 1){oled.print("Sonntach ");} // Wenn es sich um Tag 1 handelt soll „So“ usw. angezeigt werden.
if(day == 2){oled.print("Montach ");}  
if(day == 3){oled.print("Dienstach ");}
if(day == 4){oled.print("Hacktag ");}
if(day == 5){oled.print("Dönerstag ");}
if(day == 6){oled.print("Highday ");}
if(day == 7){oled.print("Samstag ");}
}

[/code]

Möchtest du evtl. die Fragen im vorherigen Thread beantworten ?

Der andere Thread bezieht sich auf ein Arbeitsprojekt und dieser hier auf ein privates.

Deshalb auch der eigene Thread. Bin morgen auf der Arbeit und werde auch dann die Tipps beherzigen die ich dort bekommen habe.

(deleted)

Außerdem lösche nicht immer das ganze Display, sondern überschreibe nur das, was sich geändert hat.

Gruß Tommy

Wenn du deine Zeitanzeige sowie die Tastenauswertungen in eigene Funktionen schreibst, wird auch dein Sketch übersichtlicher. Diese Funktionen rufst du dann aus der loop auf.

Die Übersichtlichkeit dient auch einer besseren Fehlersuche.

(deleted)

Sooo, habe den Sketch jetzt mal möglichst zusammengepackt und eigentlich alles in Funktionen geschrieben, bin jedoch immer noch bei dem vorherigen Problem.

Alles was in meinem setup steht ist soweit ich es verstehe richtig und benötigt nicht euer Augenmerk.

Leider habe ich im Link von @Peter-CAD-HST keine Antwort gefunden :roll_eyes:

Mein Problem ist weiterhin, dass in der untersten Zeile des Displays die Uhrzeit flackert.
Vielleicht habt ihr ja eine Idee wenn ihr meinen (jetzt hoffentlich übersichtlicheren) Sketch betrachtet.

Vielen Dank

[code]

// Einbinden der Bibliotheken
#include <Stepper.h>
#include <Keypad.h>                               // Syntax: https://playground.arduino.cc/Code/Keypad/
#include <TimeLib.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <DS1307RTC.h>

#define I2C 0x3C                                  // OLED Adresse wird nun durch "I2C" beschrieben
#define RST_PIN -1

// Keypad funktionstüchtig machen
const byte Spalten = 3;                           // Größe des Keypads definieren
const byte Zeilen  = 4;


char Tasten[Zeilen][Spalten]={                    // Ziffern in Array speichern
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'},
  };
  

byte SpaltenPins[Spalten] = {6, 7, 8};            // Zuweisung der 3 Spalten an die Pins am Arduino
byte ZeilenPins[Zeilen]   = {2, 3, 4, 5};         // Zuweisung der 4 Zeilen an die Pins am Arduino
                                                   /*Pin 1 kann hier leider nicht angesprochen,
                                                     da kein i/o an Pin 1 und Pin 0 möglich ist,
                                                     solange eine serielle Ausgabe erfolgt.
                                                     Serielle Ausgabe erfolgt immer automatisch,
                                                     wenn der Arduino an einen PC angeschlossen ist.
                                                     Vielleicht kann ich es ja wie gewollt anschließen,
                                                     wenn ich fertig bin?*/
char Taste;                                       // Instanzierung der gedrückten Taste

Keypad Tastenfeld = Keypad(makeKeymap(Tasten), ZeilenPins, SpaltenPins, Zeilen, Spalten);

//Bildschirm funktionstüchtig machen
SSD1306AsciiWire oled;               // Bezeichner: oled
                                                        
// Motor funktionstüchtig machen                       
int SpU = 2048;                                   // Schritte pro Umdrehung
Stepper Motor(SpU,  9, 11, 10, 12);               // Bezeichner: Motor, SpU: 2048, angeschlossene Pins

// Clock funktionstüchtig machen
DS1307RTC Uhr;

// Variablen für später definieren

int i1,i2,i3,i4;
char c1,c2,c3,c4;
char knopfdruck,keypressedx;

int A_hour=NULL;
int A_minute=NULL;
int Snooze = NULL;
int AlarmIsActive=NULL;

void setup() {
  Serial.begin(9600);                             // Stellt die Datenrate auf 9600 Bit/s ein
  Motor.setSpeed(10);
  
  #if RST_PIN >= 0
    oled.begin(&Adafruit128x64, I2C, RST_PIN);
  #else // RST_PIN >= 0
    oled.begin(&Adafruit128x64, I2C);
  #endif // RST_PIN >= 0

  oled.setFont(Adafruit5x7);
  delay(1000);
  setSyncProvider(RTC.get);
  oled.set2X();

}
                                                 
void loop() {
  while(knopfdruck == NO_KEY){
    knopfdruck = Tastenfeld.getKey();
    startbildschirm();                    //Tag, Datum, Uhrzeit
    
    if(hour() == A_hour && minute() == A_minute && AlarmIsActive == 1){
       wecken();
    }
    
    if(hour() == A_hour && minute() == (A_minute+2) && AlarmIsActive == 1){
      Motor.step(1000);
      for (int n = 0; n<10; n++){
         Motor.step(-2000);
         Motor.step(2000);
      }
    } 
  }
     
  if(knopfdruck == '*'){ //Wecker stellen
     weckerStellen();
     stundeWeckerStellen();
     minuteWeckerStellen();
     aktivierungBestaetigung();
  }
  
  if(knopfdruck == '#'){
     alarmDeaktivierung();
  }           
}

// Funktionen

void minuteMit0(){
  int minute0;
  minute0 = minute();
  if (minute0 <10){
    oled.print("0");
    oled.print(minute0);
  } else {
    oled.print(minute0);
  }
  }
  
void printDay(){  
int day;
day = weekday(); // Die Wochentage sollen abhängig vom Datum angezeigt werden.
if(day == 1){oled.print("Sonntach ");} 
if(day == 2){oled.print("Montach ");}  
if(day == 3){oled.print("Dienstach ");}
if(day == 4){oled.print("Hacktag ");}
if(day == 5){oled.print("Dönerstag ");}
if(day == 6){oled.print("Highday ");}
if(day == 7){oled.print("Samstag ");}
}

void startbildschirm(){
  printDay();
  oled.println();
  oled.print(day());
  oled.print(".");
  oled.print(month());
  oled.print(".");
  oled.println(year());
  oled.println("       ");
  oled.print(hour());
  oled.print(":");
  minuteMit0();
  oled.print(" ");
  oled.print("Uhr");
}

void wecken(){
  Motor.step(1000);
  Motor.step(-1000);
  delay(60000);       //Damit der Motor nicht eine Minute hin und her fährt
}

void weckerStellen(){
  oled.clear();
  oled.println("When may I");
  oled.println("turn on ");
  oled.print("the light?  ");
  delay(2000);
  oled.clear();
}

void stundeWeckerStellen(){
  char keypressed1 = Tastenfeld.waitForKey();  
  if (keypressed1 != NO_KEY && keypressed1 !='#'){
     c1 = keypressed1;
     oled.print(c1);
  }
                       
  char keypressed2 = Tastenfeld.waitForKey(); 
  if (keypressed2 != NO_KEY && keypressed2 !='#'){
     c2 = keypressed2;
     oled.print(c2);
     oled.print(":");
  }
  i1 = (c1-48)*10;  // Von char zu int. Multipliziert mit 10 um Ziffer an erste Position zu bringen
  i2 = c2-48;       // -48 wegen Umrechnung der ASCII-Werte
  A_hour = i1+i2;   // Die Stunde ergibt sich dann aus i1 und i2
}

void minuteWeckerStellen(){
  char keypressed3 = Tastenfeld.waitForKey(); 
  if (keypressed3 != NO_KEY && keypressed3 !='#'){
     c3 = keypressed3;
     oled.print(c3);
  }
  char keypressed4 = Tastenfeld.waitForKey(); 
  if (keypressed4 != NO_KEY && keypressed4 !='#'){
     c4 = keypressed4;
     oled.print(c4);
  }
  i3 = (c3-48)*10;  //Selbes Prinzip wie bei der Stunde
  i4 = c4-48;
  A_minute = i3+i4;
}

void aktivierungBestaetigung(){
  oled.clear();
  AlarmIsActive=1;
  knopfdruck=NO_KEY;
  oled.println("Wecker auf");
  oled.print(c1);
  oled.print(c2);
  oled.print(":");
  oled.print(c3);
  oled.print(c4);
  oled.println(" Uhr");
  oled.print("eingestellt");
  delay(3000);
  oled.clear();
}

void alarmDeaktivierung(){
  oled.clear();
  oled.println("Alarm ist");
  oled.println("deaktiviert");
  AlarmIsActive=0;
  knopfdruck=NO_KEY;
  delay(3000);
  oled.clear();
}

[/code]

Wie oft musst du denn deine Zeitanzeige aktualisieren ? Kannst das nicht nur dann machen, wenn eine Änderung der Anzeige erfolgt ist ?

Theoretisch brauche ich nur alle 60 sekunden eine Aktualisierung der Uhrzeit.
Ich hatte zuvor schon einen Delay von 60s programmiert, dann sind die Funktionen des Wecker (de-)aktivierens jedoch nicht mehr nutzbar.

Jost95: Theoretisch brauche ich nur alle 60 sekunden eine Aktualisierung der Uhrzeit. Ich hatte zuvor schon einen Delay von 60s programmiert, dann sind die Funktionen des Wecker (de-)aktivierens jedoch nicht mehr nutzbar.

Dann kannst du doch wunderbar am einfachsten per Timer mit der Funktion millis() die Aktualisierung alle 60 Sek. vornehmen. Nicht per delay, sondern eben millis verwenden.

Da es eine Uhr ist, braucht man dazu noch nicht mal millis. Merk dir einfach den Wert für die Minute, die Du als letztes auf das Display geschrieben hast. Und erst wenn sich der ändert ( also nach einer Minute ;) ) schreibst Du die neue Zeit auf das Display ( und merkst Dir natürlich wieder den aktuellen Minutenwert ).

MicroBahner: Da es eine Uhr ist, braucht man dazu noch nicht mal millis. Merk dir einfach den Wert für die Minute, die Du als letztes auf das Display geschrieben hast. Und erst wenn sich der ändert ( also nach einer Minute ;) ) schreibst Du die neue Zeit auf das Display ( und merkst Dir natürlich wieder den aktuellen Minutenwert ).

Ja, stimmt und war auch in Post#8 mein Tipp, nur einfacher erklärt.

Jost95: Die Uhrzeit auf dem OLED Display flackert,

Habt ihr vielleicht eine Idee wie ich die Uhrzeit mindestens minütlich aktualisiere,

Ich hab das mal angesetzt - rauspulen wo was hingehört musst es selbst.

int lastminute = 61; // sicherstellen, das sofort Aktion erfolgt

void setup()
{}

void loop() {
    if (lastminute!=minute())
    {
    lastminute=minute();  
    startbildschirm();                    //Tag, Datum, Uhrzeit
    }

Alles klar, es funktioniert nun endlich perfekt!
Vielen Dank für eure Hilfe! :slight_smile:

Hier nun der komplette Code für einen Arduino-Wecker der zur gewünschten Uhrzeit (Eingabe über 3x4 Tastenfeöd) einen Motor soweit dreht, dass dieser einen Lichtschalter betätigt. Nach zwei Minuten setzt der “Jetzt-steh-auf”-Modus ein und schaltet das Licht an aus an aus.

Werde ein 3D-Druck-fähiges Modell entwerfen um alles einigermaßen hünsch zu verpacken und kann dieses bei Interesse gerne teilen.

[code]



// Einbinden der Bibliotheken
#include <Stepper.h>
#include <Keypad.h>                               // Syntax: https://playground.arduino.cc/Code/Keypad/
#include <TimeLib.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <DS1307RTC.h>

#define I2C 0x3C                                  // OLED Adresse wird nun durch "I2C" beschrieben
#define RST_PIN -1

// Keypad funktionstüchtig machen
const byte Spalten = 3;                           // Größe des Keypads definieren
const byte Zeilen  = 4;


char Tasten[Zeilen][Spalten]={                    // Ziffern in Array speichern
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'},
  };
  

byte SpaltenPins[Spalten] = {6, 7, 8};            // Zuweisung der 3 Spalten an die Pins am Arduino
byte ZeilenPins[Zeilen]   = {2, 3, 4, 5};         // Zuweisung der 4 Zeilen an die Pins am Arduino
                                                   /*Pin 1 kann hier leider nicht angesprochen,
                                                     da kein i/o an Pin 1 und Pin 0 möglich ist,
                                                     solange eine serielle Ausgabe erfolgt.
                                                     Serielle Ausgabe erfolgt immer automatisch,
                                                     wenn der Arduino an einen PC angeschlossen ist.
                                                     Vielleicht kann ich es ja wie gewollt anschließen,
                                                     wenn ich fertig bin?*/
char Taste;                                       // Instanzierung der gedrückten Taste

Keypad Tastenfeld = Keypad(makeKeymap(Tasten), ZeilenPins, SpaltenPins, Zeilen, Spalten);

//Bildschirm funktionstüchtig machen
SSD1306AsciiWire oled;               // Bezeichner: oled
                                                        
// Motor funktionstüchtig machen                       
int SpU = 2048;                                   // Schritte pro Umdrehung
Stepper Motor(SpU,  9, 11, 10, 12);               // Bezeichner: Motor, SpU: 2048, angeschlossene Pins

// Clock funktionstüchtig machen
DS1307RTC Uhr;

// Variablen für später definieren

int i1,i2,i3,i4;
char c1,c2,c3,c4;
char knopfdruck,keypressedx;

int A_hour=NULL;
int A_minute=NULL;
int Snooze = NULL;
int AlarmIsActive=NULL;

int lastminute = 61;            // 61 ist in jedem Fall sicher != minute() und stellt 
                                // die Ausführung der if-Schleife sicher 
void setup() {
  Serial.begin(9600);                             // Stellt die Datenrate auf 9600 Bit/s ein
  Motor.setSpeed(10);
  
  #if RST_PIN >= 0
    oled.begin(&Adafruit128x64, I2C, RST_PIN);
  #else // RST_PIN >= 0
    oled.begin(&Adafruit128x64, I2C);
  #endif // RST_PIN >= 0

  oled.setFont(Adafruit5x7);
  delay(1000);
  setSyncProvider(RTC.get);
  oled.set2X();

}
                                                 
void loop() {
  while(knopfdruck == NO_KEY){
    knopfdruck = Tastenfeld.getKey();
    aktuelleUhrzeit();                    //Tag, Datum, Uhrzeit
    
    if(hour() == A_hour && minute() == A_minute && AlarmIsActive == 1){
       wecken();
    }
    
    if(hour() == A_hour && minute() == (A_minute+2) && AlarmIsActive == 1){
      Motor.step(1000);
      for (int n = 0; n<10; n++){
         Motor.step(-2000);
         Motor.step(2000);
      }
      /*A_minute = 2000;
      AlarmIsActive = 0;*/  //Bei ausklammern dieser Zeilen wird der Wecker immer nur ein mal ausgeführt
    } 
  }
     
  if(knopfdruck == '*'){ //Wecker stellen
     weckerStellen();
     stundeWeckerStellen();
     minuteWeckerStellen();
     aktivierungBestaetigung();
  }
  
  if(knopfdruck == '#'){
     alarmDeaktivierung();
  }           
}

// Funktionen

void minuteMit0(){
  int minute0;
  minute0 = minute();
  if (minute0 <10){
    oled.print("0");
    oled.print(minute0);
  } else {
    oled.print(minute0);
  }
  }
  
void printDay(){  
int day;
day = weekday(); // Die Wochentage sollen abhängig vom Datum angezeigt werden.
if(day == 1){oled.print("Sonntach ");} 
if(day == 2){oled.print("Montach ");}  
if(day == 3){oled.print("Dienstach ");}
if(day == 4){oled.print("Hacktag ");}
if(day == 5){oled.print("Dönerstag ");}
if(day == 6){oled.print("Highday ");}
if(day == 7){oled.print("Samstag ");}
}

void startbildschirm(){
  printDay();
  oled.println();
  oled.print(day());
  oled.print(".");
  oled.print(month());
  oled.print(".");
  oled.println(year());
  oled.println("       ");
  oled.print(hour());
  oled.print(":");
  minuteMit0();
  oled.print(" ");
  oled.println("Uhr");
}

void aktuelleUhrzeit(){

    if (lastminute != minute())
    {
    lastminute = minute();  
    startbildschirm();                    //Tag, Datum, Uhrzeit
    }

}

void wecken(){
  Motor.step(1000);
  Motor.step(-1000);
  delay(60000);       //Damit der Motor nicht eine Minute hin und her fährt
}

void weckerStellen(){
  oled.clear();
  oled.println("When may I");
  oled.println("turn on ");
  oled.print("the light?  ");
  delay(2000);
  oled.clear();
}

void stundeWeckerStellen(){
  char keypressed1 = Tastenfeld.waitForKey();  
  if (keypressed1 != NO_KEY && keypressed1 !='#'){
     c1 = keypressed1;
     oled.print(c1);
  }
                       
  char keypressed2 = Tastenfeld.waitForKey(); 
  if (keypressed2 != NO_KEY && keypressed2 !='#'){
     c2 = keypressed2;
     oled.print(c2);
     oled.print(":");
  }
  i1 = (c1-48)*10;  // Von char zu int. Multipliziert mit 10 um Ziffer an erste Position zu bringen
  i2 = c2-48;       // -48 wegen Umrechnung der ASCII-Werte
  A_hour = i1+i2;   // Die Stunde ergibt sich dann aus i1 und i2
}

void minuteWeckerStellen(){
  char keypressed3 = Tastenfeld.waitForKey(); 
  if (keypressed3 != NO_KEY && keypressed3 !='#'){
     c3 = keypressed3;
     oled.print(c3);
  }
  char keypressed4 = Tastenfeld.waitForKey(); 
  if (keypressed4 != NO_KEY && keypressed4 !='#'){
     c4 = keypressed4;
     oled.print(c4);
  }
  i3 = (c3-48)*10;  //Selbes Prinzip wie bei der Stunde
  i4 = c4-48;
  A_minute = i3+i4;
}

void aktivierungBestaetigung(){
  oled.clear();
  AlarmIsActive=1;
  knopfdruck=NO_KEY;
  oled.println("Wecker auf");
  oled.print(c1);
  oled.print(c2);
  oled.print(":");
  oled.print(c3);
  oled.print(c4);
  oled.println(" Uhr");
  oled.print("eingestellt");
  delay(3000);
  oled.clear();
}

void alarmDeaktivierung(){
  oled.clear();
  oled.println("Alarm ist");
  oled.println("deaktiviert");
  AlarmIsActive=0;
  knopfdruck=NO_KEY;
  delay(3000);
  oled.clear();
}

[/code]

Ja, schick. Beinahe hätte ich sogar auf das Karma add gedrückt, weil Du Deinen funktionierenden Code hier eingeworfen hast.

Aber Du hast alles kaputt gemacht!

Jost95: ```  delay(60000);       //Damit der Motor nicht eine Minute hin und her fährt

 oled.print("the light?  ");  delay(2000);  oled.clear();

 oled.print("eingestellt");  delay(3000);  oled.clear();  knopfdruck=NO_KEY;  delay(3000);  oled.clear();

:sob: :sob: :sob:

Willst Du das noch ändern?