BULME-TIMER_V2 funktionsdüchtig.

Dependencies:   DigitDisplay PCF8563 Led-libary dPrell mbed

main.cpp

Committer:
04M04
Date:
2016-06-23
Revision:
0:524e857fe466

File content as of revision 0:524e857fe466:

//______________________________________________________Bibliotheken
#include "mbed.h"
#include "WS2812B.h"
#include "PCF8563.h"
#include "DigitDisplay.h"
#include "dPrell.h"
//______________________________________________________Farbdefinitionen
//             G R B
//             | | |
#define rGb (0xff0000)  //Grün
#define Rgb (0x00ff00)  //Rot
#define rgB (0x0000ff)  //Blau
#define RgB (0x00ffff)  //Violet
#define rGB (0xff00ff)  //Türkis
#define RGb (0xffff00)  //Gelb
#define RGB (0xffffff)  //Weiß
#define rgb (0x000000)  //Aus
//halbe Helligkeit
#define hrGb (0x0f0000)  //Grün
#define hRgb (0x000f00)  //Rot
#define hrgB (0x00000f)  //Blau
#define hRgB (0x000f0f)  //Violet
#define hrGB (0x0f000f)  //Türkis
#define hRGb (0x0f0f00)  //Gelb
#define hRGB (0x0f0f0f)  //Weiß
//______________________________________________________Schnittstellen
Ticker TickerOutput;

PCF8563 rtc;

DigitalOut Led1(LED1);
DigitalOut Led2(LED2);
DigitalOut Led3(LED3);
DigitalOut Led4(LED4);

dPrell Taster1(p17);
dPrell Taster2(p18);
dPrell Taster3(p19);
dPrell Taster4(p20);
dPrell InternTaster1(P1_16);
dPrell InternTaster2(P0_23);
dPrell InternTaster3(P0_10);
dPrell InternTaster4(P0_15);

PwmOut Summer(p6);

LedOut RGBStripe(p25);
//                       (CLK, I/O)
DigitDisplay TimerDisplay(p21, p22);
//                     (CLK, I/O)
DigitDisplay UhrDisplay(p23, p24);

Serial pc(USBTX, USBRX);
//______________________________________________________Variablen

uint8_t hour, minute, sec;

int color = rgb;
int ColorTime = 0;
int Prozent = 10;
int TimerZeit = 0;
int TimerMinuten = 0;
int TimerSekunden = 0;
int UhrZeit = 0;
int VergleichsZeitEins = 0;
int VergleichsZeitZwei = 0;

bool SetMenu = 0;
bool StartStop = 0;
bool Berechnung = 0;
bool End = 0;
//______________________________________________________Funktionen

void Set();
void Plus();
void Minus();
void TimerStartStop();
void TasterTrig();

void TimerIn();
void TimerPlay();
void TimerOut();
void VergleichsZeit();
void ColorChangeTime();
void ColorProzentTime();
void StripeOut();
void UhrOut();
void SummerOut();
void Output();
void EndSignal();
//______________________________________________________Main
int main()
{
    TickerOutput.attach(&Output, 0.2);

    Taster1.rise(&Set);
    Taster2.rise(&Plus);
    Taster3.rise(&Minus);
    Taster4.rise(&TimerStartStop);
    InternTaster1.rise(&Set);
    InternTaster2.rise(&Plus);
    InternTaster3.rise(&Minus);
    InternTaster4.rise(&TimerStartStop);
    while(1) {
        if(SetMenu == 0 && (TimerMinuten > 0 || TimerSekunden > 0) && StartStop == 1) {
            VergleichsZeit();
            TimerPlay();
        } else if(SetMenu == 0 && StartStop == 1) {
            StartStop = 0;
        }
        if(End == 1) {
            EndSignal();
        }
    }
}
//______________________________________________________Interrupts

