Dieses Beispiel zeigt den Aufbau und die Funktion einer einfachen Status-Maschine. Diese kann in einfache Steuerungen usw. verwendet werden.
Verwendete Hardware:
Als Grundlage dient das Beispiel LCD4Bit_modExample für das LCDKeypadShield.
Funktionsweise:
Nach dem Programmstart und der Initialisierung werden in der Hauptschleife ( loop() ) zyklisch die Tasten des LCDKeypadShields abgefragt. Sobald eine Taste gedrückt wurde wird die Tastennummer in die Statusvariable übernommen.
Im zweiten Bereich des Hauptschleife wird entsprechen des Status der Statusmaschine die jeweilige Aktion ausgeführt. Ein Tastendruck leitet dann den Wechsel des Status ein. Von jedem Status kann je nach Tastendruck beliebig zu einen anderen Status gewechselt werden.
In diesem Demonstrationsprogramm wird der aktuelle Status auf dem LCD-Display angezeigt. Zusätzlich werden in den einzelnen Statis jeweils ein kleiner Text ( z.B. "abc" ) auf dem Display ausgegeben. An diesen Stellen müssen dann in den konkreten Anwendungen die jeweiligen Aktionen zur Steuerung usw. ausgeführt werden.
Rahmenbedingungen:
Um die Reaktionszeit auf einen Tastendruck nicht zu lange werden zu lassen dürfen die Ausführungszeiten der Programmteile in dem Ausführungsbereich ( "switch" ) nicht zu gross werden.
Falls dies der Fall wird muss man die Statusmaschine auf eine interuptgestüzte Steuerung umstellen.
Der Wechsel zwischen den Statis kann anstatt der Tastendrücke auch durch andere Ereignisse bzw. Bedingungen eingeleitet werden.
So ist z.B. denkbar dies durch die Abfrage eines Temperatursensors mit Schwellwerten durchzuführen. Damit würde dann die Statusmaschine abhängig von der gemessenen Temperatur in den jeweiligen Status wechseln.
Anwendungsbeispiele:
Sketch:
/********************************************************************************* * Demonstrationsbeispiel für eine einfache Statusmaschine * * 28.08.2012 Jürgen Mayer, DL8MA * * http://www.dl8ma.de/Arduino/ * * LCD-KeypadShield mit modifizierter 4-Bit-LCD-Library * */ #include <LCD4Bit_mod.h> LCD4Bit_mod lcd = LCD4Bit_mod(2); int adc_key_val[5] ={30, 150, 360, 535, 760 }; // Analogwerte für die Tastenzuordnung int NUM_KEYS = 5; // Anzahl der Tasten int adc_key_in; // Analogwert int key=-1; // Tastennummer int oldkey=-1; // zuletzt gedrückte Taste char buffer[20] = ""; // Buffer für Zahlenkonvertierung int status = -1; // Statusvariable void setup() { lcd.init(); lcd.clear(); lcd.printIn("Status-Maschine"); lcd.cursorTo(2, 0); lcd.printIn("Status:" ); } void loop() { // Statussteuerung über die Tasten: adc_key_in = analogRead(0); // Analogwert der Tasten einlesen key = get_key(adc_key_in); // Konvertierung des Analogwertes in die Tastennummer if (key != oldkey) // wenn Tastendruck erkannt ( durch Änderung der Tastennummer ) { if (key >=0) // wenn eine gültige Taste erkannt wird => Status setzen { status = key; oldkey = key; } } if( status >= 0 ) { lcd.cursorTo(2, 8); // Anzeige des aktuellen Status lcd.printIn( itoa( status, buffer, 10 ) ); } // Ausführung von Aktionen entsprechend des jeweiligen Status switch ( status ) { // Aktionen entsprechend dem jeweiligen Status case 0: lcd.cursorTo(2, 12); lcd.printIn( "abc" ); break; case 1: lcd.cursorTo(2, 12); lcd.printIn( "def" ); break; case 2: lcd.cursorTo(2, 12); lcd.printIn( "ghi" ); break; case 3: lcd.cursorTo(2, 12); lcd.printIn( "jkl" ); break; case 4: lcd.cursorTo(2, 12); lcd.printIn( "mno" ); break; } } /********************************************************************************* * Konvertierung des Analogwertes der Tasten in die jeweilige Tastennummer * */ int get_key(unsigned int input) { int k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS) // Taste erkannt? k = -1; return k; } |
Das Grundprinzip der Statusmaschine kann auch auf andere Atmel - Plattformen übertragen werden. Eine Realisierung in Assembler ist auch möglich.
...
28.08.2012
Dipl.-Ing. (FH) Jürgen Mayer, DL8MA - Weinstadt-Grossheppach
Impressum