Projekt mit Arduino + LCD Shield und RTC / Uhr und Wecker

Hallo liebe Leute,

ich versuche ein Projekt zurealisieren und komm nicht mehr ganz weiter.

Erstmal sage ich euch was ich machen möchte. Mit meinem Arduino will ich über das LCD Display eine Uhr anzeigen lassen die ich über die Taster des Shield stellen kann.
Später soll ein Wecker dazu kommen sowie der Austausch der Daten mit dem RTC.

Ich habe schon einige Topics hier durchforstet aber komme nun nicht wirklich weiter.

Geschrieben habe ich schon folgendes

#include <Time.h>
#include <LiquidCrystal.h>
#include <Menu.h>
#include <MenuItem.h>


// Erstellt von Nanak&&Tobias
// Arduinoboard mit LCD Display soll die Uhrzeit anzeigen und sie soll eingestellt werden können


// Erstellen des Displays mit den Kontakten
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 

// Erstellen des Menues mit Namen des Menüs
Menu ProjektMenu; 

// Erstellen der Menübestandteile
//                Name          Number For  Back  up  down
MenuItem item001("Anzeige",       001, 001, 001, 001, 002);
MenuItem item002("Einstellungen", 002, 102, 001, 001, 002);
MenuItem item102("Uhrzeit",       102, 102, 001, 102, 202);
MenuItem item202("Datum",         202, 202, 001, 102, 302);
MenuItem item302("Wecker",        302, 302, 001, 202, 402);
MenuItem item402("Speichern",     402, 402, 001, 302, 502);
MenuItem item502("Laden",         502, 502, 001, 402, 502);

int leseButton; // Variable zum speichern des gedrückten Buttons
int select;  

void setup(){
  lcd.begin(16, 2);
  Serial.begin(9600);

  // Menü zum Display hinzufügen
  ProjektMenu.addLCD(&lcd); 

  // Einzelden Punkte in das Menü einfügen
  ProjektMenu.addItem(item001); 
  ProjektMenu.addItem(item002); 
  ProjektMenu.addItem(item102);
  ProjektMenu.addItem(item202);
  ProjektMenu.addItem(item302);
  ProjektMenu.addItem(item402);
  ProjektMenu.addItem(item502);

  ProjektMenu.begin(001); // Startpunkt des Menüs

}

void loop(){
  leseButton = analogRead(0); // Die Analoge Zahl lesen und in leseButton schreiben

  // Schauen welche Taste gedrückt wurde anhand der Analogen Zahl
  if(leseButton < 50){
    ProjektMenu.goForward();
  }
  if(leseButton > 50 && leseButton < 195){
    ProjektMenu.goUp();
  }
  if(leseButton > 195 && leseButton < 380){
    ProjektMenu.goDown();
  }
  if(leseButton > 380 && leseButton < 555){
    ProjektMenu.goBack();
  }

  // Check if selectbutton was press
  if(leseButton > 555 && leseButton < 790){
    select = ProjektMenu.select(); // Holt sich die Nummer des Menupunktes der gerade angewählt ist und schreibt sie in select

    switch(select){   // Je nach dem bei welchem menüpunkt select gedrückt wird eine andere Methode aufgerufen
    case 102: 
      Serial.print("Uhrzeit");
      break;
    case 202:
      Serial.print("Datum");
      break;
    case 302:
      Serial.print("Wecker");
      break;
    case 402:
      Serial.print("Speichern");
      break;
    case 502:
      Serial.print("Laden");
      break;
    }


  }
  leseButton = 1000;

}

Einiges habe ich mir von diesem Forum eintrag abgeschaut und da gab es auch die Libarys.
http://forum.arduino.cc/index.php?PHPSESSID=ldv5a54af3uu1kheub15olo1p2&topic=135828.0

Meine Frage jetzt an euch ist.
wie bekomme ich das jetzt hin an der Stelle
case 102:
eine Methode aufzurufen in der ich die Zeit über die Buttons einstellen kann.

Das sollte erstmal reichen für den Anfang. Fehlt ja noch eine ganze Menge aber ich wollte es schritt für schritt machen um es auch zuverstehen.

Danke für eure Hilfe.

Hallo Leute,

ich habe nun schon etwas weiter geschrieben.

#include <Time.h>
#include <LiquidCrystal.h>
#include <Menu.h>
#include <MenuItem.h>


// Erstellt von Nanak&&Tobias
// Arduinoboard mit LCD Display soll die Uhrzeit anzeigen und sie soll eingestellt werden können


