Einfache Schaltuhr

Hallo

ich möchte eine einfach zu bediehnende Schaltuhr bauen.
Sie soll folgenede Funktion aufweisen:

  • Die Uhrzeit wird über einen RTC DS1302 generiert und an einem LCD ausgegeben -> ist erledigt
  • es soll eine Schaltzeit generiert werden aus einer festen Zeit und einem bediehnbaren Wert
  • Die schaltzeit soll vor der festen Zeit liegen
  • eventuell soll die Uhrzeit mittels DCF synchrnisiert werden.

ich habe es geschafft die Uhrzeit zu stellen und auf einnem LCD anzuzeigen.
jetzt möchte ich die Uhrzeit natürlich weiterverarbeiten .
Nur weiß ich nicht wie ich die Uhrzeit von der RTC überneme und wie ich sie dann in ein passendes Format zur Verarbeitung der Schaltzeiten wandele.

hier mal der Sketch :

// Schaltuhr für Elektroheizung
//
// I assume you know how to connect the DS1302 and LCD.
// DS1302:  CE pin    -> Arduino Digital 10
//          I/O pin   -> Arduino Digital 11
//          SCLK pin  -> Arduino Digital 12
// LCD:     DB7       -> Arduino Digital 7
//          DB6       -> Arduino Digital 6
//          DB5       -> Arduino Digital 5
//          DB4       -> Arduino Digital 4
//          E         -> Arduino Digital 9
//          RS        -> Arduino Digital 8

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

int AusgangLadung = 13;
float Ladezeit;
int ZeitLadeende;
int LadeDauer;
int Aktuell;

// Den DS1302 initialisieren
DS1302 rtc(10, 11, 12);

// Das LCD initialisieren
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup()
{
 
  rtc.halt(false);  // setzt die Uhr in den run-Modus
  rtc.writeProtect(false);  // Hebt den Schreibschutz auf
  
  // Einstellen auf ein LCD mit 16x2 Zeichen
  lcd.begin(16, 2);

  // hier wird die Zeit gesetzt ( Achtung wenn das Einstellen erfolgt ist dann auskommentieren und nochmals übertragen )
 rtc.setTime(17, 30, 0);
}
void loop()
{
  // Uhrzeit anzeigen
  lcd.setCursor (0, 0);
  lcd.print("Uhrzeit");
  lcd.setCursor(8, 0);
  lcd.print(rtc.getTimeStr());



  // 1s Warten bis Programm weitergeführt wird
  delay (1000);
}

Hallo,
wenn du ein array deklarierst:
int UhrDaten[7];

dann stehen nach
RTC.get(UhrDaten,true);
folgende Werte in den Variablen

UhrDaten[0]) die Sekunden
UhrDaten[1]) die Minuten;
UhrDaten[2]) die Stunden;
UhrDaten[3] der Tag der Woche;
UhrDaten[4]) der Tag;
UhrDaten[5]) der Monat;
UhrDaten[6]) das Jahr;

und die kann man dann problemlos weiter verarbeiten

Gruß

Bernward

Wenn Du einen DS1337 verwendest, denn dieser hat eine Alarmfunktion bereits integriert.
Grüße Uwe

Der DS1337 benötigt einen Uhrenquarz mit 6pF. Ich habe bei mehreren Distributoren verschiedene Quarze bestellt. Angeblich sollten da auch welche mit ca. 6pF dabei sein. Die Genauigkeit habe ich aber nie besser als ca. 10s Fehler/Tag hinbekommen.
Ich benutze jetzt den PCF8583, der lässt sich mit einem C-Trimmer tunen. Jetzt hab ich bei Raumtemperatur einen Fehler von ca. 2s im Monat.

Hallo

Danke für die Antworten.
Da ich bereits zwei DS1302 habe möchte ich bei diesen auch bleiben.
Den Vorschlag von maverick1509 habe ich ausprobiert.
Zur Befehlszeile rtc.get(UhrDaten,true) erscheint folgende Fehlermeldung: Schaltuhr_Elektroheizung_Test1:50: error: 'class DS1302' has no member named 'get'
Meine Library wird auch klein geschrieben , maverick1509 vieleicht gehst Du von einer anderen Bibliothek aus.
Wie erfahre ich mehr über die möglichen Befehle und Funktionen einer Bibliothek.

Vielen Dank Rudi01

Wie erfahre ich mehr über die möglichen Befehle und Funktionen einer Bibliothek.

"mehr" heisst mehr als die vorhandenen Examples laufen lassen ? :

In die include Datei schauen: Alles was public ist, sollte verwendet werden können.
Was genau die Funktionen machen, muss man evtl. dann in der .cpp Datei nachlesen.

