Software-Entwicklung für Android und ios Teil 5: Sensoren
Typen von Sensoren Zweck Beispiele Hardware-Sensoren Ermitteln tatsächliche Werte Accelerometer, Magnetometer, Gyroskop, Barometer, Näherungssensor, Lichtsensor, Thermometer Virtuelle Sensoren Kombinieren verschiedene Sensordaten Erdanziehung, Lineare Beschleunigung, Rotationsvektor, Lage 2
Magnetometer Misst: Magnetfeld der Erde Einheit: mikrotesla Einsatzmöglichkeiten: Kompass (magnetischer Nordpol) Kombination mit GPS (geographischer Nordpol) 3
Accelerometer Misst: Achsiale Beschleunigung des Gerätes Einheit: ms/^2 (inkl. G) Einsatzmöglichkeiten: Bewegung des Gerätes erkennen http://www.engineerguy.com/elements/videos/video-accelerometer.htm 4
Gyroskop Misst: Radiale Beschleunigung des Gerätes Einheit: rad/s Einsatzmöglichkeiten: Rotation des Gerätes erkennen Gut mit anderen Sensoren kombinierbar z.b. Accelerometer zur Lagebestimmung 5
Lichtsensor Misst: Lichtstärke Einheit: Lux Einsatzmöglichkeiten: Adaptive Bildschirmhelligkeit -> Senkung des Stromverbrauchs 6
Näherungssensor Misst: Entfernung des Gerätes zu Objekten Einheit: cm/inch oder binär Einsatzmöglichkeiten: Deaktivierung der Touchfunktion, wenn Gerät am Ohr Diverse Varianten (optisch, infrarot, ultraschall), meist in Kombination mit Lichtsensor 7
GPS Global Positioning System Ermittelt Position des Gerätes auf der Erde in Längengrad und Breitengrad Arbeitet mit einem Netzwerk aus Satelliten Wird in Smartphones häufig in Kombination mit anderen Geräten verwendet Magnetometer (Kompass) Barometer (Höhe) GSM (grobe Ortung) WiFi (genauere Ortung) 8
Sensoren unter Android Viele Geräte haben viele unterschiedliche Sensoren (siehe vorherige Folien) Verwaltung übernimmt der sog. SensorManager Auslesen der Sensoren via private void listsensors() { List<Sensor> devicesensors = sensormanager.getsensorlist(sensor.type_all); for (Sensor sensor : devicesensors) { Log.d("MySensor", sensor.tostring()); Sensoren referenzieren Sensor gyroscope = sensormanager.getdefaultsensor(sensor.type_gyroscope); 9
Auslesen von Sensordaten @Override protected void onresume() { super.onresume(); sensormanager.registerlistener(this, gyroscope, SensorManager.SENSOR_DELAY_NORMAL); @Override protected void onpause() { super.onpause(); sensormanager.unregisterlistener(this); Start des Listeners @Override public void onsensorchanged(sensorevent event) { Log.d("MySensors", event.values[0] + ""); //data in event depends on sensor type, see SensorEvent Stop des Listeners Auslesen der Daten 10
Links Weiterführende Informationen http://developer.android.com/guide/topics/sensors/sensors_overview.html http://developer.android.com/reference/android/hardware/sensorevent.html 11
GPS unter Android LocationManager locationmanager = (LocationManager) this.getsystemservice(context.location_service); LocationListener locationlistener = new LocationListener() { public void onlocationchanged(location location) { // do something with the position public void onstatuschanged(string provider, int status, Bundle extras) { public void onproviderenabled(string provider) { public void onproviderdisabled(string provider) { ; locationmanager.requestlocationupdates(locationmanager.network_provider, 0, 0, locationlistener); ACHTUNG: Dafür werden sog. Permission benötigt ( android.permission.access_fine_location / android.permission.access_coarse_location). Schauen Sie sich hierzu das AndroidManifest.xml in Eclipse an. 12
iphone Bewegungsensoren Klasse CMMotionManager (Teil des CoreMotion-Frameworks) Auslesen der Inhalte auf 2 Arten möglich Periodisch via Polling -> Starten eines Timers, der regelmäßig die Werte ausliest + Sehr einfach - Blockiert CPU / UI [NSTimer scheduledtimerwithtimeinterval:0.1 target:self selector:@selector(methodenname) userinfo:nil repeats:yes]; Mit Queues und Blockaufrufen + Asynchron - Für Anfänger zunächst unüberschaubar 13
iphone Näherungssensor Arbeitet mit sog. Notifications Siehe http://iosdevelopertips.com/device/using-the-proximity-sensor.html für Beispiel 14
iphone GPS Arbeitet mit sog. Delegate-Pattern Grob: Definition eines Interfaces (protocol), das über Events informiert Definition des protocol kann in der API nachgeschlagen werden - CLLocationManagerDelegate Nutzt Klasse CLLocationManager (Teil des CoreLocation-Frameworks) LocationManger kann Heading (Magnetometer) und GPS-Koordinaten zurückgeben 15
CLLocationManager @interface ViewController () @property (nonatomic, strong) CLLocationManager *locationmanager; @end @implementation ViewController - (void)viewdidload { [super viewdidload];! self.locationmanager = [[CLLocationManager alloc] init]; self.locationmanager.delegate = self; [self.locationmanager startupdatinglocation]; // position [self.locationmanager startupdatingheading]; // heading // Implement some methods of the CCLocationManagerDelegate protocol - (void)locationmanager:(cllocationmanager *)manager didupdatelocations:(nsarray *)locations { CLLocation *currentlocation = [locations objectatindex:0]; NSLog(@"Long: %f, Lat: %f", currentlocation.coordinate.longitude, currentlocation.coordinate.latitude); - (void)locationmanager:(cllocationmanager *)manager didupdateheading:(clheading *)newheading { NSLog(@"Current heading: %f", newheading.trueheading); @end 16
Und nun die Übungsaufgabe... 17