void Set()
{
    Led1 = !Led1;
    if (SetMenu == 0 && StartStop == 0) {
        SetMenu = 1;
    } else if (SetMenu == 1 && StartStop == 0) {
        SetMenu = 0;
    }
    End = 0;
    Summer.pulsewidth(0);
    Berechnung = 0;
    TasterTrig();
}
void Plus()
{
    Led2 = !Led2;
    if(SetMenu == 1) {
        TimerMinuten++;
        TimerSekunden = 0;
    }
    TasterTrig();

}
void Minus()
{
    Led3 = !Led3;
    if(SetMenu == 1 && minute>0) {
        TimerMinuten--;
        TimerSekunden = 0;
    }
    TasterTrig();

}
void TimerStartStop()
{
    Led4 = !Led4;
    if(SetMenu == 0 && (TimerMinuten > 0 || TimerSekunden > 0) && StartStop == 0) {
        StartStop = 1;
    } else if(SetMenu == 0 && StartStop ==1) {
        StartStop = 0;
    }
    Berechnung = 1;
    TasterTrig();
}
//______________________________________________________Funktionen

void TasterTrig()
{
    Taster1.trig();
    Taster2.trig();
    Taster3.trig();
    Taster4.trig();
    InternTaster1.trig();
    InternTaster2.trig();
    InternTaster3.trig();
    InternTaster4.trig();
}
//______________________________________________________Timer-Bereich

void TimerPlay()
{
    while(TimerMinuten > 0) {
        if(TimerSekunden == 0) {
            TimerMinuten--;
            TimerSekunden = 60;
        }
        while(TimerSekunden >0) {
            TimerSekunden--;
            wait(1);
            if(StartStop == 0) {
                return;
            }
        }
    }
    if(TimerMinuten < 1 && TimerSekunden < 1) {
        End = 1;
        StartStop = 0;
    }
    return;
}

void TimerOut()
{
    TimerZeit = (TimerMinuten * 100) + TimerSekunden;
    TimerDisplay.write(TimerZeit);
    TimerDisplay.setColon(1);
}
//______________________________________________________RGB-,Uhr-,Summer-Bereich
void VergleichsZeit()
{
    if (Berechnung == 1) {
        VergleichsZeitEins = TimerMinuten * 60;
        Berechnung = 0;
    }
}

void ColorChangeTime()
{
    VergleichsZeitZwei = (TimerMinuten * 60) + TimerSekunden;

    if (SetMenu == 0 && VergleichsZeitZwei <= VergleichsZeitEins * 0.2 && VergleichsZeitZwei > 0) {
        color = RGb;
    } else if (SetMenu == 0 && VergleichsZeitZwei == 0) {
        color = Rgb;
    } else if (SetMenu == 0 && VergleichsZeitZwei > VergleichsZeitEins * 0.2){
        color = rGb;
    } else if (SetMenu == 1){
        color = rgB;
    } else {
        color = rgb;
    }
}

void ColorProzentTime()
{

}

void StripeOut()
{
    __disable_irq();            //Interrupt deaktivieren

    for(int r=1; r<=Prozent; r++)
        RGBStripe.WriteLed(color);  //Farbe rausschreiben

    __enable_irq();             //Interrupt reaktivieren
}

void UhrOut()
{
    hour = rtc.read(HOURS);
    minute = rtc.read(MINUTES);
    sec = rtc.read(SECONDS);

    UhrDisplay.write(0, (hour >> 4) & 0x03); //Stunden  -0x03
    UhrDisplay.write(1, (hour & 0x0F));
    UhrDisplay.setColon(1);
    UhrDisplay.write(2, (minute >> 4)- 8);  //Minuten und Sekunden -8
    UhrDisplay.write(3, (minute & 0x0F));
}

void SummerOut()
{
    // specify period first, then everything else
    Summer.period(0.001f);  // 0.001 second period
    Summer.pulsewidth(0.0004); // 0.0004 second pulse (on)
    // led flashing
    wait(4);
    Summer.pulsewidth(0);
}

void Output()
{
    ColorChangeTime();
    TimerOut();
    UhrOut();
    StripeOut();
}

void EndSignal()
{
    __disable_irq();
    Prozent = 10;
    SummerOut();
    Berechnung = 0;
    End = 0;
    __enable_irq();
}