STM Schalter

Dependencies:   mbed C12832 LM75B

Stm_Schalter

https://os.mbed.com/users/mexx/code/info_181024_stm_schalter/

Aufgabe https://os.mbed.com/users/fpucher/code/HIM0Board/wiki/STM-Schalter

https://os.mbed.com/media/uploads/fpucher/stm0_3_error.jpg

iStateMaschine

#include "mbed.h"
#include "C12832.h"
#include "LM75B.h"

//      LCD
C12832 lcd(p5, p7, p6, p8, p11);    // Definition der Pins vom LCD
//      Temperatur
LM75B temp (p27, p28);
//      Led
DigitalOut Led1(LED1);   // 1. LED
DigitalOut Led2(LED2);   // 2. LED
DigitalOut Led3(LED3);   // 3. LED
DigitalOut Led4(LED4);   // 4. LED
//      Joystick
InterruptIn  Sw4(p13);      // LEFT
InterruptIn  Sw1(p14);      // CENTER
InterruptIn  Sw2(p15);      // UP
InterruptIn  Sw3(p12);      // DOWN
InterruptIn  Sw5(p16);      // RIGHT


//      Prototyping
void StateMachine();
//void ST_Error (void);
void ST_Ein (void);
void ST_Aus (void);
//void rise(void);
void Sw1Rise(void);
void Sw2Rise(void);
//bool CheckFlag() ;
bool CheckSw1(void);
bool CheckSw2(void);
void Time (void);
void TimeOut(void); 
void Flip (void);
void TempOut (void);
void TimeOutError(void);
void ErrorBlinken(void);
void TimeOver(void);


//bool pressed = false;
bool volatile Sw1Pressed;
bool volatile Sw2Pressed;

//***** VARIABLEN ******

enum State {ST_AUS=0, ST_EIN, ST_TimeOut, ST_TempOut, ST_Error};
//State state;
State volatile state;
Timer getTime; //Timer-Schnittstelle dient zum Erstellen, Starten, Stoppen und Lesen eines Timers 
Ticker TickFlip;//für blinken der LED     //wiederkehrenden Interrupt 
Timeout resetTime;//Die Timeout-Schnittstelle wird verwendet, um einen Interrupt 
                    //einzurichten, um eine Funktion nach einer bestimmten Verzögerung aufzurufen.

volatile int counter; // Volatile, damit es nicht auf unterschiedlichen Cores ausgeführt wird



int main()
{
    
    Sw1.rise(&Sw1Rise);      //.fall(&fall)
    Sw2.rise(&Sw2Rise);//warten auf drücken
    state = ST_AUS;
    Sw1Pressed = 0;
    Sw2Pressed = 0;
    Led1 = 0;
    Led2 = 0;
    Led3 = 0;
    Led4 = 0;
    counter=0;

    while(1)
    {
        
        StateMachine();
    }
}

void TimeOver(void)
{
        lcd.cls();      // löscht lcd (clear screen)
        lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
        lcd.printf("Die Zeit ist abgelaufen");
        printf("Die Zeit ist abgelaufen \n");
        while(1)
    {}
}

void ErrorBlinken(void) ///blineken bei allen fehlern
{
    Led4 = !Led4;
    }

void TimeOutError (void) {///unerwartter fehler
        state = ST_Error;
        TickFlip.attach(&ErrorBlinken, 0.3);
        lcd.cls();      // löscht lcd (clear screen)
        lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
        lcd.printf("State: ERROR TimeOut");
        printf("State: ERROR TimeOut \n");
        
        printf("State: %i \n",state);
        lcd.cls();              // löscht lcd (clear screen)
        lcd.locate(0,0);        // x-position, y-position (x: 0-128; y: 0-32)
        lcd.printf("State: %i", state);   //Ausgabe am Display
    }

void TempOut(void) {//temp ausgabe
        lcd.cls();      // löscht lcd (clear screen)
        lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
        lcd.printf("Temp Out");
        printf ("Temp Out \n");
        int counterTempOut = 0;
        while(1) {
            lcd.cls();      // löscht lcd (clear screen)
            lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
            lcd.printf("Temp Out");
            printf ("Temp Out %f \n", temp.read());
            counterTempOut++;
            wait(1);

            if(CheckSw2() == true) {
                state = ST_EIN;
                return;
            }
        }
    }

void TimeOut(void) {
        lcd.cls();      // löscht lcd (clear screen)
        lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
        lcd.printf("Time Out");
        printf ("TimeOut \n");
        int counter2 = 0;
        while(1) {
            lcd.cls();      // löscht lcd (clear screen)
            lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
            lcd.printf("TimeOut %i", counter2);
            printf ("TimeOut %i \n", counter2);
            counter2++;
            wait(1);
            if(CheckSw2() == true) {
                state = ST_TempOut;
                return;
            }
        }
    }