// Erstellen des Displays mit den Kontakten
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 

// Erstellen des Menues mit Namen des Menüs
Menu ProjektMenu; 

// Erstellen der Menübestandteile
//                Name          Number For  Back  up  down
MenuItem item001("Anzeige",       001, 001, 001, 001, 002);
MenuItem item002("Einstellungen", 002, 102, 001, 001, 002);
MenuItem item102("Uhrzeit",       102, 112, 001, 102, 202);
MenuItem item112("Stunde",        112, 112, 102, 112, 122);
MenuItem item122("Minute",        122, 122, 102, 112, 122);
MenuItem item202("Datum",         202, 202, 001, 102, 302);
MenuItem item302("Wecker",        302, 302, 001, 202, 402);
MenuItem item402("Speichern",     402, 402, 001, 302, 502);
MenuItem item502("Laden",         502, 502, 001, 402, 502);

int select;  
int Stunde;
int Minute;


// define some values used by the panel and buttons

int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

int read_LCD_buttons()
{
  adc_key_in = analogRead(0);      // read the value from the sensor 
  // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
  // we add approx 50 to those values and check to see if we are close
  if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
  // For V1.1 us this threshold
  if (adc_key_in < 50)                       return btnRIGHT;  
  if (adc_key_in > 50 && adc_key_in <195  )  return btnUP; 
  if (adc_key_in > 195 && adc_key_in <380 )  return btnDOWN; 
  if (adc_key_in > 380 && adc_key_in <555 )  return btnLEFT; 
  if (adc_key_in > 555 && adc_key_in <790 )  return btnSELECT;  

  // For V1.0 comment the other threshold and use the one below:
  /*
 if (adc_key_in < 50)   return btnRIGHT;  
   if (adc_key_in < 195)  return btnUP; 
   if (adc_key_in < 380)  return btnDOWN; 
   if (adc_key_in < 555)  return btnLEFT; 
   if (adc_key_in < 790)  return btnSELECT;   
   */


  return btnNONE;  // when all others fail, return this...
}



void setup(){
  lcd.begin(16, 2);
  Serial.begin(9600);

  // Menü zum Display hinzufügen
  ProjektMenu.addLCD(&lcd); 

  // Einzelden Punkte in das Menü einfügen
  ProjektMenu.addItem(item001); 
  ProjektMenu.addItem(item002); 
  ProjektMenu.addItem(item102);
  ProjektMenu.addItem(item112);
  ProjektMenu.addItem(item122);
  ProjektMenu.addItem(item202);
  ProjektMenu.addItem(item302);
  ProjektMenu.addItem(item402);
  ProjektMenu.addItem(item502);

  ProjektMenu.begin(001); // Startpunkt des Menüs

}

void loop(){
  lcd_key = read_LCD_buttons();  // read the buttons

    // Schauen welche Taste gedrückt wurde anhand der Analogen Zahl
  if(lcd_key==0){
    ProjektMenu.goForward();
  }
  if(lcd_key==1){
    ProjektMenu.goUp();
  }
  if(lcd_key==2){
    ProjektMenu.goDown();
  }
  if(lcd_key==3){
    ProjektMenu.goBack();
  }

  // Check if selectbutton was press
  if(lcd_key==4){
    select = ProjektMenu.select(); // Holt sich die Nummer des Menupunktes der gerade angewählt ist und schreibt sie in select

      switch(select){   // Je nach dem bei welchem menüpunkt select gedrückt wird eine andere Methode aufgerufen
    case 112: 
      setzeStunde();
      break;
    case 122:
      setzeMinute();
    case 202:
      Serial.print("Datum");
      break;
    case 302:
      Serial.print("Wecker");
      break;
    case 402:
      Serial.print("Speichern");
      break;
    case 502:
      Serial.print("Laden");
      break;
    case 001:
      Anzeige();
      break;
    }


  }

  adc_key_in =1000;
}

//
//   METHODE: STUNDEN EINSTELLUNG
//
//

