DS1307 Real Time Clock

Guten Abend,

ich bin zurzeit am tüfteln mit einem DS1307 Real Time Clock Module bzw. werde ich mir eins besorgen sobald ich weiß ob das möglich ist was ich mir denke...

Das ganze soll eine Torsteuerung für ein Feuerwehrhaus werden. Die Situation ist wie folgt:

Ein Meldeempfänger gibt bei der Alarmierung durch ein Relais einen Input an den Arduino und dieser öffnet zwei Tore gleichzeitig und nach 10 Minuten fahren die Tore wieder runter. Das funktioniert sehr gut und hat sich bis jetzt schon einige Male durch Schnelligkeit und Unkompliziertheit bewiesen. Jetzt ist das Problem, dass es bei der Feuerwehr jeden Samstag, bei uns ist es zwischen 13:00 Uhr und 13:30 Uhr, eine Probealarmierung gibt. Heißt die Tore gehen auf obwohl keine Echteinsatz vorliegt. Und da dann niemand zum FW Haus kommt stehen die Tore für 10 Minuten offen und jeder kann ein und aus spazieren und alles mitnehmen was er will.

Nach einer GoogleSuche bin ich auch das DS1307 Real Time Clock Module gestoßen.

Jetzt ist meine Frage ob mir jemand ein paar Zeilen Code schreiben kann das per if Funktion oder ähnlichen die Toröffnungsbefehle nur "erlaubt", wenn es nicht Samstag zwischen 13:00 und 13:30 Uhr ist ?
Also in etwa so:

void loop()

{

if(nicht Samstag, 13:00 bis 13:30)

{
digitalWrite(8, HIGH),
...
...
...
}

}

Ich hoffe ihr könnt mir helfen :slight_smile:

Mfg maddig

Lege dir besser eine DS3231 zu:
http://www.ebay.de/itm/2-x-DS3231-AT24C32-IIC-Real-Time-Clock-Memory-Modul-RTC-fur-Arduino-AVR-ARM-PIC-/191149158631?pt=Bauteile&hash=item2c8160b0e7
Oder billiger aus China

Die DS1307 ist allgemein ziemlich ungenau. Ich muss zwar total das Glück haben und habe eine erwischt die nur eine handvoll Sekunden pro Monat falsch geht. Oder vielleicht liegt es daran das die Temperatur relativ konstant ist. Aber die können auch schnell mal ein paar Minuten pro Monat falsch gehen. Für deine Anwendung ist das zu kritisch.

Die DS3231 ist dagegen Temperatur-kompensiert und geht nur ein paar Sekunden im Jahr falsch. Funktionieren tut sie genauso. Damit kann man sogar zwei Alarme in die RTC einprogrammieren die dann beim Erreichen einen Interrupt auslösen.

Das würde ich defentiv nicht ausschließlich mit den DS1307 machen. Der driftet zeitlich stark ab. Wenn Pech hast, ist der in einm paar Monaten bei 11 Uhr :smiley:

Da sollte mindestens ein DCF77 Modul dazwischen, welches sich die Atomzeit holt

Schreiben darfste den Code selber. Schau dir die Time Libary an bzgl. Weekday usw an.

if(weekday() == 6 && hour() == 13 && minute() >= 0 && minute() <= 30)
{
// darf nicht hochfahren
}

Aber was passiert, wenn es kein Probealarm ist? Was pasiert dann?

Ok danke für die Hilfe hat mir schon mal weitergeholfen!.

Also wenn es um die Uhrzeit zufälligerweise mal ein echter Alarm ist gibt es immer noch die alte Variante mit Schlüssel das wäre nicht so tragisch.

Und danke für den Code Ansatz. Könnte ich es dann so machen ?:

