Go Down

Topic: DS3231 RTC soll im 12h Takt den Arduino Pro Mini wecken. (Read 2332 times) previous topic - next topic

eplan

Hallo,

ich bin am verzweifeln. Zur Zeit bin ich dabei eine kleine
Türüberwachung zu entwickeln.

Ziel: Die Tür ist geschlossen. Alle 12h gibt es über ein GSM Shield
(SIM900) einen Kontrollanruf. Zwischen diesen 12h lege ich den Atmega
328 schlafen. Wird die Tür in der Zwischenzeit geöffnet, gibt es
ebenfalls einen Anruf. Der normalerweise darauf folgende Anruf (12h
Takt) bleibt ab dann aus.

Alles funktioniert wunderbar, bis auf den Anruf der alle 12h durchgeführt werden soll.

Zurzeit bekomme ich jede Sekunde vom RTC (DS3231) ein Ausgangssignal
(Alarmsignal). Sinn der Geschichte ist es ja aber alle 12h (oder zum
Test jede Minute) ein Signal heraus zu bekommen.

Ich kann den Fehler nicht finden. Hier mein Sketch:

Danke für jede Hilfe im voraus!



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

DS3231 clock;
RTCDateTime dt;
boolean isAlarm = false;
boolean alarmState = false;
int alarmLED = 13;

void alarmFunction()
{
  Serial.println("ALARM");
  isAlarm = true;
}

void setup()
{
  Serial.begin(9600);

  // Initialize DS3231
  Serial.println("Initialize DS3231");;
  clock.begin();

  // Disarm alarms and clear alarms for this example, because alarms is
battery backed.
  // Under normal conditions, the settings should be reset after power
and restart microcontroller.
  clock.armAlarm1(false);
  clock.armAlarm2(false);
  clock.clearAlarm1();
  clock.clearAlarm2();

  // Manual (Year, Month, Day, Hour, Minute, Second)
  clock.setDateTime(2014, 4, 25, 0, 0, 0);

  // Set Alarm2 - Every 01m in each hour
  // setAlarm2(Date or Day, Hour, Minute, Mode, Armed = true)
  clock.setAlarm2(0, 0, 1,     DS3231_MATCH_M);

  // Attach Interrput 0. In Arduino UNO connect DS3231 INT to Arduino
Pin 2
  attachInterrupt(0, alarmFunction, FALLING);

  // Setup LED Pin
  pinMode(alarmLED, OUTPUT);
}

void loop()
{
  dt = clock.getDateTime();
  Serial.println(clock.dateFormat("d-m-Y H:i:s - 1", dt));

  if (isAlarm)
  {
    digitalWrite(alarmLED, alarmState);
    alarmState = !alarmState;
    clock.clearAlarm2();
  }

  delay(1000);
}


Doc_Arduino

Hallo,

schau Dir dazu das Datenblatt vom DS3231 an.

Man kann mit Masken Bits (mehrere Register jeweils das 7. Bit) ganz leicht einen Sekunden, einen Minuten und einen 30sec. Sekundentakt definieren. Alles abweichende davon muß man mit Alarmuhrzeiten vorgeben. Nun hast Du glücklicherweise einen DS3231. Hier mußte jetzt 2 Alarmzeiten definieren. Zum Bsp. 0:00 Uhr und 12:00 Uhr. Und setzt die Masken Bits entsprechend "Alarm when hour, minutes and seconds match" sind.
Dann haste aller 12 Stunden ein Alarmsignal zur Auswertung.

Und denke dran, das delay muß am Ende raus. Solche Dinge stören den gesamten Ablauf.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

Serial hat übrigens in Interrupts nicht verloren. Die Ausgabe kannst du in deiner if (isAlarm) Abfrage machen

Und Variablen die innerhalb und außerhalb von Interrupts verwendet werden (wie isAlarm) müssen als volatile deklariert werden!

michael_x

Ich sehe nicht, wo isAlarm jemals wieder auf false gesetzt würde. ( ausser per Reset )

Go Up