Komponente Bewegungssensor

Endspurt :-)

Als letzt Funktionalität wollen wir unsere kleine Alarmanlage in den Datenlogger einbauen. Dafür nutzen wir den Bewegungssensor und den Speaker. Der Bewegungssensor hat fortlaufend Bewegungsänderungen zu erfassen. Kleinere Schwankungen sind dabei zu ignorieren da der Sensor sehr empfindlich ist. Die Empfindlichkeit sollte in der Firmware einstellbar sein. Sobald das Board bewegt wurde muss ein kurzer Signalton erklingen und beim nächsten schreiben eines Datensatz in die CSV ist die Bewegung im vorgesehen Feld zu protokollieren. Dabei soll eine Null bedeuten, dass das Board seit der letzten Erfassung nicht bewegt wurde und eine Eins vermerkt eine Bewegung. Im Folgenden die bis hierher genutzten Bausteine des Systems:

Komponente entwerfen

Die geforderte Funktionalität kapseln wir in einer speziellen Klasse. Diese nennen wir Bewegungswaechter. Die Klasse Bewegungswaechter erbt alle Eigenschaften des Bewegungssensors damit im übrigen auch die Schnittstelleneigenschaften der Klasse AppModul. Damit können wir ausgewählte Ereignisse des Framework empfangen. Fir geben der Klasse folgende Operationen:

  • onTimer10ms, überschreibt das 10 Millisekunden Ereignis, hier soll die Bewegung detektiert werden
  • onTimer1s, überschreibt das 1 Sekunden Ereignis, hier kann der Speaker ausgeschaltet werden
  • isAlarm, zum Abfragen ob seit dem letzten Erfassen von Daten eine Bewegung erfolgte
  • alarmReset, zum Zurücksetzen des Alarmzustandes des Wächters

Ergänzen Sie das Klassenmodell entsprechend.

Komponente realisieren

Die eigentliche Erfassung von Bewegungsänderungen, das Signalisieren über den Speaker und das Vormerken von Alarmen bis zur Auswertung erfolgt ausschließlich in der Klasse Bewegungswaechter.

onTimer10ms
// alte Werte zum Vergleich merken, nach RST piepst es übrigens ;-)
static s32 oldValue=0;
s32 x,y,z,delta;
 
// Empfindlichkeit des Wächters einstellen
delta=200;
 
// erst mal nur eine Achse auswerten
this->getAcc(x,y,z);
 
if (abs(z-oldValue)>delta)
{
	// Alarm wird sich gemerkt bis ein Zurücksetzen erfolgte
	alarm=true;
	// kein Dauerton, nur kurzer 1s Pieps wenn bewegt wurde
	speaker.start();
}
 
oldValue=z;
onTimer1s
// kein Dauerton, nur kurzer 1s Pieps wenn bewegt wurde
speaker.stop();

Für die Auswertung erfasster Bewegungen sollen dann die beiden folgenden Operationen benutz werden.

isAlarm
// Alarm wird sich gemerkt bis ein Zurücksetzen erfolgt
return alarm;
alarmReset
// Alarm wird sich gemerkt bis ein Zurücksetzen erfolgt
alarm=false;

Ergänzen Sie die Operation onWork. Beachten Sie, dass die folgenden Zeilen vor dem Zusammensetzen des Datensatzes eingefügt werden müssen.

onWork
...
if (waechter.isAlarm())
	lage="1";
else
	lage="0";
 
waechter.alarmReset();
 
// Datensatz zusammenbauen
...

Komponente testen

Erstellen, Übersetzen und Übertragen Sie das Programm. Korrigieren Sie ggf. Schreibfehler im Quelltext. Achten sie darauf, dass eine µSD-Karte mit maximal 1 GB Kapazität und FAT16-Formatierung ordnungsgemäß in den SD-Kartenhalter eingelegt ist bevor das Programm startet. Lassen Sie die Anwendung einige Minuten laufen. Beobachten Sie die Protokollausgaben im SiSy-Controlcenter. Bei Bewegung des Boards muss ein Kurzer Signalton erklingen. Entnehmen sie die SD-Karte und überprüfen Sie den Inhalt der Datei log.csv.

Nächster Schritt