
Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.
LED.cpp
- Committer:
- Schreeker
- Date:
- 2016-07-07
- Revision:
- 18:b26d88b7b370
- Parent:
- 17:0b9e7a05b203
- Child:
- 19:51747c0ab062
File content as of revision 18:b26d88b7b370:
/********************************************************************************** * File name: LED.cpp * Zweck: Beinhaltet alle Funktionen zur Einstellung der LED-Helligkeit in Abhängigkeit von den berechneten Winkeln. * Author: Simon Rutzen, Nils Kemmer * Changes: keine ***********************************************************************************/ /* Zu benutzende Pins */ // PWM1 - Channel 1N (PB_15), 2N (PB_14), 3N (PB_13) und 4 (PA_11) /* Include */ #include "mbed.h" #include "Sensor.h" /* Variabeln */ /* Erzeugen eines Hystereseverhaltens bei Überkopflage und Normallage aufgrund der Schwankungen bei den Werten des Accelometers */ #define UGrenzZUeberkopf 17602 // X oder Y > 80° #define UGrenzZNormal 18000 // X oder Y kleiner ungefähr 75° /*Konfiguriert die angegebenen Pins als pulsweitenmodulierte Ausgänge*/ PwmOut oLEDXN(PB_15); PwmOut oLEDXP(PB_14); PwmOut oLEDYN(PB_13); PwmOut oLEDYP(PA_11); /************************************************************************************ * void setLED(struct WinkelData stWinkelData) * Zweck: Steuerung der vier LED's auf Basis der berechneten Winkel in stWinkelData. 1. Auswerten der Z-Achse, ob Überkopflage oder nicht 2. Ansteurung der LED's auf Basis der berechneten Winkel in stWinkelData und Schritt 1. * Parameter: wWinkelX: aktueller Winkel bezogen auf die X-Achse des Beschleunigungssensores wWinkelY: aktueller Winkel bezogen auf die Y-Achse des Beschleunigungssensores wWinkelZ: aktueller Winkel bezogen auf die Y-Achse des Beschleunigungssensores * return Parameter: bStateLCD: LCD zeigt Winkel an (0) oder Textnachricht Überkopflage (1) *************************************************************************************/ byte setLED(int16 wWinkelX, int16 wWinkelY, int16 wWinkelZ){ /* Variabeln */ byte bStateLED = 0; // Zustand des Lagesensors ( 0: Normallage 1: Überkopflage) byte bStateLCD = 0; // Zustand der LCD-Anzeige ( 0: Winkelausgabe 1: Textnachricht Überkopflage) /* Auswertung der Z-Achsendaten */ if (wWinkelZ < UGrenzZUeberkopf){ // Überkopflage bStateLED = 1; bStateLCD = 1; } if (wWinkelZ > UGrenzZNormal){ // Normallage bStateLED = 0; bStateLCD = 0; } /* Einstellen der LED's */ switch(bStateLED){ case 0:{ // Normallage, einstellen der LED-Helligkeit abhängig vom Winkel if(wWinkelX <= 0){ oLEDXN = abs(wWinkelX/80.0); oLEDXP = 0; } else { oLEDXP = abs(wWinkelX/80.0); oLEDXN = 0; } if(wWinkelY <= 0){ oLEDYN = abs(wWinkelY/80.0); oLEDYP = 0; } else { oLEDYP = abs(wWinkelY/80.0); oLEDYN = 0; } break; } case 1:{ // Überkopflage, LED's blinken if(oLEDXN.read()> 0){ oLEDXN = 0; oLEDXP = 0; oLEDYN = 0; oLEDYP = 0; } else{ oLEDXN = 1; oLEDXP = 1; oLEDYN = 1; oLEDYP = 1; } break; } default: break; } /* Return */ return bStateLCD; } /************************************************************************************ * void void initLED() * Zweck: Blinken der LED's beim Anschalten des Boards. 4x Blinken im 250ms Abstand * Parameter: keine * return Parameter: keine *************************************************************************************/ void initLED(){ /* Variabeln */ int i = 0; /* Setzen der PWM-Periode auf 20ms */ oLEDXN.period_ms(20); oLEDXP.period_ms(20); oLEDYN.period_ms(20); oLEDYP.period_ms(20); /* 4x Blinken der LED's mit 250ms Pause dazwischen*/ while(i<8){ /* Toggeln der LED's */ oLEDXN = ((int)oLEDXN.read()+1) % 2; oLEDXP = ((int)oLEDXP.read()+1) % 2; oLEDYN = ((int)oLEDYN.read()+1) % 2; oLEDYP = ((int)oLEDYP.read()+1) % 2; /* Warten */ wait_ms(250); /* Zählvariabel erhöhen */ ++i; } }