void setzeStunde()                            // erstelle eine Methode setzteUhrzeit
{
  Stunde=0;                                     // setzte Stunde auf 0
  lcd.clear();                                  // LCD leeren

  while(lcd_key <3 || lcd_key >3)              // Solange nicht LEFT gedrückt wird kann die Zeit eingestellt werden
  {
    lcd_key = read_LCD_buttons();             // Soll schauen welche Buttons aktuell gedrückt wurden
    lcd.setCursor(0,0);                     // Cursor auf die erste Stelle im Display


    if (Stunde<10){
      lcd.setCursor(0,0);
      lcd.print("0");                         // Schreibe die Stunde aufs dispay mit einer 0 davor wenn sie kleiner ist als 10
      lcd.setCursor(1,0);
      lcd.print(Stunde);
    }
    else {
      lcd.print(Stunde) ; 
    }

    if(adc_key_in >50 && adc_key_in <195)    // Wenn hochderückt zähle die Stunde einen hoch
    {
      if (Stunde<24)
      {
        Stunde=(Stunde++);
        delay(500);    
      }                      //damit er nur einmal pro tastendruck hochzählt

    }
    if(adc_key_in >195 && adc_key_in <380)   // wenn runter gedrückt wird zähle eine Stunde runter
    {
      if (Stunde>0)
      {
        Stunde=(Stunde--); 
        delay(500);     
      }                     //damit er nur einmal pro tastendruck hochzählt

    }

  }
}


//
//
// METHODE: ANZEIGE DER UHRZEIT
//
//

void Anzeige()
{
  lcd.clear();

  }


//
// METHODE: MINUTEN EINSTELLEN
//
//

void setzeMinute()

{
  Minute=0;                                     // setzte Minute auf 0
  lcd.clear();                                  // LCD leeren

  while(lcd_key <3 || lcd_key >3)              // Solange nicht LEFT gedrückt wird kann die Zeit eingestellt werden
  {
    lcd_key = read_LCD_buttons();             // Soll schauen welche Buttons aktuell gedrückt wurden
    lcd.setCursor(0,0);                     // Cursor auf die erste Stelle im Display


    if (Minute<10){
      lcd.setCursor(0,0);
      lcd.print("0");                         // Schreibe die Minute aufs dispay mit einer 0 davor wenn sie kleiner ist als 10
      lcd.setCursor(1,0);
      lcd.print(Minute);
    }
    else {
      lcd.print(Minute) ; 
    }

    if(adc_key_in >50 && adc_key_in <195)    // Wenn hochderückt zähle die Minute einen hoch
    {
      if (Minute<24)
      {
        Minute=(Minute++);
        delay(500);    
      }                      //damit er nur einmal pro tastendruck hochzählt

    }
    if(adc_key_in >195 && adc_key_in <380)   // wenn runter gedrückt wird zähle eine Minute runter
    {
      if (Minute>0)
      {
        Minute=(Minute--); 
        delay(500);     
      }                     //damit er nur einmal pro tastendruck hochzählt

    }

  }
}

Nun ist die frage wie ich unter der Methode Anzeige die beiden Variablen Stunde und Minute in eine Funktion einfüge die normal weiterzählt wie eine Uhr.

danke für eure hilfe

Hallo HeinzHorst,

solche Projekte sind verhäuft im Netz und auch Arduino zu finden, das Problem ist aber, oder ist evtl. auch das schöne daran, es gibt dutzende verschiedene Lösungswege.

Schau dir das mal an,
http://forum.arduino.cc/index.php?topic=204960.0

Habe es da aber direkt mit einem DS3231 gemacht (nehm bitte keinen DS1305/7 als RTC) :wink:

Im Prinzip kannst du dir einiges abschauen.

      if (Stunde<24)
      {
        Stunde=(Stunde++);
        delay(500);    
      }

Sowas kannst du auch anders machen mit Hilfe der Debounce Libary. Der entprellt dir den Taster softwaremäßig.

hey ho

ich bin jetzt soweit das ich mir die zeit vom Rechner auf den rtf hole auch auch ausgeben kann auf meinem display mit datum und Uhrzeit.
meine zeit kann ich auch einstellen unter meinem menüpunkt Uhrzeit.

nun meine frage
wie bekomme ich das hin das ich die zeit einstellen muss und die auf den rtf geschickt wird und er sie sich die daten nicht vom pc holt.

hier mein sketch

#include <Wire.h>
#include <RTClib.h>
#include <Time.h>
#include <LiquidCrystal.h>
#include <Menu.h>
#include <MenuItem.h>


// Erstellt von Nanak&&Tobias
// Arduinoboard mit LCD Display soll die Uhrzeit anzeigen und sie soll eingestellt werden können


// Erstellen des Displays mit den Kontakten
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 

// Erstellen des Menues mit Namen des Menüs
Menu ProjektMenu; 

