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:
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
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.
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.
mit "else if" würde er ständig Pin 2 / 4 zwischen Low/High hin und her schalten. Ob das dem Motor gut tut ... ?
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.
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);
}
}
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.