struct SensorData
{ // zur Aufnahme
eines Datums von einem Sensor-Paar (3 Byte) int16_t temp : 12; // 12 Bit vom DS18B20 via I2C uint16_t ldr : 10; // 10 Bit vom GL5528 via analogRead() uint8_t bad : 1; // auf 1 für "temp-CRC hat nicht gepasst", auf 0 für "Daten legal" }; |
sensor_move=0
wenn Sonder-Sync-Taster gedrückt ist
sensor_move=1 // beim nächsten Sync
melden, dass vorab ein neuer location-Satz für diese Einheit
angelegt werden soll
minute_array auf ungültig setzen
minute_array_idx=0 // Index in minute_array
hour_array auf ungültig setzen
day_array auf ungültig setzen
Zeit über WLAN holen
Zeit per Time.h / setTime() einstellen
wenn second()>52: warte, bis second()==0 // mindestens zwei
Messwerte für einen Minuten-Mittelwert
cur=now()
done_second=-1 // "diese Sekunde wurde bereits bearbeitet"
auf "nicht diese" setzen -> also sofort Messwert holen
cur_minute=minute(cur) // "diese Minute wird gerade
bearbeitet"
cur_hour=hour(cur) // "diese Stunde wird gerade
bearbeitet"
done_day=-1 // "dieser Tag wurde bereits bearbeitet" auf
"nicht heute" setzen
done_sync_minute=-1 // "in dieser Minute wurde schon
synchronisiert" auf "nicht diese Minute" setzen
hour_array.timestamp=timestamp(cur) // für aktuelle Stunde
initialisieren
cur=now() // aktuelle Zeit holen und für diesen
Durchlauf statisch halten
// wenn es Zeit ist, einen Messwert zu holen und er nicht schon
geholt wurde
wenn (second(cur)-2)%5==0 && done_second!=second(cur)
Messwerte holen und ablegen in
minute_array[minute_array_idx]
minute_array_idx++
Lebenszeichen-LED kurz blinken lassen
done_second=second(cur) // diese
Sekunde wurde bereits bearbeitet
// wenn die Minute um ist
wenn cur_minute!=minute(cur)
Mittelwerte über minute_array bilden und
ablegen in hour_array.data[cur_minute]
minute_array auf ungültig setzen
minute_array_idx=0
cur_minute=minute(cur) // diese Minute
wird gerade bearbeitet
// wenn die Stunde um ist
wenn cur_hour!=hour(cur)
day_array[cur_hour]=hour_array //
abgelaufene Stunde umkopieren
hour_array auf ungültig setzen
hour_array.timestamp=timestamp(cur) //
für neue Stunde initialisieren
cur_hour=hour(cur) // diese Stunde wird
gerade bearbeitet
// wenn der Tag noch nicht bearbeitet wurde und die Sync-Stunde
läuft
// und (für den Fall, das nicht erfolgreich gesendet werden
konnte) die Minute ganzzahlig durch 5 teilbar ist
// und diese Minute hier noch nicht bearbeitet wurde
wenn done_day!=day(cur) && hour(cur)==SyncZeit
&& (minute(cur)%5)==0 &&
done_sync_minute!=minute(cur)
day_array an Socket-Server senden und von
dort die Zeit holen
wenn erfolgreich gesendet wurde
Zeit per Time.h /
setTime() einstellen
wenn
hour(cur)!=hour() // wenn die Zeit in die vorige Stunde
zurück-korrigiert wurde
wenn
now()<cur // wenn tatsächlich zurück-korrigiert wurde
warte, bis minute()==0
day_array auf ungültig
setzen
done_day=day(cur) //
heute kein Sync mehr
done_sync_minute=-1
// beim nächsten Sync sofort Wiederholung erlauben
sonst, wenn nicht erfolgreich gesendet wurde
done_sync_minute=minute(cur) // erst in 5 Minuten wieder
einen Sync-Versuch starten
wenn Sonder-Sync-Taster gedrückt ist
day_array an Socket-Server senden
hour_array an Socket-Server senden
delay(100)
In der Sende-Bedingung kann das "hour(cur)==SyncZeit" durch "(hour(cur)==SyncZeit || done_sync_minute!=-1)" erweitert werden.
Wenn er damit aber in den nächsten Tag rutscht, würde zwar erstmal gesendet, danach jedoch der aktuelle Tag mit "done_day_g=day(cur)" geblockt werden. Also braucht es noch eine Variable done_sync_day, in der im Fehlerfall der beim nächsten erfolgreichen Sync zu blockende Tag vermerkt wird.
Auf der nächsten Seite geht es weiter.In die Bedingung zum "Messwert holen" sollte die Prüfung der Minute als "&& minute(cur)==cur_minute_g" aufgenommen werden.