// Erstellen der Menübestandteile
//                Name          Number For  Back  up  down
MenuItem item001("Anzeige",       001, 001, 001, 001, 002);
MenuItem item002("Einstellungen", 002, 102, 001, 001, 002);
MenuItem item102("Uhrzeit",       102, 102, 001, 102, 202);
MenuItem item202("Datum",         202, 202, 001, 102, 302);
MenuItem item302("Wecker",        302, 302, 001, 202, 402);
MenuItem item402("Speichern",     402, 402, 001, 302, 502);
MenuItem item502("Laden",         502, 502, 001, 402, 502);


// define some values used by the panel and buttons

int lcd_key     = 0;
int adc_key_in = 1000;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

RTC_DS1307 RTC;      // RTC Modul

int read_LCD_buttons()
{
  adc_key_in = analogRead(0);      // read the value from the sensor 
  // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
  // we add approx 50 to those values and check to see if we are close
  if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
  // For V1.1 us this threshold
  if (adc_key_in < 50)                       return btnRIGHT;  
  if (adc_key_in > 50 && adc_key_in <195  )  return btnUP; 
  if (adc_key_in > 195 && adc_key_in <380 )  return btnDOWN; 
  if (adc_key_in > 380 && adc_key_in <555 )  return btnLEFT; 
  if (adc_key_in > 555 && adc_key_in <790 )  return btnSELECT;  
   return btnNONE;  // when all others fail, return this...
}



void setup()
{
  lcd.begin(16, 2);
  Serial.begin(9600);

  // Menü zum Display hinzufügen
  ProjektMenu.addLCD(&lcd); 

  // Einzelden Punkte in das Menü einfügen
  ProjektMenu.addItem(item001); 
  ProjektMenu.addItem(item002); 
  ProjektMenu.addItem(item102);
  ProjektMenu.addItem(item202);
  ProjektMenu.addItem(item302);
  ProjektMenu.addItem(item402);
  ProjektMenu.addItem(item502);

  ProjektMenu.begin(001); // Startpunkt des Menüs

  // Initialisiere I2C  
  Wire.begin();

  // Initialisiere RTC
  RTC.begin();

  if (!RTC.isrunning())
  {
    RTC.adjust(DateTime(__DATE__, __TIME__));
    Serial.println("ICH BIN JETZT AN");
  }
  else
  {
    Serial.println("Ich war schon an");
  }

}

void loop(){
  lcd_key = read_LCD_buttons();  // read the buttons
    
  // Schauen welche Taste gedrückt wurde anhand der Analogen Zahl
  if(lcd_key==0){
    ProjektMenu.goForward();
  }
  else if(lcd_key==1)
  {
    ProjektMenu.goUp();
  }
  else if(lcd_key==2)
  {
    ProjektMenu.goDown();
  }
  else if(lcd_key==3)
  {
    ProjektMenu.goBack();
  }
  else if(lcd_key==4)
  {
    int select = ProjektMenu.select(); // Holt sich die Nummer des Menupunktes der gerade angewählt ist und schreibt sie in select

      switch(select){   // Je nach dem bei welchem menüpunkt select gedrückt wird eine andere Methode aufgerufen
    case 102: 
      setzeUhrzeit();
      break;
    case 202:
      Serial.print("Datum");
      break;
    case 302:
      Serial.print("Wecker");
      break;
    case 001:
      Anzeige();  // Datum und Uhrzeit ausgeben
      break;
    }

  }

  adc_key_in =1000;
}


//
//
// METHODE: ANZEIGE DER UHRZEIT
//
//


