Arduino -- Elektronik-Experimentierkasten -- Lectron Lehrsytem -- Jugendarbeit -- Elektronik -- Amateurfunk -- Notfunk -- Shop

Status-Maschine

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

zurück zu www.DL8MA.de