Wecker auf dem Arduino

Hallo, ich bin neu auf dem Forum und habe eine Frage. Ich weiß auch nicht, ob ich hier am richtigen Platz schreibe. Ich möchte einen Wecker auf dem Arduino programmieren, weiß aber nicht, wie ich die aktuelle Uhrzeit in einer Variablen speichern kann. Ich habe ein RTC Modul und würde schreiben, dass sobald die Variaben Stunde und Minute 5 und 15 entsprechen, dass dann ein Weckton erklingt. Es klappt aber nicht einfach mit int. Das heißt, mein Wecker sollte um 5 Uhr 15 klingeln. Kann mir irgendjemand helfen? Das wäre super! ich kann auch mal probieren mein Code hier einzubinden
viele Grüße

Super lib rund um die Zeit:

Was für eines?

Ds1307

Ok - bedenke, das die mit der Zeit sehr von der RealZeit abweicht.
Zum bauen und basteln ok, zum späteren Einsatz evtl. nach einer DS3231 suchen.

Wie sehr weicht es denn an. Bei mir nur um die 10 sek

Weißt du, wie das mit den Variablen geht?

In den examples gibt es das TimeRTC-Example.
Da werden die Daten ausgegeben.
Deine Weckdaten speicherst Du in einem byte stunde und in einem byte minute - vergleichst die mit der Uhr.

Nun nur noch vergleichen und piepen, bis Du ne Taste drückst :wink:

PS: 10sek Abweichung über welche Zeit? Am Tag 10Sek macht in der Woche mehr als 1 Minute.... Jeden Monat 5 Minuten.

Vielen Dank! :star_struck:

Aus dem Example erweitert - kannste weiterentwickeln:

/*
   TimeRTC.pde
   example code illustrating Time library with Real Time Clock.

*/

#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

const byte weckStunde = 15;
const byte weckMinute = 45;
bool weckRuf = false;

void setup()
{
  Serial.begin(9600);
  while (!Serial) ; // wait until Arduino Serial Monitor opens
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC");
  else
    Serial.println("RTC has set the system time");
}

void loop()
{
  if (timeStatus() == timeSet)
  {
    digitalClockDisplay();
  }
  else
  {
    Serial.println("The time has not been set.  Please run the Time");
    Serial.println("TimeRTCSet example, or DS1307RTC SetTime example.");
    Serial.println();
    delay(4000);
  }
  delay(1000);
  wecken();
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
}

void wecken()
{
  if (hour() == weckStunde && minute() == weckMinute)
  {
    weckRuf = true;
  }
  else
  {
    weckRuf = false;
  }
}

void printDigits(int digits)
{
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Wenn Du den DS3231 nimst dann hast Du eine sehr genauere RTC und zusätzlich 2 Alarmzeiten. Wenn die Alarmzeit erreicht ist kann ein Ausgang High gehen (muß aber so eingestellt werden).

Grüße Uwe

Weiß jemand, wie ich dann meinen Code einfügen soll, der ausgeführt werden soll, sobald der Wecker losgeht? Ich habe schon einen Sketch, weiß aber nicht, wo ich den einfügen soll
Ich kenn mich nicht aus mit "bool" geht.
Viele Grüße

Was hast Du aus #9 nicht verstanden?

hat sich geklärt. Danke trotzdem! :grinning:
VG

Weiß jemand, was ich dagegen machen kann? Reset oder neue Uhrzeit eintippen?
Viele Grüße

Natürlich kannst du in deinen dir Festgelegten Intervallen die Zeit neu eingeben. Aber ist das so gewollt? Ist das nicht total unpraktisch?

Der praktische Weg ist über dIe DS3231. Diese hat nur ein Abweichung von +/- 1 Minute pro Jahr. Dann bräuchtest du nur jährlich einmal stellen. (Was du am Ende zur Sommerzeit/Winterzeit machst, wenn du dies nicht automatisch ausführen lässt)

Und wie mache ich das?
Danke schon mal
VG

Da gibt es viele Möglichkeiten.

Neuen Sketch hochladen, Eingabe über Tasten (ein Display wäre von Vorteil), etc. Du musst dem Programm halt die Zeit übergeben.

Alternativ könntest du auch über Funk regelmäßig die Zeit holen und übergeben.

#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

const byte weckStunde = 15;
const byte weckMinute = 45;
bool weckRuf = false;

const byte stellPin = 2; // Taster an den Pin anschliessen

void setup()
{
  Serial.begin(9600);
  while (!Serial) ; // wait until Arduino Serial Monitor opens
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC");
  else
    Serial.println("RTC has set the system time");
  pinMode(stellPin, INPUT_PULLUP); // der Taster wird zwischen PIN und GND angeschlossen
}

void loop()
{
  if (timeStatus() == timeSet)
  {
    digitalClockDisplay();
  }
  else
  {
    Serial.println("The time has not been set.  Please run the Time");
    Serial.println("TimeRTCSet example, or DS1307RTC SetTime example.");
    Serial.println();
    delay(4000);
  }
  delay(1000);
  wecken();
  stellen();
}

void stellen() // festgelegte Uhrzeit stellen
{
  if (!digitalRead(stellPin))
  {
    setTime(12,0,0,day(),month(),year()); // stellt die Uhr auf aktuellens Datum 12:00 Uhr
    RTC.set(now());
  }
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
}

void wecken()
{
  if (hour() == weckStunde && minute() == weckMinute)
  {
    weckRuf = true;
  }
  else
  {
    weckRuf = false;
  }
}

void printDigits(int digits)
{
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Ist alles im Code erklärt
Ansonsten als Tipp: Das Beispiel TimeRTCSet zeigt Dir, wie das mit dem seriellen Monitor geht.

Vielen Dank :grinning: