Wecker einrichten (mehrere Strings abgleichen)

Hi,
ich habe folgendes Problem:

Ich möchte einen Wecker mit dem Arduino und einem DS3231-RTC-Modul bauen.
Dafür möchte ich erstmal im Programm mehrere Weckzeiten für unterschiedliche Tage hinterlegen.
Diese möchte ich dann mit der aktuellen Zeit abgleichen. Die aktuelle Zeit von RTC-Modul ist ein String.
Ich dachte an ungefähr sowas:

#include DS3231.h

String zeit1 = "06.30.00";
String datum1 = "03.06.18";
String zeit2 = "07.15.00";
String datum2 = "04.06.18";
String zeit3 = "06.10.00";
String datum4 = "05.06.18";

void setup() {
  rtc.begin();
}

void loop() {
  
  String aktuelleZeit = rtc.getTimeStr();
  String aktuellesDatum = rtc.getDateStr();

  int i = 1;

  if((aktuelleZeit == zeit i) && (aktuellesDatum == datum i)){
    WECKTON AN;
    i++;
    }
  else{
    WECKTON AUS;  
    }
}

Aber ich komm einfach nicht drauf, wie das mit dem Zähler i und den Uhrzeiten richtig funktioniert.

Kann mir jemand bitte helfen? :-[

Hi

Das kompiliert?? :o

Um einen String gehören “”
“Ich bin ein String”

Um ein einzelnes Zeichen ‘’
‘A’

Die “” haben den Sinn, daß hinter den String noch ein Null-Zeichen (/0) angehangen wird, Welches das Ende des String markiert.
zeit1 kannst Du auch heinz nennen, oder otto, ganz gewagt wäre ottokarlheinzgustav.
Ob da eine 1 oder eine 2 dran oder drin ist, ist dem Kompiler wurscht - Das sind Alles eigene Namen, Die Du so auch nicht ‘zusammenbauen’ kannst.

Du könntest Arrays benutzen um die verschiedenen Zeiten und Daten aufzunehmen - dann hast Du immer noch den unglücklichen Vergleich von zwei Strings - da muß nur ein Leerzeichen zu viel drin sein, ein falsches Leerzeichen, ein Steuerzeichen - egal was an den zwei Strigs anders ist, ob Du Das als Mensch siehst oder nicht, wenn der Arduino Das sieht, reicht Das für ‘ungleich’.

Tue Dir einen Gefallen und zerlege die Zeiten und Daten in die einzelnen Zahlen, speichere Diese als Byte und prüfe, ob diese Bytes identisch sind.

Wenn Du einen halbwegs funktionieren Sketch bietest, können wir ja noch Mal schauen.

MfG

PS: ungeprüft, bezweifel aber stark, daß Das fehlerfrei vom Kompiler gefressen wird

Hallo ,

ist sicher nicht die beste Lösung , habs nur gerade gefunden , aber anscheinend eine Lösung

Google mal Arduino Wecker

Heinz

Hi postmaster-ino,

das mit den Strings ist mir klar, da hab ich jetzt aber nicht wirklich drauf geachtet (da eh nur Beispielcode). Mir ist auch bewusst, dass ich eine Variable so nennen kann wie ich will. Ist so vielleicht nur n bisschen übersichtlicher. Und ich weiß auch, dass ich mit Leerzeichen usw. aufpassen muss. Das Risiko geh ich ein. Hab gehört Mädchen stehen heutzutage auf Bad Boys.

Sorry.

KeinPlan:
das mit den Strings ist mir klar, da hab ich jetzt aber nicht wirklich drauf geachtet (da eh nur Beispielcode). Mir ist auch bewusst, dass ich eine Variable so nennen kann wie ich will. Ist so vielleicht nur n bisschen übersichtlicher. Und ich weiß auch, dass ich mit Leerzeichen usw. aufpassen muss. Das Risiko geh ich ein. Hab gehört Mädchen stehen heutzutage auf Bad Boys.

Dir sollte schon klar sein, dass wir helfen wollen und dir dann alle deine Fehler aufzeigen.
Da solltest du dann "Beispielcode" beischreiben, dann wissen wir, wie es gemeint ist.

Was dein Zähler betrifft, setze es in ein Array, z.B.

String zeit[] = {"6.30.00", "7.15.00", "7.45.00"};

Und frage mit

zeit[0] ... zeit[2]

ab.

Aber besser wäre, du verzichtest auf Strings und nimmst Zahlen, wurde dir ja auch schon vorgeschlagen.

Ok, danke :slight_smile:

KeinPlan:
Ok, danke :slight_smile:

Gerne, für eine bessere Lösung sehe ich auch die Verwendung der Zahlen als Byte:

Mein Beispiel:

// Schaltzeiten EIN ---------------------------------------------------------------------------
byte On_Timer_hh[] =  {  6, 12,  6, 12, 12, 16,  6, 17 };     // Einschaltzeit Stunden
byte On_Timer_mm[] =  {  0,  0, 30,  0, 30,  0, 30,  0 };     // Einschaltzeit Minuten

Die Abfrage erfolgt ähnlich wie oben.
Die kannst du direkt mit den Zahlen aus der RTC vergleichen.

Hi,

die Zeite HH MM SS in einzelne byte zu zerlegen und dann darauf abzufragen, ist sicher eine gute Idee. Ich hab mal so was ähnlches gemacht und vergleiche dabei auf die sekunden eines Tages. Dabei will ich allerdings täglich zu bestimmten Zeiten etwas machen. Ist natürlich beim Wecker stellen etwas umständlich erst die Sekunden für 06:15 auszurechnen.

Brauchst Du beim Wecker wirklich die sekunden ?? (macht dein Handy auch nicht)

Man könnte sich auch aus der aktuellen Uhrzeit eine Zahl berechnen mit dem Format 1530 für z.B 15:30 (Stunde*100+Minute) die Weckzeit gibt man dann im Format 630 ein für 6:30 und dann für den Wecker auf >=630 abfragen.

übrigens Array Variable schreibt man als z.B Zeit[1] hast Du aber sicher schon bemerkt. und die kann man mit Zeit(i) z.B in einer Schleife dann adressieren.

PS das mussen eckige Klammern sein geht aber hier irgendwie nicht sie sind dann weg.

Heinz

Willst Du wirklich einen Wecker bauen der am Tag x um die Uhrzeit y Alarm schlägt, oder brauchst Du einen Wecker der Am montag um 6, am dienstag um 7 usw läutet?

Du kannst die Zeiten und das Datum in Zahlen umwandeln:

  1. UNIX-Zeitstempel ab 1.1.1970 00:00:00
  2. Sekunden des Tages ab 0h und Tage ab 1.Jänner des Jahres. (würde aber bei Zeiten im nächsten Jahr Probleme geben)
  3. Sekunden des Tages ab 0h und Tag als ttmmjjjj- Zahl.

Auf diese Weise brauchst Du nur Zahlen vergleichen und ein Alarmwiederholung alle 5 Minuten damit man noch 5 Minuten schlafen kann ist auch leicht realisierbar.
Bei Wocheneinteilung gibt die RTC bereits den Wochentag aus (ich glaube mit Zählung an Sonntag)

Grüße Uwe

Danke an alle Tippgeber und Helfer,
mein Wecker geht jetzt. Ich kam nur nicht darauf, nen Array zu verwenden.

@uwefed: Ich will tatsächlich nen Wecker, den ich mit meinem Kalender "synchronisieren" kann. Ich bin Student, da schlaf ich auch unter der Woche mal länger aus wenn nichts wichtiges ansteht :grinning:

Super dass es jetzt funktioniert.
Danke für die Rückmeldung.

Und alle Leser freuen sich, wenn du uns mitteilst, wie du es jetzt gelöst (Sketch posten) hast.