if Anweisung Abfrage

Hallo zusammen

Brauche mal wieder Eure Hilfe

Ich moechte in einer if Abfrage in einer Stunde moechte Ich alle 5 minuten und 0 Sekunden eine abfrage machen Gibt es da eine kurzform oder muss Ich das 12 mal schreiben

If (second() == 0 && minute() == 0 ) If (second() == 0 && minute() == 5 ) If (second() == 0 && minute() == 10 )

bye juergen

Ist doch schon recht kurz ;)

Alternativ könntest du mit Modula arbeiten.

if(minute() % 5 == 0 && second() == 0)

Ob eine Zahl durch 5 teilbar ist kann man einfach mit einer Modulo-Division herausfinden: http://arduino.cc/de/Reference/Modulo

if(second() == 0 && minute() %5 == 0)

Modulo gibt dir den Rest einer Division zurück. Und der ist 0 wenn es durch den Wert teilbar ist.

Du könntest den 0-Sekundendurchgang in einer if-Abfrage machen und den entsprechenden Minutentakt mit switch/case realisieren? Soll jedesmal das gleiche passieren oder bei 5, 10, 15, ... Minuten etwas anderes? Im ersten Fall könntest du dann nämlich auch Modulo verwenden, also if (minute%5==0){}.

Hallo zusammen Ich moechte von einen S0-Zaehler die Impulse die Ich bekomme alle 5 Minuten Speichern und das ueber ca 18 Stunden habe eine PV-Anlage

bye juergen

Oder nimm die Sekunden ab Mitternacht ( oder ab 1.1.2000 oder ab 1.1.1970 oder was du da hast )
und alle 300 ist es genau 5, 10, 15 … Minuten und 0 sek.
Dass dafür die Modulo-Division (utime % 300) erfunden wurde, hast du schon mitgekriegt, stimmts :wink:

Die Sekunden seit Mitternacht kriegt man durch % 86400L und darauf kannst du dir auch Tagesgrenzen setzen:

unsigned long utime = RTC.now().unixtime(); // oder wie immer das deine RTC library macht
unsigned long sec = utime % 86400;
if (sec >= 4*3600L && sec <= 22*3600L && sec %300 == 0) {
  // alle 5 Minuten zwischen 05:00 und 21:00
}

Hallo zusammen

Hallo michael_x

Habe das librarie DS1307RTC bekomme die Fehlermeldung

error: 'class DS1307RTC' has no member named 'now'

mit welchen librarie wuerde es denn gehen

bye juergen

Ich hab eine, die heisst RTC\rtclib.h und behauptet sie wäre aus http://news.jeelabs.org/code/ ( Was aber "404 Not Found" liefert :P )

Die liefert eine class RTC_DS1307 mit der Funktion now(), was ein DateTime Objekt liefert, das die Methode unixtime kennt.

Jetzt könnte ich natürlich suchen, wo ich die wirklich her habe (-> https://github.com/adafruit/RTClib ) aber eigentlich sollten alle RTC libraries, die mehr machen als eine kleine Verpackung der Wire.h zu sein, irgendwie die Anzahl Sekunden seit Anfang der Zeitrechnung zurückliefern.

Was bei Sommerzeit-Umschaltung passiert, oder auf welche Zeitzone der 01.01.2000 00:00 sich bezieht, ist ja eh eine ganz andere Frage...

Hallo zusammen

Hallo michael_x

Das ist eine sehr gute Idee mit der Abfrage in Sekunden Ich werde das mit den millis() um 0 Uhr synchronisieren

Modulo-Division Ja das habe Ich hier vor kurzen gelesen

Ist ein Suuper Board hier

Ich danke Dir sehr michael_x

bye juergen

Mit der Abfrage "If (second() == wert){ // Aktion ausführen }" wirst du die Aktion eine Sekunde lang immer wieder ausführen (der Arduino ist schnell!)

Du mußt noch dafür sorgen, dann die Aktion jeweils nur einmal ausgeführt wird.

static boolean RunAction = true;
if (second() == wert){
 if(RunAction){
  // Aktion ausführen
  RunAction = false;
 }
} else {
  RunAction = true;
}

Hallo zusammen

Hallo guntherb

Das weis Ich habe das so gemacht

if (sec >= 4*3600L && sec <= 22*3600 && sec %10 == 0 && sec > sec1) 
  {
  
    sec1=sec;
  }

bye juergen

22 * 3600 produziert einen Integer Überlauf und damit eine negative Zahl!

Mit 22 * 3600UL (oder 3600L) geht es. Dann wird in unsigned long, bzw. long gerechnet

Hallo zusammen

Hallo michael_x

Noch mal eine Frage

um die sekunden zu berechnen koennte Ich doch auch

sec=(3600L*hour())+(60*minute())+second();

schreiben

Hallo Serenifly

Jetzt weis Ich wenigstens wofuer das L oder Ul ist muss bei dieser Rechnung auch bei den minuten ein L geschrieben werden

sec=(3600L*hour())+(60*minute())+second();

bye juergen

Nein. Standardmäßig wird in int gerechnet: http://arduino.cc/de/Reference/Int

Das heißt du brauchst das nur wenn das Ergebnis größer als 32.767 ist

Hallo zusammen

Hallo michael_x

Habe das RTClib gefunden klappt jetzt mit der Unixtime

Danke noch mal

bye juergen