void zeigeUhrzeit(int jahr,int monat,int tag,int stunde,int minute,int sekunde)  // methode brauch 3 parameter stunde/minute/sekunde
{

  //,int tag,int monat,int jahr
  lcd.setCursor(0,0); // fang bei 0/0 an zuschreiben
  
  if (stunde<10)
  {
    lcd.print("0"); 
  }    
  // Schreibe die Stunde aufs dispay mit einer 0 davor wenn sie kleiner ist als 10

  lcd.print(stunde); 

  lcd.print(":");  // schreibe die ":" zwischen den stunden und minuten

  if (minute<10)
  {
    lcd.print("0");                         // Schreibe die Minute aufs dispay mit einer 0 davor wenn sie kleiner ist als 10
  }

  lcd.print(minute) ; 

  lcd.print(":");  // schreibe die ":" zwischen den minuten und sekunden

  if (sekunde<10)
  {
    lcd.print("0");                         // Schreibe die Minute aufs dispay mit einer 0 davor wenn sie kleiner ist als 10
  }
   
  lcd.print(sekunde) ; 
  
  for(int i = 8; i<17; ++i)   // die letzten stellen sollen leer sein auf dem display
  {
    lcd.setCursor(i,0);
    lcd.print("");
  }
  
  lcd.setCursor(0,1); // fang bei 0/0 an zuschreiben
  
  if (tag<10)
  {
    lcd.print("0"); 
  }    
  // Schreibe die Stunde aufs dispay mit einer 0 davor wenn sie kleiner ist als 10

 lcd.print(tag); 

  lcd.print(".");  // schreibe die ":" zwischen den stunden und minuten

  if (monat<10)
  {
    lcd.print("0");                         // Schreibe die Minute aufs dispay mit einer 0 davor wenn sie kleiner ist als 10
  }

  lcd.print(monat) ; 

  lcd.print(".");  // schreibe die ":" zwischen den minuten und sekunden
   
 lcd.print(jahr) ; 
  
  
  
  
}
//
//
// METHODE: ANZEIGE DER UHRZEIT
//
//

void Anzeige()
{
  lcd.clear();

  while(lcd_key != 3)              // Solange nicht LEFT gedrückt wird kann die Zeit eingestellt werden
  {
    DateTime datetime = RTC.now(); // aktuelle Zeit abrufen
    lcd_key = read_LCD_buttons();
     
    // Methode zeige uhrzeit aufrufen und Stunde:Minute:Sekunde als parameter übergeben
    zeigeUhrzeit(datetime.year(),datetime.month(),datetime.day(), datetime.hour(), datetime.minute(), datetime.second());
  } //, datetime.day(),  
}

danke für eure Hilfe

hier der rest vom code

//
// METHODE: Uhrzeit EINSTELLEN
//
//

void setzeUhrzeit()
{
  int rechtsGedrueckt=0;                                     // setzte Minute auf 0
  lcd.clear();                                  // LCD leeren

  int stunde = 0;
  int minute = 0;
  int sekunde = 0;
  int tag = 0;
  int monat = 0;
  int jahr = 0;
 


  while(lcd_key != 3)              // Solange nicht LEFT gedrückt wird kann die Zeit eingestellt werden
  {
    lcd_key = read_LCD_buttons();             // Soll schauen welche Buttons aktuell gedrückt wurden
    lcd.setCursor(0,0);                     // Cursor auf die erste Stelle im Display

    if(lcd_key == 0)
    {
      rechtsGedrueckt=rechtsGedrueckt++;
      delay(500);
    }

    zeigeUhrzeit(stunde, minute, sekunde, tag, monat, jahr);  // übergebe die eingestellten werte als parameter in die methode zeige uhrzeit
    

    if(lcd_key == 1 && rechtsGedrueckt==0)    // Wenn hochderückt zähle die Minute einen hoch
    {
      if (stunde<24)
      {
        ++stunde;
        delay(500);    
      }                      //damit er nur einmal pro tastendruck hochzählt

    }
    if(lcd_key == 2 && rechtsGedrueckt==0)   // wenn runter gedrückt wird zähle eine Minute runter
    {
      if (stunde>0)
      {
        --stunde; 
        delay(500);     
      }                     //damit er nur einmal pro tastendruck hochzählt

    }

    if(lcd_key == 1 && rechtsGedrueckt==1)    // Wenn hochderückt zähle die Minute einen hoch
    {
      if (minute<60)
      {
        ++minute;
        delay(500);    
      }                      //damit er nur einmal pro tastendruck hochzählt

    }
    if(lcd_key == 2 && rechtsGedrueckt==1)   // wenn runter gedrückt wird zähle eine Minute runter
    {
      if (minute>0)
      {
        --minute; 
        delay(500);     
      }                     //damit er nur einmal pro tastendruck hochzählt

    }

    if(lcd_key == 1 && rechtsGedrueckt==2)    // Wenn hochderückt zähle die Minute einen hoch
    {
      if (sekunde<60)
      {
        ++sekunde;
        delay(500);    
      }                      //damit er nur einmal pro tastendruck hochzählt

    }
    if(lcd_key == 2 && rechtsGedrueckt==2)   // wenn runter gedrückt wird zähle eine Minute runter
    {
      if (sekunde>0)
      {
        --sekunde; 
        delay(500);     
      }                     //damit er nur einmal pro tastendruck hochzählt

    }
        if(lcd_key == 1 && rechtsGedrueckt==3)    // Wenn hochderückt zähle die Minute einen hoch
    {
      if (tag<31)
      {
        ++tag;
        delay(500);    
      }                      //damit er nur einmal pro tastendruck hochzählt

    }
    if(lcd_key == 2 && rechtsGedrueckt==3)   // wenn runter gedrückt wird zähle eine Minute runter
    {
      if (tag>0)
      {
        --tag; 
        delay(500);     
      }                     //damit er nur einmal pro tastendruck hochzählt

    }
        if(lcd_key == 1 && rechtsGedrueckt==4)    // Wenn hochderückt zähle die Minute einen hoch
    {
      if (monat<12)
      {
        ++monat;
        delay(500);    
      }                      //damit er nur einmal pro tastendruck hochzählt

    }
    if(lcd_key == 2 && rechtsGedrueckt==4)   // wenn runter gedrückt wird zähle eine Minute runter
    {
      if (monat>0)
      {
        --monat; 
        delay(500);     
      }                     //damit er nur einmal pro tastendruck hochzählt

    }
        if(lcd_key == 1 && rechtsGedrueckt==5)    // Wenn hochderückt zähle die Minute einen hoch
    {
      if (jahr<99)
      {
        jahr=++jahr+2000;
        delay(500);    
      }                      //damit er nur einmal pro tastendruck hochzählt

    }
    if(lcd_key == 2 && rechtsGedrueckt==5)   // wenn runter gedrückt wird zähle eine Minute runter
    {
      if (jahr>0)
      {
        jahr=--jahr+2000; 
        delay(500);     
      }                     //damit er nur einmal pro tastendruck hochzählt

    }
    
  }

  //speichereZeit();
}