void Sw2Rise(void) {
        lcd.cls();      // löscht lcd (clear screen)
        lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
        lcd.printf("Sw2Rise");
        printf ("Sw2Rise \n");
        if(state == ST_EIN || state == ST_TimeOut || state == ST_TempOut)      
        Sw2Pressed = true;
        // je weleer status schalte weiter
        wait(0.2);
    }

bool CheckSw2(void) {//Werte true oder false 
        if(Sw2Pressed == true) {
            lcd.cls();      // löscht lcd (clear screen)
            lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
            lcd.printf("CheckSw2");
            printf ("CheckSw2 \n");
            Sw2Pressed = false;
            return true;
        }

        return false;
    }
 
void Time(void) {
        lcd.cls();      // löscht lcd (clear screen)
        lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
        lcd.printf("Time");
        printf ("Time \n");
        if(getTime.read() == 0) 
        {
            getTime.start(); //Timer Starten
        } 
        else {
            lcd.cls();      // löscht lcd (clear screen)
            lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
            lcd.printf("Sekunden: %f", getTime.read());
            printf("Sekunden: %f \n", getTime.read());
            getTime.reset();//Timer löschen
        }
    }      

bool CheckSw1(void) {  ////Werte true oder false 
        if(Sw1Pressed == true) {
            lcd.cls();      // löscht lcd (clear screen)
            lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
            lcd.printf("CheckSw1");
            printf ("CheckSw1 \n");
            Time();  //TIME UNTERPROGRAM
            Sw1Pressed = false;
            return true;
        }

        return false;
    }
    
void Sw1Rise(void) {
        lcd.cls();      // löscht lcd (clear screen)
        lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
        lcd.printf("Sw1Rise");
        printf ("Sw1Rise \n");
        if(state == ST_EIN || state == ST_AUS) {
            // wenn Taste getrückt wird wechsel je welcher status
            Sw1Pressed = true;// Umschalten auf WAHR, es wurde gedrückt
            wait_ms(200);
        }// Entprellung der Taste, bei mir 100ms da der Taster furchtbar prellt...
    } 
 
void Ein (void)
{
    //Status auf LCD und Serial
    lcd.cls();      // löscht lcd (clear screen)
    lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
    lcd.printf("State: 2 (Ein)");
    printf("State: 2 (Ein)");

//  entry

    // aufruf um die Led blinken zu lassen
    TickFlip.attach(&Flip, 0.5);// the address of the function to be attached (Flip) and the interval (2 seconds)
    resetTime.attach(&TimeOutError, 10);//time out starten
    Led1 = true; //led ein

    while(1) {

        if(state == ST_Error) {
            lcd.cls();      // löscht lcd (clear screen)
            lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
            lcd.printf("State: 2 (Ein)verlassen");
            printf("State: 2 (Ein) verlassen");
            Led1 = false;
//          exit
            return;
        }

        
        if(CheckSw2() == true) {
            state = ST_TimeOut;  // state timeOut
            resetTime.detach(); // timeout rücksetzen
//          exit
            return;
        }
        if(CheckSw1() == true) {
            state = ST_AUS;// state aus
            Led1 = false;
            resetTime.detach();// timeout rücksetzen
//          exit
            return;
        }
    }
}

void Flip (void)  //MIT TICKER 2X blinken
{
    lcd.cls();      // löscht lcd (clear screen)
    lcd.locate(0,0);   // x-position, y-position (x: 0-128; y: 0-32)
    lcd.printf("Flip");
    printf ("Flip \n");
    
    Led4 = !Led4;// umschalten der LED
    
    if (counter == 3) {
        TickFlip.detach();//ticker stopp
        counter = 0;
    } 
    else 
        counter++;// Variable die hochgezählt wird um die LED 2 mal blinken zu lassen
    }

