Code für MorningAlarm fehlerhaft

Guten Tag zusammen,

seit einigen Tagen beschäftige ich mich mit dem Arduino ( Mega 256 ) und habe auch schon einige der einfachen Sketche ausprobiert und auf dem Breadboard zum Laufen gebracht. Bei der nachfolgenden Zeitsteuerung gibt es jedoch Probleme, die ich nicht gelöst bekomme. Der nachfolgende Code soll um 08:11:05 Uhr eine LED an Pin 13 für 5 Sekunden zum Leuchten bringen. Der Sketch kann ohne Probleme compiliert und hochgeladen werden.
Mit Programmstart wird die Uhr auf 08:11:00 Uhr gesetzt. Uhrzeit und Datumsinformationen werden
auf dem LCD-Display einwandfrei dargestellt.
Die LED leuchtet jedoch nicht auf. An Pin 13 können nach 5 Sekunden keine 5 V gemessen werden.

Was mache ich falsch?

Schon jetzt vielen Dank für eure Hilfe

safran

// Den Code habe ich hauptsächlich von (C)2010 Henning Karlsen
// 
// web: http://www.henningkarlsen.com/electronics
// Die Code-Schnipsel für den Alarm habe ich mir im Net zusammengesucht
// A quick demo of how to use my DS1302-library to make a quick
// clock using a DS1302 and a 16x2 LCD.



#include <LiquidCrystal.h>
#include <DS1302.h>
#include <Time.h>
#include <TimeAlarms.h>

// Init the DS1302
DS1302 rtc(6,7,8);
int LED_Pin = 13;
// Init the LCD
LiquidCrystal lcd(12,11,5,4,3,2);

void setup()
{
  // Set the clock to run-mode, and disable the write protection
  
  rtc.halt(false);
  rtc.writeProtect(false);
  Serial.begin(9600);
  // Setup LCD to 16x2 characters
  lcd.begin(16, 2);
 
  // The following lines can be commented out to use the values already stored in the DS1302
  rtc.setDOW(SATURDAY);        // Set Day-of-Week to Saturday
  rtc.setTime(8, 11, 0);     // Set the time to 08:11:00 (24hr format)
  rtc.setDate(20, 4, 2013);   // Set the date to April 20th, 2013
  
  pinMode(LED_Pin, OUTPUT);
  Alarm.alarmRepeat(8, 11, 5, MorningAlarm);
}

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));
  lcd.setCursor(6, 0);
  lcd.print(rtc.getDateStr());
  Serial.println(rtc.getTimeStr());
  // Display abbreviated Day-of-Week in the lower left corner
  lcd.setCursor(0, 1);
  
  lcd.print(rtc.getTimeStr());
  // Display date in the lower right corner
 

  // Wait one second before repeating smiley
  delay (1000);
  
}
//bei Aufruf des Alarms soll eine LED an Pin 13 für 5 Sekunden eingeschaltet werden
void MorningAlarm(){
  digitalWrite(LED_Pin, HIGH); 
  delay(5000);
  digitalWrite(LED_Pin, LOW);
}

safran:
Was mache ich falsch?

Die TimeAlarms sind keine Ergänzung zu Deiner RTC-Library, sondern zur Time-Library:

The Alarm library is a companion to the Time library that makes it easy to
perform tasks at specific times or after specific intervals.

Daher mußt Du natürlich zuerst mal die Time-Library auf der richtigen Zeit laufen lassen und nicht die RTC, wenn es einen Alarm geben soll. Aber während Du die RTC im Setup auf eine Anfangszeit stellst, fängt die Zeit der Time-Library beim Programmstart bei 00:00:00 an zu laufen, wird nicht auf einen anderen Wert eingestellt, und Du mußt dann eben lange genug warten, bis um 08:11:00 der Alarm ertönt (also 8 Stunden und 11 Minuten nach dem Programmstart).

Wenn Du vielleicht die Systemzeit der Time-Library mit der Zeit der RTC synchron laufen lassen wolltest, dann hast Du die entsprechenden Synchronisierungsroutinen zwischen Systemzeit und RTC-Zeit vergessen.

Hallo Jurs,

vielen Dank für die schnelle Antwort.
Durch die Anmerkungen von Dir muss ich mich erst einmal durcharbeiten.

Viele Grüße

safran

safran:
vielen Dank für die schnelle Antwort.
Durch die Anmerkungen von Dir muss ich mich erst einmal durcharbeiten.

Stelle die Systemzeit mit:
setTime(hr,min,sec,day,month,yr);

Also im Setup-Code:
setTime(8,0,0,21,4,2013);

Wenn Du sowohl eine Echtzeituhr an Deinem Board anschließt als auch softwaremäßig eine Systemzeit mit der Time-Library erzeugst, dann hast Du ein Gerät mit zwei Zeiten gleichzeitig, die durchaus unterschiedlich eingestellt sein können:

  1. Die Zeit, auf der die angeschlossene Echtzeituhr läuft
  2. Die softwaremäßig erzeugte Systemzeit der Time-Library