void loop()
{
  fme_stat = digitalRead(8);  //an Pin 8 hängt der Schließerkontakt der Melderladestation
  
  if((weekday() == 6 && hour() == 13 && minute() >= 0 && minute() <= 30)

{
    digitalWrite(2, HIGH);  //Relais gesperrt bzw. AUS
    digitalWrite(4, HIGH);
}


else(fme_stat == HIGH)
  {
    //ledcount = ledcount + 1;
    digitalWrite(10, HIGH);  //Status LED
    digitalWrite(13, LOW);   //Status LED
    digitalWrite(2, LOW);    //1. Relaisausgang ein (Signal umgekehrt)
    digitalWrite(4, LOW);   //2. Relaisausgang ein (Signal umgekehrt)
    delay(500);
    digitalWrite(2, HIGH);
    digitalWrite(4, HIGH);
    
    
    delay(600000);  //10 Minuten warten
    
    //ledcount = ledcount - 1;
    digitalWrite(10, LOW);
    digitalWrite(13, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(5, LOW);          //Und alles wieder umgekehrt
    delay(500);
    digitalWrite(3, HIGH);
    digitalWrite(5, HIGH);
  }

Wobei ich bei else keine Parameter setzen kann oder ? Wie könnte ich das so hinbekommen ?

mfg

Bei "else" nicht, jedoch ein "else if"

Was ist mit der Sicherheitseinrichtung, wenn sich Personen unter den Toren befinden? Oder ist die Sicherheitsvorkehrung von einem richtigen Garagentorsystem erfüllt?

Und schau dir mal BlinkWithoutDelay sowie die einfachen Tutorials an. Hier stört zB. das delay defentiv.

Hallo,

mit "else if" würde er ständig Pin 2 / 4 zwischen Low/High hin und her schalten. Ob das dem Motor gut tut ... ? :slight_smile:

Und nimm wenn das wirklich die DS3231. Hab ich auch, läuft 1A stabil seit vielen Wochen.
Wenn Du DCF nehmen sollten, prüfe vorher ob am FW-Haus auch ordentlicher Funktempfang ist.
In meiner Schalfstube, wo es wichtig wäre, hab ich nur manchmal DCF Empfang. Im Wohnzimmer dagegen immer. Das Leben ist kein Zucker schlecken. :slight_smile:

was hälste davon?
Definierst global: "boolean Tor_Sperrung_aktiv = false; // Torsperrung"

void loop()
{
  fme_stat = digitalRead(8);  //an Pin 8 hängt der Schließerkontakt der Melderladestation
  
  if ( (weekday() == 6 && hour() == 13 && minute() >= 0 && minute() <= 30 )
    {
     Tor_Sperrung_aktiv = true;   // Tore bleiben bei Probealarm zu
    }
	else
	  {
       Tor_Sperrung_aktiv = false;   // Torsperrung deaktiviert
       }

  if (fme_stat == HIGH && Tor_Sperrung_aktiv = false)
   {
    //ledcount = ledcount + 1;
    digitalWrite(10, HIGH);  //Status LED
    digitalWrite(13, LOW);   //Status LED
    digitalWrite(2, LOW);    //1. Relaisausgang ein (Signal umgekehrt)
    digitalWrite(4, LOW);   //2. Relaisausgang ein (Signal umgekehrt)
    delay(500);
    digitalWrite(2, HIGH);
    digitalWrite(4, HIGH);
    
    
    delay(600000);  //10 Minuten warten
    
    //ledcount = ledcount - 1;
    digitalWrite(10, LOW);
    digitalWrite(13, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(5, LOW);          //Und alles wieder umgekehrt
    delay(500);
    digitalWrite(3, HIGH);
    digitalWrite(5, HIGH);
  }

Ich hoffe mal so ist es in etwa gewünscht.
Der Code ist nicht getestet!!

Er soll wie folgt funktionieren.
Wenn Samstags zwischen der eingestellen Zeit ein Signal eurer FME kommt, dann wird die aktuelle Zeit in millis festgehalten. Wenn das Signal erlischt, wird 10Minuten gewartet, in der Zeit blinkt eine LED schnell.
Das Tor wird nicht gefahren. Achtung, ich habe jetzt nicht die Logik der Relais beibehalten. Desweiteren ist der Code nicht vollständig.

Wenn es nun an einem anderen Tag zu irgendeiner Uhrzeit zu einem FME Alarm kommt, fährt das Tor auf. Sobald der Alarm weg ist, läuft die Zeit von 10Minuten herrunter. Danach schließen die Tore. Hier blinkt die LED normal.

#include <time.h>

#define IN_FME		8	// Signal FME

#define OUT_M1		9	// Motor Tor auffahren
#define OUT_M2		10	// Motor Tor zufahren

#define OUT_LED	        11


void setup()
{
  pinMode(IN_FME, INPUT);
  pinMode(OUT_M1, OUTPUT);
  pinMode(OUT_M2, OUTPUT);	
  pinMode(OUT_LED, OUTPUT);
}

void loop()
{
  static int fme_state_rise;            // Wenn FME von AUS nach EIN geht
  static int fme_state_fall;            // Wenn FME von EIN nach AUS geht

  static unsigned long millis_fme_state_start;
  static unsigned long millis_fme_state_end;

  int fme_state = digitalRead(IN_FME);  // Status FME
  static int test_mode;

    // Abfrage ob es sich um einen möglichen Test Alarm handelt
  // Hierbei entspricht der Samstag dem Wochentag 7!
  // Sollten weitere Tage eingebaut werden, dann so
  // (weekday() == 7)
  // durch zum Beispiel Samstags UND Sonntag (der Logik entsprechend ist es aber ein oder!)
  // (weekday() == 7 || weekday() == 1)
  // ersetzen
  if(hour() == 13 && minute() >= 0 && minute() <= 30 && (weekday() == 7)) test_mode = 0;    
  else test_mode = 1;

  // Überprüfen, ob ein neuer Alarm anliegt, bzw. ein Alam ausging
  if(fme_state == 1 && fme_state_rise == 0)
  {
    fme_state_rise = 1;
    fme_state_fall = 0;
    millis_fme_state_start = millis();    // Nicht in Gebrauch, kann aber später genutzt werden, 
    // um anzuzeigen wie lange der Alarm lief, falls nötig
  }
  else if(fme_state == 0 && fme_state_fall == 1)
  {
    fme_state_fall = 0; 
    fme_state_rise = 1;
    millis_fme_state_end = millis();    // Wie lange der Alarm nicht mehr aktiv ist
  }

  // Richtiger Alarm, bzw. Probealarm ausser Samstags
  if(fme_state == 1 && test_mode == 0)
  {
    digitalWrite(OUT_M1, 1);               // Tor auffahren
    blink(OUT_LED, 2000);                  // lansgames blinken
  }
  // Probealarm Samstags
  else if(fme_state == 1 && test_mode == 1)
  {
    blink(OUT_LED, 200);                  // schnelles blinken
  }

  if(millis() - millis_fme_state_end >= 60000)
  {
    digitalWrite(OUT_M1, 0);               // Tor zufahren
    digitalWrite(OUT_LED, 0);
  }
}


void blink(int interval, int led)
{
  static int led_state;
  static unsigned long lastMillis;
  if(millis() - lastMillis >= interval) {
    lastMillis = millis();   
    if (led_state == 0) led_state = 1;
    else led_state = 0;
    digitalWrite(led, led_state);
  }
}

Wow danke für die Hilfe ! :slight_smile:

Also zum Tor: Es sind zwei Segmenttore von Hörmann also so ziemlich der Rolls Royce unter den Industrietoren und sie haben die Vollausstattung an Sicherheitseinrichtungen sprich: 2 Lichtschranken, Kantenkontrolle, Auffahrschutz, Ausfahrampel und und und...

Und wegen dem Motor dauernd HIGH und LOW das stimmt nicht so ganz weil ich gehe mit einem Relaisboard auf die Anschlüsse für externe Bedienteile von der Steuerung sprich ein Relais für Hoch und ein für Runter.

Und danke für den Code bzw die Verbesserung! Ich werde beide mal testen.

Mfg maddig