void Aus (void)//10s timerout starten
{
    resetTime.attach(&TimeOutError, 10);
    lcd.cls();              // löscht lcd (clear screen)
    lcd.locate(0,0);        // x-position, y-position (x: 0-128; y: 0-32)
    lcd.printf("State: 1 (Aus)");   //Ausgabe am Display
    printf("State: 1 (Aus)\n");       // Ausgabe auf der seriellen Console

    while(true) {
        if(state == ST_Error) {
            printf("ERROR State AUS verlassen /n");
            lcd.cls();              // löscht lcd (clear screen)
            lcd.locate(0,0);        // x-position, y-position (x: 0-128; y: 0-32)
            lcd.printf("ERROR State AUS verlassen");   //Ausgabe am Display
            return;
        }

        if(CheckSw1() == true) {  //wenn sw1 gedrückt
            state = ST_EIN;
            resetTime.detach(); // timerout wieder stoppen
            return;
        }

    }
}               
void StateMachine()  //mit den ganzen möglichen Statuse
{
    switch (state) 
    {
        case ST_AUS:          Aus()      ;break;
        case ST_EIN:          Ein()      ;break;
        case ST_TimeOut:      TimeOut()     ;break;
        case ST_TempOut:      TempOut()     ;break;
        case ST_Error:        TimeOver()    ;break;
        default: printf("ERROR")            ; 
                 lcd.cls()                  ;               // löscht lcd (clear screen)
                 lcd.locate(0,0)            ;               // x-position, y-position (x: 0-128; y: 0-32)
                 lcd.printf("ERROR")        ;break;         //Ausgabe am Display                     
    }
}