Für alle die es wissen wollen:)

aktueller Stand was funktioniert
Zeit wird gespeichert
Zeit wird an RTC übermittelt
Anzeige der Zeit vom RTC

was in Arbeit ist
Wecker
Wecker Ausgabe
Anzeige das Zeit/Wecker übernommen/gespeichert wurde
Aufräumen des Sketch und Menüs

Also hier der Aktuelle Code

Grüße Tobias

Display_Menu3.ino (13.5 KB)

Da du sowieso schon die Time Lib verwendest, kannst du für den Wecker auch TimeAlarms verwenden:
http://www.pjrc.com/teensy/td_libs_TimeAlarms.html

Beachte aber was da zur Alarm.delay() Methode steht!

EDIT:
Und was da auf der Seite nicht erklärt ist, dass es eine free() Methode gibt um Alarme zu löschen. Wenn man einen Alarm anlegt bekommt man eine ID Nummer zurück. Diese kann man abspeichern und dann an die free() Methode übergeben um den Alarm zu löschen. Normalerweise sind die IDs einfach sequentielle Zahlen von 0-n. Also könnte man sich das speichern eventuell auch sparen, aber es ist sicherer.
Oder alternativ write(AlarmID_t ID, time_t value) um den Alarm mit der entsprechenden ID einen neuen time_t zuzuweisen und zu aktivieren. Das ist glaube ich die bevorzugte Vorgehensweise.

Außerdem gibt es noch disable() um sie zu deaktivieren und enable() zum aktiveren.

Das ist aus dem Header ersichtlich

Serenifly:
Da du sowieso schon die Time Lib verwendest, kannst du für den Wecker auch TimeAlarms verwenden:
TimeAlarms Library, Run Functions At Specific Times

Beachte aber was da zur Alarm.delay() Methode steht!

EDIT:
Und was da auf der Seite nicht erklärt ist, dass es eine free() Methode gibt um Alarme zu löschen. Wenn man einen Alarm anlegt bekommt man eine ID Nummer zurück. Diese kann man abspeichern und dann an die free() Methode übergeben um den Alarm zu löschen. Normalerweise sind die IDs einfach sequentielle Zahlen von 0-n. Also könnte man sich das speichern eventuell auch sparen, aber es ist sicherer.
Oder alternativ write(AlarmID_t ID, time_t value) um den Alarm mit der entsprechenden ID einen neuen time_t zuzuweisen und zu aktivieren. Das ist glaube ich die bevorzugte Vorgehensweise.

Außerdem gibt es noch disable() um sie zu deaktivieren und enable() zum aktiveren.

Das ist aus dem Header ersichtlich

Danke für den Tipp.
ich versuche mich mal daran

So leute,

