Ereignisse steuern mit der Uhrzeit

Hallo zusammen ,

ich arbeite im Moment an einer Wetterstation die mehrmals täglich die Messdaten erfasst und speichen soll. Sicher gibt es dazu bereits einige Projekte , das ist also eigentlich nichts Neues. Für alle die ähniches vorhaben hier ein Tip :

Für Datum/Zeit verwende ich TimeLib.h . Die Uhrzeit kommt per NTP Protokoll von meiner Fritzbox. Das läuft super und hat kurze Antwortzeiten. Dabei lasse ich jede Stunde synchronisieren. Damit läuft die Zeit genau genug für die Anwendung. Als Hardware verwende ich das ESP8266-01 Modul. Zusätzlich gibts noch einen mini Webserver, damit ich die Daten jederzeit ansehen kann.

Die Messwerte werden dann mittels FTP auf der Fritzbox, und einem dort eingesteckten USB Stick in einer CVS Datei abspeichern. Da kommt man dann einfach mit dem PC dran, und die Fritzbox läuft eh immer. Ich habe also die Messwerte zunächst mittels einer Abfrage :

time_t aktuelleZeit = now();

If( aktuelleZeit > altzeit + zykluszeit) {
altzeit = aktuelleZeit
messen();
ftp_senden();

}

an den FTP Server übertragen.

Da “aktuellZeit” die aktuelle Zeit im bereinigten NTP Format ab 1900 ist , also immer stimmen sollte, habe ich zunächst gedacht das funktioniert. Dem war aber leider nicht so.

Das Messen und Uploaden ist langsam weggedriftet. Nach einem Tag erfolgte es 20s später. Nun für eine Wetterstation ist etwas doof. schliesslich sollten auch nach Monaten die Messwerte von der gleichen Uhrzeit stammen. z.B. jeden Tag um 10:00:00 und nicht nach einem halben Jahr um 10:27:15.

hier die Daten der Datei vom FTP Server siehe : am Anfang 01:05:23 und an Ende 19:05:43


2018-03-29 01:05:23;20.53;80.00;1050.00
2018-03-29 03:05:23;20.53;80.00;1050.00
2018-03-29 05:05:26;20.53;80.00;1050.00
2018-03-29 07:05:28;20.53;80.00;1050.00
2018-03-29 09:05:30;20.53;80.00;1050.00
2018-03-29 11:05:33;20.53;80.00;1050.00
2018-03-29 13:05:39;20.53;80.00;1050.00
2018-03-29 15:05:38;20.53;80.00;1050.00
2018-03-29 17:05:40;20.53;80.00;1050.00
2018-03-29 19:05:43;20.53;80.00;1050.00


Vergesst jetzt mal die Messwerte selbst, die sind derzeit noch simuliert , mir fehlen noch die Sensoren dazu. :slight_smile:

Eigendlich muss man also das betreffende Ereignis, hier das Messen und speichern auf dem FTP Server, nicht abhängig von einer Zeitdifferenz bearbeiten, sondern von der Uhrzeit selbst, nur so gehts richtig.

ich habe also eine kleine Function geschrieben die true zurück gibt wenn das Ereigniss ausgeführt werden soll. Die Zeiten zu denen das passieren soll stehen in dem globalen Array alarmzeit.

etwas ungewöhnlich ist sicher das verwendete Zeitformat. eigentlich wollte ich zuerst hour,minute,second in einen Wert umrechnen der den sekunden einen Tages entspricht. Aber so ließen sich die Sollzeiten für die Alarme nicht so einfach eingeben.

235830 einspricht also der Zeit 23:58:30.

Wenn man mit Sekunden seit 0 Uhr arbeitet, geht das natürlich auch. Dann kann man in einer Schleife das Füllen des Array automatisch machen. Aber das ist sicher Geschmackssache.

ein kleinen Haken gibt es aber noch. Irgendwann muss man das Array alarmquit ja wieder auf false setzen. ich mach das um 00:0030 also kurz nach Mitternacht vor dem ersten geplanten upload der Daten. Zusatzlich vermeide ich das Erfassen und uploaden der Daten genau um Mitternacht , man weiss ja nie. :frowning:

Heinz

// Sollzeiten für den Alarm
unsigned long alarmzeit[12] = {20000, 40000, 60000, 80000, 100000, 120000, 140000,
                               160000, 180000, 200000, 220000, 235830};
boolean alarmquit[12];


// ------------ function Alarm ------------------
//  

boolean alarm() {
  unsigned long tcode;
  int  s = second(); 
  int  m = minute();
  unsigned long h = hour();
  int i;

  // berechnet timecode im Format hhmmss
  tcode = h * 10000 + m * 100 + s;
  // tcode=h*3600 + m *60 + s;            // alternativ in sec / tag

  for ( i = 0; i <= 11; i++) {
   
    if (tcode > alarmzeit[i] & !alarmquit[i]) {
      alarmquit[i] = true;
      return 1;
    }
  }
  // reset Quittungs flag
  if (tcode = 30){
  for (i = 0 ; i <= 11; i++) {
      alarmquit[i] = false;
    }
  }
  return 0;
}

Das Messen und Uploaden ist langsam weggedriftet

Klar. Jeden Zyklus um mindestens 1 sek.

Ausserdem wäre es hübscher, wenn die Werte auf ganze Stunden synchronisiert wären.

ich habe also eine kleine Function geschrieben die true zurück gibt wenn das Ereigniss ausgeführt werden soll. Die Zeiten zu denen das passieren soll stehen in dem globalen Array alarmzeit. [...] Zusatzlich vermeide ich das Erfassen und uploaden der Daten genau um Mitternacht , man weiss ja nie.

Mit der letzten Anforderung ist dein alarmzeit Array wohl die sinnvollste Lösung.

Alternativ:
(time_t % 86400) gibt die Sekunden seit Mitternacht UTC,
(time_t % 7200) ist alle zwei Stunden eine Sekunke lang 0,
usw...