Wenn das nicht reicht, selber ergänzen :wink:

meine heißt:
#include <DS1307.h>
hast du eine andere?

Ich hätte einen DS3231SN genommen. Der braucht keinen externen Quarz und ist noch genauer.

Hallo Bernward

Danke für die Hilfe
Ich habe den Sketch mal so erweitert wie Du beschrieben hast.
Doch leider wird beim Kompeilieren folgender Fehler ausgegeben:

rtc.get(UhrDaten,true); Felermeldung: In function 'void loop()':
error: 'class DS1302' has no member named 'get'

Ich interpretier das mal so dass die Lib den Befehl get nicht kennt obwohl get in rot dargestellt wird was nach meiner Erkenntnis bedeutet dass der Befehl in der Lib vorkommt.
Auf der Seite des Autors der Lib ( Electronics - Henning Karlsen ) habe ich die Beschreibung der Bibliotek angeschaut hier wird der Befehl rtc.getTime(); // Read current time and date. genannt.
Wenn ich die Zeile in rtc.getTime(UhrDaten,true); error: expected constructor, destructor, or type conversion before
Hier vermute ich mal dass ich die Daten die an das Array übergeben werden noch konvertieren muss aber Wie.
Kann mir da eventuell noch jemand helfen.

Grüße Rudi

Hallo Rudi,

Hast du eine Zeile wie

DS1302 rtc(2, 3, 4); // Start an instance of the DS1302 class (Parameters: CE, IO, CLK Arduino Pins)

in deinem Sketch?
Soviel ich weiss, braucht's das bei der "normalen" 1307 library nicht, da wird ein Objekt namens rtc gleich vorgegeben.
Ausserdem solltest du erklären, warum du als Parameter (Uhrdaten, true) übergibst, oder es ändern. :wink:
Schau dir die (passende) Doc und die zur library mitgelieferten Beispiele an.

Die Farbgestaltung in der Arduino IDE ist "schwach". Alles was irgendwo als Schlüsselwort definiert ist, wird bunt.
Versuch mal, eine Variable
** ** status** **
zu nennen, die sieht anders aus als wenn sie
** ** zustand** **
hiesse...

Hallo Rudi,
ich hab jetzt mal kopiert wie es bei mir läuft, allerdings hab ich gesehen, das ich auch noch andere Librays habe:

#include <Wire.h>
#include <Wprogram.h>
#include <DS1307.h>
#include <LiquidCrystal.h>
#define LCD_WIDTH 20
#define LCD_HEIGHT 4
#define LCDBeleuchtung 12
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Ausgabepins für das LCD-Display

int UhrDaten[7], Stunde[1], Minute[1];;

//---------------------------------------------------------------------------------------------
void setup(void){
 RTC.stop();
   RTC.set(DS1307_SEC,UhrDaten[0]);
   RTC.set(DS1307_MIN,UhrDaten[1]);
   RTC.set(DS1307_HR,UhrDaten[2]);
   RTC.set(DS1307_DOW,UhrDaten[3]);
   RTC.set(DS1307_DATE,UhrDaten[4]);
   RTC.set(DS1307_MTH,UhrDaten[5]);
   RTC.set(DS1307_YR,UhrDaten[6]);
   RTC.start();
 lcd.begin(LCD_WIDTH, LCD_HEIGHT,1);
 Serial.begin(9600);
 Wire.begin();
 RTC.get(UhrDaten,true);
}

void loop(void) 
{
 
  RTC.get(UhrDaten,true);

}

Hi Bernward