das Programm ist fertig.
Wir können:

  • Zeit einstellen
  • Zeit auf RTC übertragen
  • Zeit anzeigen
  • Weckzeit einstellen
  • Wecker

Liebe grüße

ps. Gerne auch Verbesserungsvorschläge oder Fragen zum Programm an mich.

Weckerfuntzt1.ino (20 KB)

Ist zwar ein etwas älterer Post, aber ich versuche es mal^^

Ich habe mir deine Menüstruktur mal übernommen, möchte aber, um zur Zeitanzeige zurück zu kommen nicht den Select-Taster nutzen, sondern den Rechts-Taster.

else if(lcd_key==4) // wenn button select gedrückt wurde gehe in die if anweisung 
  {

    if(ProjektMenu.select() == 001) //   wenn wir auf dem menüpunkt 001("Anzeige") stehen dann rufe die methode anzeige auf
    {  
      anzeige();  
    }

ändere ich hier else if(lcd_key==4) in else if(lcd_key==0) geht gar nix.

habe ich da einen Denkfehler?

Hallo !

Hoffe das ließt noch jemand!
Habe versucht die genannten Lib´s zu laden und den Sketch zu testen.
Ausser Fehlern nichts passiert! Kann mir jemand helfen?

----------------Fehlermeldung--------------------------
Arduino: 1.6.7 (Windows 7), Board: "Arduino/Genuino Uno"

C:\Users\Nutzer\Documents\Arduino1.6.7\sketch_jan28a\sketch_jan28a\sketch_jan28a.ino: In function 'void anzeige()':

sketch_jan28a:192: error: 'zeigeUhrzeit' was not declared in this scope

zeigeUhrzeit(datetime.year(),datetime.month(),datetime.day(), datetime.hour(), datetime.minute(), datetime.second());

^

C:\Users\Nutzer\Documents\Arduino1.6.7\sketch_jan28a\sketch_jan28a\sketch_jan28a.ino: In function 'void setzeUhrzeit()':

sketch_jan28a:253: error: 'zeigeUhrzeit' was not declared in this scope

zeigeUhrzeit(jahr+2000, monat, tag, stunde, minuten, sekunde); // übergebe die eingestellten werte als parameter in die methode zeigeUhrzeit

^

sketch_jan28a:368: error: 'setDateTime' was not declared in this scope

setDateTime(jahr,monat,tag,stunde,minuten,sekunde);

^

C:\Users\Nutzer\Documents\Arduino1.6.7\sketch_jan28a\sketch_jan28a\sketch_jan28a.ino: In function 'void setzeWecker()':

sketch_jan28a:429: error: 'zeigeUhrzeit' was not declared in this scope

zeigeUhrzeit(weckstunde, weckminute); // übergebe die eingestellten werte als parameter in die methode zeigeUhrzeit

^

C:\Users\Nutzer\Documents\Arduino1.6.7\sketch_jan28a\sketch_jan28a\sketch_jan28a.ino: At global scope:

sketch_jan28a:483: error: expected declaration before '}' token

}

^

exit status 1
'zeigeUhrzeit' was not declared in this scope


MFG Marc

In der Fehlermeldung steht doch was falsch läuft.
Wenn du das berichtigst, kommst du der Sache schon näher.

Ich habe den Sketch 1zu 1 genutzt, wie er oben zum download bereit steht. Habe die hoffentlich richtigen Libs dazu installiert und bekomme nun die Fehler. Dann müssten alle anderen User selbige Fehler haben?!

Ich bin Newbie, ich kann im Einzelnen nicht erkennen, ob es an einer falschen lib liegt oder am evtl. ,,fehlerhaften Code,, wovon ich nicht ausgehe!?

MFG

xxxlshark:
Ich habe den Sketch 1zu 1 genutzt, wie er oben zum download bereit steht.

Welchen Sketch? Den Sketch aus Antwort #8, oder einen anderen aus diesem Thread?

xxxlshark:
Habe die hoffentlich richtigen Libs dazu installiert und bekomme nun die Fehler. Dann müssten alle anderen User selbige Fehler haben?!

Möglicherweise. Und dabei dann vermutlich hauptsächlich User, die nur nach dem "Prinzip Hoffnung" arbeiten und die "hoffentlich richtigen Libs" installiert haben.

Für eine fehlerfreie Funktion wäre wohl notwendig, dass nicht nur "hoffentlich", sondern auch "tatsächlich" die richtigen Libraries installiert wurden.

