Sensorik

Zwei Klassen: SensorServer, Sensor & deren Ableitungen

Klasse Sensor

Die abstrakte Klasse Sensor definiert die Schnittstelle für konkrete, von Sensor abgeleitete Klassen. Diese müssen dann nur noch die Methode handle() implementieren, von der der physische Sensor ausgelesen wird.

Die Klasse liefert liefert den letzten gelesenen Messwert und verwaltet eine Messwert-Historie von 24 Stunden (definiert durch historyDepth in "GlobalConstants.h").

 

Klasse MeasurementServer

Die Klasse MeasurementServer stellt ein Interface dar, von dem alle relevanten Daten für eine Messgröße abgerufen werden können. Diese Klasse besitzt die virtuelle Methode handle()), die regelmäßig aufgerufen werden muss und die Datenerhebung übernimmt.

Die Klasse hat die im Folgenden aufgeführten Member. Alle Member haben eine entsprechende const Deklaration, die es dem Compiler erlaubt, die Wertabrufe zu optimieren.

Aktuell ist die Speicherung der stündlichen Werte für die letzten 24 Stunden vorgesehen.

Entwicklungsstand: Aktuell ist die Klasse so konstruiert, dass die Grafiken für die Web-Site einigermaßen einfach gefüllt werden können. Die Zeit-Komponenten sind noch nicht optimal. Wahrscheinlich wird hier noch einmal eine Container-Klasse notwendig sein, die die Zeiten für alle Messreihen zeitlich synchronisiert und das Fehlen einer Zeitquelle berücksichtigt.

Member Funktion Anmerkung/Beispiel
String getName() Liefert die Bezeichnung der Messgröße. "Temperatur"
String getUnit() Liefert die Einheit der Messgröße "°C"
float get24hMin() Liefert den Minimalwert der letzten 24 Stunden.  
uint8_t minAt() Liefert den 0-basierten Index des Minimums. Wenn Minimalwert an mehreren Messpunkten vorliegt, wird der größte Index zurück geliefert.
float get24hMax() Liefert den Minimalwert der letzten 24 Stunden.  
uint8_t maxAt() Liefert den 0-basierten Index des Maximums. Wenn Maximalwert an mehreren Messpunkten vorliegt, wird der größte Index zurück geliefert.
float get24hMean() Liefert den Mittelwert der Daten der letzten 24 Stunden.  
float[] get24hValues() Liefert die stündlichen Messwerte der letzten 24 Stunden. Ist für eine Uhrzeit kein Messwert vorhanden, wird der vorhergehende Wert genommen. Gibt es keine vorhergehenden Werte, wird der nächst nachfolgende Wert genommen.
uint8_t[] getHours Liefert die Stundenangaben zu den Messwerten. Ist keine Zeitangabe möglich, weil z.B. keine Zeitquelle vorliegt, wird die Zahlenfolge -23, -22, .. -1, 0 zurück geliefert.
uint8_t hourAt (uint8_t index) Liefert die Stundenwert zum angegebenen Index. Ist keine Zeitangabe möglich, weil z.B. keine Zeitquelle vorliegt, wird der entsprechende Wert aus der Zahlenfolge -23, -22, .. -1, 0 zurück geliefert.
float getCurrentData() Liefert den aktuellen Messwert.  
float getCurrentTime() Liefert die Uhrzeit, zu dem der aktuelle Messwert erhoben wurde. Die Angabe erfolgt in Stunden. Minuten werden als dekadische Bruchteile zurück geliefert (5:30 => 5.50).
Liegt keine Systemzeit vor, wird ein Wert zwischen 0 und 1(exklusive) zurückgeliefert.
virtual void handle(float now) Erledigt die Messwerterhebung.
Now: aktuelle Uhrzeit.
Die Angabe erfolgt in Stunden. Minuten werden als dekadische Bruchteile zurück geliefert (5:30 => 5.50).
Die aktuelle Uhrzeit wird übergeben, damit die Messwerte beim aufeinanderfolgenden Aufruf dieser Methode bei unterschiedlichen Objekten die gleiche Uhrzeit übernommen wird.
Diese Methode sorgt ebenfalls für eine evtl. Mittelwertbildung und die Aufbereitung der 24h-Werte.
Ist keine Zeitquelle verfügbar, wird der Systemstart als Bezugszeitpunkt genommen. Übergeben wird dann die Anzahl Sekunden seit Systemstart als negativer Wert.

Strategie für die Messwertaufbereitung. Die in Frage kommenden Größen ändern sich relativ langsam. Eine Datenerhebung etwa jede Minute erscheint ausreichend. Aus den jeweils letzten zehn Messungen wird der Mittelwert gebildet. Dieser Mittelwert wird bei getCurrent() zurück geliefert.

Wenn bei der Uhrzeit die Stunde wechselt, wird der älteste Stundenwert verworfen und der aktuelle (Mittel-) Wert hinzugefügt.

Eine mögliche Ergänzung wäre die Bereitstellung von mehreren historischen Tageswerten. Dazu müsste dann zusätzlich ein Tagesrhythmus (00..00 Uhr) eingeführt werden.

Die Klassendefinition:

Fortsetzung folgt