Committer:
mexx
Date:
Thu Nov 08 16:54:08 2018 +0000
Revision:
0:d68d7d2fd930
Child:
1:765c9174d9a6
State 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mexx 0:d68d7d2fd930 1 #include "mbed.h"
mexx 0:d68d7d2fd930 2 #include "C12832.h"
mexx 0:d68d7d2fd930 3
mexx 0:d68d7d2fd930 4 DigitalOut Led1(LED1, 0);
mexx 0:d68d7d2fd930 5 DigitalOut Led2(LED2, 0);
mexx 0:d68d7d2fd930 6 DigitalOut Led3(LED3, 0);
mexx 0:d68d7d2fd930 7 DigitalOut Led4(LED4, 0);
mexx 0:d68d7d2fd930 8 InterruptIn SW1(p14);
mexx 0:d68d7d2fd930 9 InterruptIn SW2(p15);
mexx 0:d68d7d2fd930 10 InterruptIn SW3(p12);
mexx 0:d68d7d2fd930 11 InterruptIn SW4(p16);
mexx 0:d68d7d2fd930 12
mexx 0:d68d7d2fd930 13 //***** LCD *******
mexx 0:d68d7d2fd930 14
mexx 0:d68d7d2fd930 15 C12832 lcd(p5, p7, p6, p8, p11);
mexx 0:d68d7d2fd930 16
mexx 0:d68d7d2fd930 17 //***** VARIABLEN ******
mexx 0:d68d7d2fd930 18
mexx 0:d68d7d2fd930 19 enum State {ST_AUS=0, ST_EIN};
mexx 0:d68d7d2fd930 20 State state;
mexx 0:d68d7d2fd930 21
mexx 0:d68d7d2fd930 22 bool pressed = false;
mexx 0:d68d7d2fd930 23
mexx 0:d68d7d2fd930 24
mexx 0:d68d7d2fd930 25 //***** EREIGNISSE ******
mexx 0:d68d7d2fd930 26
mexx 0:d68d7d2fd930 27 void rise(void)
mexx 0:d68d7d2fd930 28 {
mexx 0:d68d7d2fd930 29 wait_ms(50);
mexx 0:d68d7d2fd930 30 pressed = true;
mexx 0:d68d7d2fd930 31 }
mexx 0:d68d7d2fd930 32
mexx 0:d68d7d2fd930 33 bool CheckFlag()
mexx 0:d68d7d2fd930 34 {
mexx 0:d68d7d2fd930 35 if (pressed) {
mexx 0:d68d7d2fd930 36 pressed=false;
mexx 0:d68d7d2fd930 37 return true;
mexx 0:d68d7d2fd930 38 }
mexx 0:d68d7d2fd930 39 return false;
mexx 0:d68d7d2fd930 40 }
mexx 0:d68d7d2fd930 41
mexx 0:d68d7d2fd930 42 //***** STATES ******
mexx 0:d68d7d2fd930 43
mexx 0:d68d7d2fd930 44 void ST_Aus (void)
mexx 0:d68d7d2fd930 45 {
mexx 0:d68d7d2fd930 46 //Status auf LCD
mexx 0:d68d7d2fd930 47 lcd.cls(); // löscht lcd (clear screen)
mexx 0:d68d7d2fd930 48 lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32)
mexx 0:d68d7d2fd930 49 lcd.printf("State: 1 (Aus)");
mexx 0:d68d7d2fd930 50 // entry
mexx 0:d68d7d2fd930 51
mexx 0:d68d7d2fd930 52 // do
mexx 0:d68d7d2fd930 53 while(true) {
mexx 0:d68d7d2fd930 54 Led1 = 0;
mexx 0:d68d7d2fd930 55
mexx 0:d68d7d2fd930 56 if(CheckFlag()) {
mexx 0:d68d7d2fd930 57 state = ST_EIN;
mexx 0:d68d7d2fd930 58
mexx 0:d68d7d2fd930 59 // exit
mexx 0:d68d7d2fd930 60 return;
mexx 0:d68d7d2fd930 61 }
mexx 0:d68d7d2fd930 62 }
mexx 0:d68d7d2fd930 63 }
mexx 0:d68d7d2fd930 64
mexx 0:d68d7d2fd930 65 void ST_Ein (void)
mexx 0:d68d7d2fd930 66 {
mexx 0:d68d7d2fd930 67 //Status auf LCD
mexx 0:d68d7d2fd930 68 lcd.cls(); // löscht lcd (clear screen)
mexx 0:d68d7d2fd930 69 lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32)
mexx 0:d68d7d2fd930 70 lcd.printf("State: 2 (Ein)");
mexx 0:d68d7d2fd930 71
mexx 0:d68d7d2fd930 72 // entry
mexx 0:d68d7d2fd930 73 Led4 = 1;
mexx 0:d68d7d2fd930 74 wait_ms(200);
mexx 0:d68d7d2fd930 75 Led4 = 0;
mexx 0:d68d7d2fd930 76 wait_ms(200);
mexx 0:d68d7d2fd930 77 Led4 = 1;
mexx 0:d68d7d2fd930 78 wait_ms(200);
mexx 0:d68d7d2fd930 79 Led4 = 0;
mexx 0:d68d7d2fd930 80 wait_ms(200);
mexx 0:d68d7d2fd930 81 // do
mexx 0:d68d7d2fd930 82 while(true) {
mexx 0:d68d7d2fd930 83 Led1 = 1;
mexx 0:d68d7d2fd930 84
mexx 0:d68d7d2fd930 85 if(CheckFlag()) {
mexx 0:d68d7d2fd930 86 state = ST_AUS;
mexx 0:d68d7d2fd930 87
mexx 0:d68d7d2fd930 88 // exit
mexx 0:d68d7d2fd930 89 return;
mexx 0:d68d7d2fd930 90 }
mexx 0:d68d7d2fd930 91 }
mexx 0:d68d7d2fd930 92
mexx 0:d68d7d2fd930 93 }
mexx 0:d68d7d2fd930 94
mexx 0:d68d7d2fd930 95 void ST_Error (void)
mexx 0:d68d7d2fd930 96 {
mexx 0:d68d7d2fd930 97 //Status auf LCD
mexx 0:d68d7d2fd930 98 lcd.cls(); // löscht lcd (clear screen)
mexx 0:d68d7d2fd930 99 lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32)
mexx 0:d68d7d2fd930 100 lcd.printf("State: ERROR");
mexx 0:d68d7d2fd930 101 return;
mexx 0:d68d7d2fd930 102 }
mexx 0:d68d7d2fd930 103
mexx 0:d68d7d2fd930 104 void stateMachine()
mexx 0:d68d7d2fd930 105 {
mexx 0:d68d7d2fd930 106 switch (state)
mexx 0:d68d7d2fd930 107 {
mexx 0:d68d7d2fd930 108 case ST_AUS: ST_Aus();
mexx 0:d68d7d2fd930 109 break;
mexx 0:d68d7d2fd930 110 case ST_EIN: ST_Ein();
mexx 0:d68d7d2fd930 111 break;
mexx 0:d68d7d2fd930 112 default: ST_Error(); // sollte nicht auftreten :-)
mexx 0:d68d7d2fd930 113 break;
mexx 0:d68d7d2fd930 114 }
mexx 0:d68d7d2fd930 115 }
mexx 0:d68d7d2fd930 116
mexx 0:d68d7d2fd930 117
mexx 0:d68d7d2fd930 118
mexx 0:d68d7d2fd930 119 int main()
mexx 0:d68d7d2fd930 120 {
mexx 0:d68d7d2fd930 121 SW1.rise(&rise); //.fall(&fall);
mexx 0:d68d7d2fd930 122 state = ST_AUS;
mexx 0:d68d7d2fd930 123 while(true){
mexx 0:d68d7d2fd930 124 stateMachine();
mexx 0:d68d7d2fd930 125 }
mexx 0:d68d7d2fd930 126
mexx 0:d68d7d2fd930 127
mexx 0:d68d7d2fd930 128 }