Und Dein Alarm richtet sich NUR nach der Systemzeit der Time-Library und dem Alarm ist es völlig Schnurz, auf welche Zeit die Echtzeituhr eingestellt ist.

Hallo Jurs,

Stelle die Systemzeit mit:
setTime(hr,min,sec,day,month,yr);

Also im Setup-Code:
setTime(8,0,0,21,4,2013);

Das funktioniert leider nicht, ich erhalte auf dem Display nur Unsinn. Ich glaube, das hängt mit der library zusammen, die von Henning Karlsen für den DS 1302 programmiert wurde.

Wenn Du vielleicht die Systemzeit der Time-Library mit der Zeit der RTC synchron laufen lassen wolltest, dann hast Du die entsprechenden Synchronisierungsroutinen zwischen Systemzeit und RTC-Zeit vergessen.

Genau dies möchte ich.
Allerdings kennt die ds1302-library nicht den get-Befehl aus setSyncProvider(RTC.get). Einen anderen Befehl, der die System-Zeit der Time-Library mit der RTC-Zeit synchronisiert, habe ich für den DS 1302 bis jetzt nicht gefunden. Das Manual: Electronics - Henning Karlsen gibt mir darauf auch keine Antwort. Hast Du vielleicht noch eine andere Idee?

Viele Grüße

safran

Das Einfügen von Zitaten habe ich noch nicht verstanden, sorry

safran:
Das funktioniert leider nicht, ich erhalte auf dem Display nur Unsinn.

Ist mir absolut schleierhaft, wieso das nicht funktionieren soll.

"setTime(8,0,0,21,4,2013);" ist in Deinem Programm der einzige Befehl, der die Systemzeit explizit anspricht und alles andere mit Bezug zu Zeit setzen, lesen und anzeigen machst Du mit "rtc..." und der Zeit auf dem Uhrenmodul.

Hast Du schon mal die timelib von Arduino Playground - Time ausprobiert? Ich weiß micht inwiefern diese mit der RTClib zusammenarbeitet oder ob es da überschneidungen gibt. Ohne RTC läuft diese bei mir ganz prima. RTC habe ich leider nicht zur Verfügung.

Zu den Zitaten: Du hast das fast schon richtig gemacht. Der Start des Zitates wird mit quote gemacht, am Ende des Zitates /quote. Jedesmal in der eckigen Klammer. Das selbe gilt für "code".

Edit: Jurs war schneller :wink:

Hallo, Realizer,

Ich benutze genau diese timelibrary. Die RTC möchte ich unbedingt einbinden. Wie Jurs schon sagte, muss ich die die entsprechenden Synchronisierungsroutinen zwischen Systemzeit und RTC-Zeit einbinden. Und jetzt, ganz frei nach Goethe: Allein, mir fehlt das Wissen :slight_smile: .
Für den DS 1307 finde ich jede Menge an entsprechendem Code, aber für den DS 1302 nichts, was mir weiterhilft. Ich habe sogar den Ersteller der DS 1302 Library angeschrieben, Henning Karlsen, aber er versteht mein Problem erst gar nicht. Ich werde mich jetzt einmal mit der grundlegenden Programmierung auseinandersetzen, vielleicht werde ich dann erleuchtet.

Vielen Dank

Safran

um die RTC mit der time.h zu syncronisieren brauchst Du nur die Zeit/Datum (Sekunden, Minuten, Stunden, Tag, Monat, Jahr) von der einene Auszulesen und damit die andere zu setzen.
Grüße Uwe

Hallo, zusammen!

Zunächst einmal vielen Dank für die Postings. Ich habe bisher nicht in C oder C++ programmiert. In der Theorie kann ich einiges nachvollziehen,

uwefed:
um die RTC mit der time.h zu syncronisieren brauchst Du nur die Zeit/Datum (Sekunden, Minuten, Stunden, Tag, Monat, Jahr) von der einene Auszulesen und damit die andere zu setzen.
Grüße Uwe

aber wenn es dann an den konkreten Code geht, stehe ich wie der Ochs vor dem Berge. Wie ich bereits sagte, benutze ich die Library von Henning Karlsen. In seinem Manual Electronics - Henning Karlsen ( Seite 3 ) schreibt er:

get current data from the DS 1302 with the function: t=rtc.getTime();

Die Variable t muss ich vorher aber ganz oben im Sketch definiert haben. Ich würde schreiben : Time t und damit die Variable t als Variable vom Typ Time definieren. Ist das richtig?

Wenn ich das richtig verstehe, wird die Variable t nach Ausführen des Befehls mit den Zeitdaten der RTC befüllt. Nächster Schritt müsste jetzt die Übergabe dieser Werte an die interne Zeit des Arduino sein, damit die beiden Zeiten synchron laufen. Wie muss der Code aussehen, damit die Werte korrekt übergeben werden?

Viele Grüße

safran

Ich bin auf die RTC DS 1307 umgestiegen. Als Anfänger habe ich zu dieser RTC viel mehr an Code gefunden, aus dem ich lernen kann.

Vielen Dank für die Anregungen.

safran