ich verwende die Lib DS1302.h und Du die DS1307.h ich habe den RTC-Baustein DS1302 ich glaube den 1302 kann ich mit der 1307`er Lib nicht betreiben oder?

Was bedeutet die Lib wProgramm ?

Wenn ich Dein sketch lade bekomme ich beim Kompilieren folgende Fehlrmeldungen:

In file included from sketch_jul14c.cpp:3:
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:47: error: 'boolean' has not been declared
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:48: error: 'boolean' has not been declared
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:55: error: 'byte' does not name a type

Rudi

Hallo

jetzt habe ich endlich mal wieder Zeit mich um mein Schaltuhr-Projekt zu kümmern.

Ich habe mir jetzt ein DS1307 Shield gebaut. Mit dem Testsketch funktioniert es sogar.
Doch wenn ich den Sketch von Bernward versuche zu übertragen gibts jede Menge Fehlermeldungen:

In file included from sketch_jul22b.cpp:3:
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:69: error: stray '#' in program
In file included from sketch_jul22b.cpp:3:
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:73:11: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:74:10: error: invalid suffix "px" on integer constant
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:74: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:75:17: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:77:13: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:80: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:83: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:86:11: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:86:16: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:86:21: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:86:26: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:87:13: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:93:13: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:96:15: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:100:11: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:100:16: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:100:21: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:104:10: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:106:17: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:112:10: error: invalid suffix "px" on integer constant
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:116:10: error: invalid suffix "px" on integer constant
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:117:11: error: empty character constant
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:122:10: error: invalid suffix "px" on integer constant
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:146: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:316:3: error: invalid preprocessing directive #file_flipper
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:317:3: error: invalid preprocessing directive #file_flipper
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:318:3: error: invalid preprocessing directive #file_flipper
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:319:3: error: invalid preprocessing directive #file_flipper
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:614: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:618: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:630: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:642: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:650: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:654: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:658: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:662: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:666: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:670: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:674: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:682: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:690: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:702: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:710: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:714: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:722: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:726: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:730: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:734: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:738: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:742: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:746: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:754: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:862: error: stray '#' in program
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:885:20: error: empty character constant
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:1060:3: error: invalid preprocessing directive #review_nav
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:1061:14: error: invalid suffix "px" on integer constant
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:1062:15: error: invalid suffix "px" on integer constant
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:1063:14: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:1065:3: error: invalid preprocessing directive #review_nav
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:1068:3: error: invalid preprocessing directive #review_nav
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:1069:10: error: exponent has no digits
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:1318:288: error: empty character constant
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:5: error: expected unqualified-id before '<' token
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:24: error: 'var' does not name a type
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:25: error: 'var' does not name a type
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:26: error: expected constructor, destructor, or type conversion before '.' token
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:30: error: expected constructor, destructor, or type conversion before '.' token
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:34: error: expected `)' before '{' token
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:38: error: expected unqualified-id before ')' token
E:\Arduino\Software\Windows\arduino-1.0.1\libraries\DS1307/DS1307.h:40: error: expected unqualified-id before '<' token

Kann vieleicht jemand was anfangen damit.

Danke Rudi

Hallo

ich komme mit meinem Schaltuhr Projekt leider immer noch nicht weiter.
Mitlerweile bin ich wieder beim DS1302 angelangt.
Die Ausgabe der Uhrzeit auf dem LCD funktioniert ja bereits.
mittels lcd.print(rtc.getTimeStr()); wird die Uhrzeit ans LCD gesendet.
mittels dem gleichen Befehl müsste doch auch die Uhrzeit irgend wo anderst geschickt werden können ( z.B. in den Speicher ) hiermit könnte ich dann doch eher was anfangen.

Vieleicht hat noch jemand eine Idee.

Mit rtc.getTimeStr() hast Du den gewünschten String doch schon am Wickel. Was willst Du mehr?

Hallo

danke für die Antwort.
Aber genau da ligt mein Problem ich bekomme es nicht hin den String weiter zu verarbeiten .
Ich muß zugeben dass ich mich noch nicht so gut auskenne.
Könnte mir da jemand helfen?

Danke schon mal im Vorraus Rudi

Wenn Du uns jetzt noch verraten würdest was Du mit dem String machen willst, dann könnte man Dir vieleicht helfen. Aber ein: ich kriege "es" nicht hin ohne Beschreibung was "es" ist. Wie soll Dir da jemand helfen?

OK Sorry

ich möchte die Zeit mit einer Vorher eingestellten vergleichen und wenn diese überschritten wird soll ein Ausgang geschaltet werden also genau wie bei einer Schaltuhr.
wenn das Projekt fertig ist sollte die Schaltuhr eine ,durch einen Drehgeber, einzustellende Zeit von einer vorgegebenen Zeit abziehen und dann den Ausgang schalten wenn diese errechnete Zeit erreicht wird. ( hoffentlich habe ich mich nicht zu kompliziert ausgedrückt )

Das sollte eine einfach zu bedienende Steuerung für eine Nachtspeicherheizung werden .

Ich möchte das Ganze in Schritten entwickeln ,denn etwas lernen möchte ich ja auch und nicht nur einen vorgefertigten Sketch übertragen.
Darum hoffe ich ,dass wenn es ins stocken gerät ,ich hier immer etwas Hilfe bekomme.

Grüße Rudi

http://www.google.com/search?btnG=1&pws=0&q=atoi

Wieso verwendest Du nicht einfach die Funktion "rtc.getTime()"?

Das liefert ein struct mit allen Einzelwerten. Du hast also Zugriff auf Stunde, Minute, Sekunde usw. und zwar als Zahlen und nicht als String. Damit kannst Du dann locker die aktuelle Zeit mit einer beliebigen anderen vergleichen.