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
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 } }
main.cpp@0:d68d7d2fd930, 2018-11-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |