Länder-Info

Lese­zeit: 6 Minu­ten

Länder-Info Anzei­ge im Seri­el­len Monitor

Navi­ga­ti­on

Das Pro­gramm soll nach einem Druck auf eine der Tas­ten des Tas­ten­felds Infor­ma­tio­nen zu ver­schie­de­nen Län­dern im Seri­el­len Moni­tor oder auf einem LCD anzeigen.

LCD

Seri­el­ler Monitor


So soll es aussehen:

Seri­el­ler Monitor 
LCD

Bei Pro­gram­men, die einen Tas­ter ver­wen­den, taucht immer das Pro­blem auf, dass ein län­ge­rer Druck auf den Tas­ter die gewünsch­te Akti­on mehr­fach aus­führt. Selbst ein kur­zes delay() kann das Pro­blem nicht lösen, son­dern höchs­tens abmil­dern. Die­ses Phä­no­men wird „Prel­len“ genannt. 

Das klei­ne Bei­spiel­pro­gramm ver­deut­licht das Problem:

void setup()
{
  pinMode(5, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop()
{
  int TasterStatus = digitalRead(5);
  if (TasterStatus == LOW) 
  {
    delay(200);
    Serial.println("Taster gedrueckt!");
  }
}

Ein län­ge­rer Druck auf den Tas­ter pro­du­ziert die mehr­fa­che Aus­ga­be des Textes.

Die Biblio­thek Bounce2 löst genau die­ses Problem:

Sketch → Biblio­thek ein­bin­den → Biblio­the­ken verwalten

Wei­te­re benö­tig­te Bibliothek:

Benö­tig­te Bauteile:

  • LCD 1602
  • Tas­ten­feld 1×4
  • Lei­tungs­dräh­te

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Mit einem klei­nem Pro­gramm kannst du tes­ten, ob das Tas­ten­feld rich­tig ange­schlos­sen ist.
Die gedrück­te Tas­te wird im ➨Seri­el­len Moni­tor angezeigt. 

/*
  Anschlüsse am Tastenfeld von links nach rechts
  GND D4 D5 D6 D7
*/
int TASTER_EINS = 5;  // Taste 1 
int TASTER_ZWEI = 4;  // Taste 2 
int TASTER_DREI = 7;  // Taste 3 
int TASTER_VIER = 6;  // Taste 4 

void setup() 
{ 
  Serial.begin(9600);   
 
  // Vorwiderstand aktivieren 
  pinMode(TASTER_EINS, INPUT_PULLUP); 
  pinMode(TASTER_ZWEI, INPUT_PULLUP); 
  pinMode(TASTER_DREI, INPUT_PULLUP); 
  pinMode(TASTER_VIER, INPUT_PULLUP); 
} 

void loop() 
{ 
  if (digitalRead(TASTER_EINS) == LOW) 
  {   
    delay(100); 
    Serial.println("Taste 1 an Pin " + String(TASTER_EINS));        
  } 
  if (digitalRead(TASTER_ZWEI) == LOW)          
  {  
    delay(100);   
    Serial.println("Taste 2 an Pin " + String(TASTER_ZWEI));     
  } 
  if (digitalRead(TASTER_DREI) == LOW)  
  {  
    delay(100); 
    Serial.println("Taste 3 an Pin " + String(TASTER_DREI));    
  } 
  if (digitalRead(TASTER_VIER) == LOW)   
  {  
    delay(100);  
    Serial.println("Taste 4 an Pin " + String(TASTER_VIER));    
  } 
}

Bin­de die benö­ti­gen Biblio­the­ken ein, defi­nie­re die ➨struct, die Tas­ter und die Zuord­nung der Tas­ten zur Biblio­thek Bounce2.

# include <Bounce2.h>
# include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

// Vorlage
struct Laenderdaten
{
  String Name;
  float Einwohner;
  long Groesse;
  String Hauptstadt;
};

Laenderdaten Deutschland =
{
  "Deutschland",
  83.01,
  357578,
  "Berlin"
};

Laenderdaten Frankreich =
{
  "Frankreich",
  66.99,
  543965,
  "Paris"
};

Laenderdaten Belgien =
{
  "Belgien",
  11.37,
  30688,
  "Br\365ssel"
};

Laenderdaten Niederlande =
{
  "Niederlande",
  17.29,
  41543,
  "Amsterdam"
};

/*
  Anschlüsse von links nach rechts
  GND D4 D5 D7 D6
*/
int TASTER1 = 5;  // Taste 1
int TASTER2 = 4;  // Taste 2
int TASTER3 = 7;  // Taste 3
int TASTER4 = 6;  // Taste 4

// Bibliothek Bounce2
// "Prellverhinderer" für die Tasten starten
Bounce Land1 = Bounce();
Bounce Land2 = Bounce();
Bounce Land3 = Bounce();
Bounce Land4 = Bounce();

Im setup-Teil wer­den die Instan­zen der Tas­ter zuge­ord­net, das LCD-Display gestar­tet und der Vor­wi­der­stand der Tas­ter aktiviert.

void setup()
{
  // Instanzen des Objekts Bounce für jede Taste zuordnen
  // Zeitintervall einstellen
  Land1.attach(TASTER1);
  Land1.interval(20);
  Land2.attach(TASTER2);
  Land2.interval(20);
  Land3.attach(TASTER3);
  Land3.interval(20);
  Land4.attach(TASTER4);
  Land4.interval(20);

  // Vorwiderstand aktivieren
  pinMode(TASTER1, INPUT_PULLUP);
  pinMode(TASTER2, INPUT_PULLUP);
  pinMode(TASTER3, INPUT_PULLUP);
  pinMode(TASTER4, INPUT_PULLUP);

  // LCD starten
  lcd.init();
  lcd.backlight();

  // Info über den Programmablauf
  lcd.setCursor(0, 0);
  lcd.print("1 = Deutschland");
  lcd.setCursor(0, 1);
  lcd.print("2 = Frankreich");
  lcd.setCursor(0, 2);
  lcd.print("3 = Belgien");
  lcd.setCursor(0, 3);
  lcd.print("4 = Niederlande");
}

Ergän­ze den loop-Teil:

void loop()
{
  // Taste 1 gedrückt
  if (Land1.update())
  {
    if (Land1.read() == LOW)
    {
      ZeigeDaten(Deutschland);
    }
  }
  // Taste 2 gedrückt
  if (Land2.update())
  {
    if (Land2.read() == LOW)
    {
      ZeigeDaten(Frankreich);
    }
  }
  
  // Taste 3 gedrückt
  . . .
  . . .

  // Taste 4 gedrückt
  . . .
  . . .
}

Der Metho­de Zei­ge­Da­ten wird die Struk­tur Laen­der­da­ten über­ge­ben, die Varia­ble Land ent­hält das Ele­ment, das im Auf­ruf der Metho­de Zei­ge­Da­ten über­ge­ben wurde.

void ZeigeDaten(struct Laenderdaten Land)
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(Land.Name);

  // bei der Einwohnerzahl . durch , ersetzen
  String Einwohner =  String(Land.Einwohner);
  Einwohner.replace(".", ",");
  lcd.setCursor(0, 1);

  lcd.print(Einwohner + " Millionen");
  lcd.setCursor(0, 2);

  lcd.print("Fl\341che " + String(Land.Groesse) + " qkm");
  lcd.setCursor(0, 3);

  lcd.print("Hauptstadt " );
  lcd.print(Land.Hauptstadt);
  lcd.setCursor(0, 0);
}

Letzte Aktualisierung: 22. Nov 2020 @ 14:15



Ver­wand­te Aufgaben:


Letzte Aktualisierung: 22. Nov 2020 @ 14:15