Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.

Dependencies:   TextLCD mbed

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;
        }
    }