Was natürlich in diesem Fall schwierig sein könnte, da die tatsächlich verwendeten Libraries überhaupt nicht genau bezeichnet wurden, sondern nur über den Namen einer Include-Datei.

Möglicherweise ist der Code auch zu neueren Arduinoversionen nicht mehr kompatibel, und der Code von März 2014 läuft auch nur in einer Arduino-IDE, die im März 2014 von dem betreffenden User damals gerade installiert war. Welche das war, hat er auch nicht geschrieben.

Was willst Du denn machen?

Der Originalcode soll wohl für ein Arduino-Board mit aufgestecktem LCD-Keypad-Shield und RTC-Modul einen Wecker darstellen. Genau das soll es bei Dir auch werden?

....Ja , ich wollte mit der selben Hardware selbes Funktionsprinzip nutzen. Uhr mit RTC und dem LCD Shield zu nutzen/stellen. Es soll allerdings eine Schaltuhr werden.

Ich war bislang der Meinung, dass die genutzten Funktionen/ Methoden..ect. und der generierte Code bei Arduino abwärts-kompatibel ist. Bei vielen Libs ist das auch so. Und ja, meine Frage bezieht sich auf den Code vom Post Nr. 8, welcher sich im Bezug auf die Fehlerhaften Stellen nicht von den anderen Angaben unterscheidet.

Hast du denn schon mal geprüft, ob die bemängelten Funktionen in dem von dir genutzten Code vorhanden sind?

xxxlshark:
....Ja , ich wollte mit der selben Hardware selbes Funktionsprinzip nutzen. Uhr mit RTC und dem LCD Shield zu nutzen/stellen. Es soll allerdings eine Schaltuhr werden.

Ein Schaltkanal oder mehrere Schaltausgänge?
Eine Schaltzeit? Oder mehrere Schaltzeiten?

xxxlshark:
Ich war bislang der Meinung, dass die genutzten Funktionen/ Methoden..ect. und der generierte Code bei Arduino abwärts-kompatibel ist. Bei vielen Libs ist das auch so.

Das kommt immer darauf an, wie sauber das programmiert ist. Bei Änderungen am Compiler, können immer auch Inkompatibilitäten entstehen. Bei Libraries, die ebenso wie die Arduino-IDE ständig auf Kompatibilität mit aktuellen IDEs geprüft und ggf. weiterentwickelt werden, ersetzt der Hersteller dann oft alten, inkompatibel gewordenen Code durch neuen kompatiblen Code oder fügt für verschiedene Versionen Abschnitte mit "bedingter Kompilierung" ein, so dass nach einem Update die Library mit alten und mit neuen Arduino-IDEs gleichermaßen funktioniert. Bei irgendwelchen alten Libraries, die von niemandem mehr gepflegt werden, kannst Du so einen Update-Service allerdings nicht erwarten, sondern mußt notwendige Anpassungen ggf. selbst durchführen, wenn Du eine abweichende und inkompatible IDE-Version einsetzen möchtest.

.....ich hatte bislang erstmal getestet, ob der genannte Code (Wecker) generell auch im Hinblick auf die libs erstmal läuft, ohne Änderungen hinsichtlich meiner Schaltuhr.

die Fehlermeldungen beziehen sich auf tatsächlichen code im Scetch, welche sich auf Funktionen beziehen. Was soll an den Funktionen nicht stimmt, wollte ich hier hinterfragen, da ich nicht weiter komme.

Vielen Dank erstmal.

xxxlshark:
.....ich hatte bislang erstmal getestet, ob der genannte Code (Wecker) generell auch im Hinblick auf die libs erstmal läuft, ohne Änderungen hinsichtlich meiner Schaltuhr.

die Fehlermeldungen beziehen sich auf tatsächlichen code im Scetch, welche sich auf Funktionen beziehen. Was soll an den Funktionen nicht stimmt, wollte ich hier hinterfragen, da ich nicht weiter komme.

Vielen Dank erstmal.

Die kann der Compiler nicht finden.

Die fehlende Funktion zeigeUhrzeit habe ich gefunden in Tobias' ( HeinzHorst's ) #4 ( dem ersten Teil)

void zeigeUhrzeit(int jahr,int monat,int tag,int stunde,int minute,int sekunde)

sketch_jan28a:483: error: expected declaration before '}' token

Da ist wohl was beim Zusammenkopieren schief gelaufen?

Für gefundenen Code ist der Finder verantwortlich. Aber wir helfen gern, wenn nötig. :wink: