Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed C12832 LM75B
Homepage
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
}
}