Ungenauigkeiten beim DS3231

Hallo Leute,

ich habe vor ein paar Wochen eine Torsteuerung programmiert die bei einem HIGH ein Relais schaltet. Das Problem ist die Steuerung soll bei einem HIGH an jeden Samstag zwischen 13:00 Uhr und 13:30Uhr das Relais nicht schalten. Dafür der DS3231.Ein paar Leute haben mir dann auf die Sprünge geholfen und mich auf die Idee gebracht eine boolean zu erstellen die dann mit True oder False gefüllt wird je nach dem ob Samstag 13 Uhr ist oder nicht.

http://forum.arduino.cc/index.php?topic=259323.msg1832577#msg1832577

Hier nochmal der Link von der Topic.

Das System funktioniert einwandfrei. Auser das die Real Time Clock ca 4-5 Minuten nach geht. Ich weiß nicht an was es liegt das heißt:

Das HIGH von einem Funkmelder kommt am Samstag circa um 13:03 Uhr, zu diesem Zeitpunkt ist die Boolean jedoch noch auf HIGH und die Tore gehen auf. Hier nochmal der Sketch:

#include <Wire.h>
#include <DS3231.h>

DS3231 clock;
RTCDateTime dt;

int fme_stat = 0;  //Pin 8 Melderladestation
boolean tor_sperrung_aktiv = false;   // Torsperrung

void setup()
  {
  clock.begin();
  Serial.begin(9600);  
  clock.setDateTime(__DATE__, __TIME__);

  
  pinMode(2, OUTPUT);  //Groß_Hoch
  pinMode(3, OUTPUT);  //Groß_Runter
  pinMode(4, OUTPUT);  //Klein_Hoch
  pinMode(5, OUTPUT);  //Klein_Runter
  pinMode(10, OUTPUT);  //LED Rot
  pinMode(13, OUTPUT);  //LED Blau
  pinMode(8, INPUT);  //Melderrelais
  //digitalWrite(2, HIGH);
  //digitalWrite(3, HIGH);
  ///digitalWrite(4, HIGH);
  //digitalWrite(5, HIGH);
  }

void loop()
{
  boolean tor_sperrung_aktiv = false;   // Torsperrung
  dt = clock.getDateTime();
  fme_stat = digitalRead(8);
  
  
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  
  
  if(dt.dayOfWeek==6 && dt.hour==13 && dt.minute>=0 && dt.minute<=10)
  {
   tor_sperrung_aktiv = true;   // Tore bleiben bei Probealarm gesperrt
  }
  else
  {
   tor_sperrung_aktiv = false;   // Torsperrung deaktiviert
  }
  
  
  if(fme_stat == HIGH)// && tor_sperrung_aktiv == false)
  {
    
    
    digitalWrite(10, HIGH); //LED Rot AN
    digitalWrite(13, LOW);  //LED Blau AUS
    
    digitalWrite(2, LOW);
    digitalWrite(4, LOW);
    delay(500);
    digitalWrite(2, HIGH);
    digitalWrite(4, HIGH);
    
    delay(60000);
    
    digitalWrite(10, LOW);
    digitalWrite(13, HIGH);
  }

else
{
digitalWrite(13, HIGH);  //LED Grün AN
}


}

Das komische ist jedoch, wenn ich den Beispiel Sketch für den Timer lade, ist die Uhrzeit auf 12 Sekunden genau....

Ich hoffe ihr könnt mir helfen ...

Mfg Maddig

Welche Lib verwendest du? Das Problem hier ist, dass du dir nie die neue Zeit von der DS3231 geholt hast XD
Für den Uno sind die 4-5 Minuten ja ganz ordentlich :wink:

Habe in meiner Arduino IDE keine User Libaries. Sende mal eben deinen Beispiel Code von der Lib. Dort wird irgendwo der entsprechende Punkte gesetzt. Interval oder ähnlich.

maddig:

void setup()

{
 clock.begin();
 Serial.begin(9600);  
 clock.setDateTime(DATE, TIME);

Falls das mit Deiner Library so funktioniert wie Du es da hingeschrieben hast:
An der Stelle im Setup stellst Du die Uhrzeit auf die Zeit und das Datum, an dem Du den Sketch auf Deinem PC kompiliert hast.

D.h. bei jedem Reset oder Neustart des Programms wird die Uhrzeit auf exakt diesen Zeitpunkt eingestellt.

Spielst Du das Programm 5 Minuten nach dem Kompilieren auf den Controller ==> Uhr geht 5 Minuten nach.

Machst Du nach nochmal 10 Minuten einen Reset ==> Uhr geht dann schon 15 Minuten nach,

Und kommt nach einer Woche ein Stromausfall und der Controller startet danach neu, dann geht die Uhr eine Woche nach.

Findest Du es so günstig, die Uhrzeit bei jedem Neustart des Controllers auf den Zeitpunkt zurückzusetzen, an dem das Programm auf dem PC zusammenkompiliert wurde?

Im Normalfall würdest Du wohl das Programm so kompilieren, hochladen und laufen lassen.
==> Zeit wird aktuell gestellt
Dann die Zeile "clock.setDateTime(DATE, TIME);" im Quellcode auskommentieren
Und dann das Programm nochmals hochladen, so dass die Uhr danach nicht ständig bei jedem Reset neu gestellt wird.

Hier der Beispiel code :

#include <Wire.h>
#include <DS3231.h>
 
DS3231 clock;

 
void setup()
{
  Serial.begin(9600);
 
  // Inicjalizacja DS3231
  Serial.println("Initialize DS3231");;
  clock.begin();
 
  // Ustawiany date i godzine kompilacji szkicu
  clock.setDateTime(__DATE__, __TIME__);
}
 
void loop()
{
  // Odczytujemy i wyswietlamy czas
  dt = clock.getDateTime();
 
  Serial.print("Raw data: ");
  Serial.print(dt.year);   Serial.print("-");
  Serial.print(dt.month);  Serial.print("-");
  Serial.print(dt.day);    Serial.print(" ");
  Serial.print(dt.hour);   Serial.print(":");
  Serial.print(dt.minute); Serial.print(":");
  Serial.print(dt.second); Serial.println("");
 
  delay(1000);
}

Ok das mit dem einmal mit clock.setDateTime(DATE, TIME); Hochladen und dann auskommentieren und nochmal hochladen klingt für mich logisch... Durch die Batterie müsste ja dann immer die Uhr weiter laufen...

Denn jetz kapier ich auch wo der Fehler liegt:

Nach Alarm resete ich den Arduino durch einen Öffner der den Strom kappt. Deswegen startet der Arduino auch immer neu.

Ach und nochwas:

Kann es am DS3231 liegen, das wenn ich den Input manuell auf HIGH setze es mal funktioniert und mal nicht, wenn die Uhr voll im "Eingriff " ist ?

Ich hab gerade mal ausprobiert alles was mit der Uhr zu tun hat aus zu kommentieren und er hat das Relais immer geschaltet.

Hallo,

das wird an Deinen festen delay liegen, damit blockierst Du an den Stellen den gesamten µC im Ablauf und der kann nicht reagieren auf irgendwelche Änderungen an irgendwelchen Eingängen o.a.. Ganz ehrlich, diefesten delay müssen raus damit das sicherer und besser läuft.

Überarbeite den Sketch nochmal gründlich inkl. Kommentar Korrektur, damit wir das besser lesen können und poste den Sketch bitte nochmal.

Ok das mit dem einmal mit clock.setDateTime(DATE, TIME); Hochladen und dann auskommentieren und nochmal hochladen klingt für mich logisch... Durch die Batterie müsste ja dann immer die Uhr weiter laufen...

Vergleichbare Probleme belasteten auch mich.....
Es mussten nicht nur die Uhrzeit, sondern auch noch Parameter im EEProm gesetzt werden können.
Und das bitte, ohne jedes mal flashen zu müssen.

Als hilfreich dabei hat sich folgende Lib erwiesen.
http://playground.arduino.cc/Code/CmdMessenger
Das ist jetzt mein Kanone für alle solche Spatzen .... ]:smiley:

Hallo,

nimm doch die set Date/Time Funktions ganz raus in einen separaten Sketch. Die DS3231 mußte für lange Zeit nur einmal stellen. Was Du natürlich noch machen mußt ist, die Sommer/Winterzeit Korrektur einbauen, sonst geht die bald um eine Stunde falsch.