Pin-Ein­ga­be

Lese­zeit: 5 Minu­ten

Lösung
Seite als PDF

Auf einem Tas­ten­feld soll ein zufäl­lig erzeug­ter Pin ein­ge­ge­ben wer­den. Das Pro­gramm soll die­sen Pin abfra­gen. Wur­de der Pin nach Druck auf die Tas­te # rich­tig ein­ge­ge­ben, wird die Mel­dung „kor­rek­ter Pin“ angezeigt.

Download

Pin­ein­ga­be Seri­el­ler Monitor

Bei die­ser Auf­ga­be lernst du ver­schie­de­ne Mög­lich­kei­ten ken­nen einen String auszuwerten:

  • BeispielString.indexOf(Zeichen) → bestimmt die Posi­ti­on eines Zei­chens inner­halb des Strings
  • BeispielString.length() → ermit­telt die Län­ge eines Strings
  • BeispielString.substring(Start, Ende) → zeigt den Teil des Strings von Start bis Ende

Bei­spiel:

Der String "Pro­gram­mie­ren fin­de ich toll ;-)" soll auf sei­ne Län­ge und die Pos­ti­on des „t“ unter­sucht wer­den. Anschlie­ßend wird er in zwei Teil­strings zerlegt.

void setup()  
{
  Serial.begin(9600);  

  // auf serielle Verbindung warten
  while (!Serial) {;}
  delay(500);

  String BeispielString = "Programmieren finde ich toll ;-)"; 

  // Länge bestimmen 
  int Laenge = BeispielString.length();  
  Serial.print("Laenge des Strings: "); 
  Serial.println(Laenge); 

  // das t suchen 
  int Suche = BeispielString.indexOf("t");     
  Serial.print("Position t: "); 
  Serial.println(Suche); 
 
  // String vom Anfang bis zum t  
  BeispielString.substring(0, Suche); 
  Serial.print("String bis zum t: ");      
  Serial.println(BeispielString.substring(0, Suche));

  // oder, weil Laenge schon bestimmt wurde: 
  // BeispielString.substring(suche + 1, Laenge);    

  Serial.print("String vom t bis zum Ende: ");     
  Serial.println(BeispielString.substring(Suche, BeispielString.length())); 
} 

void loop()  
{ 
  // bleibt leer → das Programm soll nur einmal ausgeführt werden 
}

Strings ver­ar­bei­ten

Arrays

Benö­tig­te Bauteile:

  • Laut­spre­cher
  • Tas­ten­feld 3×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)

Du benö­tigst die Biblio­thek Adafruit Keypad:

Das Tas­ten­feld besteht aus Rei­hen und Spal­ten, die von unten nach oben in einem ➨zwei­di­men­sio­na­len Array ange­ord­net werden:

Bin­de die Biblio­thek ein und defi­nie­re die Variablen:

# include "Adafruit_Keypad.h"

int LAUTSPRECHER = 13;

// Größe des Tastenfeldes
// 3 Spalten
const byte SPALTEN = 3;

// 4 Zeilen
const byte REIHEN = 4;

// die Ziffern/Zeichen:
// Array 3 x 4
char Tasten[REIHEN][SPALTEN] = 
{
  { '#', '0', '*' },
  { '9', '8', '7' },
  { '6', '5', '4' },
  { '3', '2', '1' }
};

// die Pins für die 3 Spalten
byte SpaltenPins[SPALTEN] = { 3, 4, 5 };

// die Pins für die 4 Zeilen
byte ReihenPins[REIHEN] = { 6, 7, 8, 9 };

// TastenFeld → Name des Keypads
// -> Zuordnung der Pins zu den REIHEN und SPALTEN des Arrays
Adafruit_Keypad Tastenfeld = Adafruit_Keypad(makeKeymap(Tasten), ReihenPins, SpaltenPins, REIHEN, SPALTEN);

String Vergleich;
String Pin;

// char-Array für die eingegebenen Zeichen
char Zeichen[5];

int Position = 0;

Jetzt kann die eigent­li­che Pro­gram­mie­rung begin­nen.
Der set­up-Teil:

void setup()
{
  // Tastenfeld starten
  Tastenfeld.begin();

  pinMode(LAUTSPRECHER, OUTPUT);
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}
  delay(500);
  
  // nur beim Start anzeigen
  Serial.println("Bitte 4-stelligen Pin eingeben:");
  Serial.println("Pin-Eingabe mit # abschlie\u00dfen");
  Serial.println("Korrektur mit * ");

  // Zufallsgenerator starten
  randomSeed(analogRead(0));

  // neuen Pin erstellen
  neuerPin();
}

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  // gedrückte Taste lesen
  Tastenfeld.tick();

  while (Tastenfeld.available())
  {
    keypadEvent Taste = Tastenfeld.read();

    // wenn die Taste losgelassen wurde
    if (Taste.bit.EVENT == KEY_JUST_RELEASED)
    {
      tone(LAUTSPRECHER, 1000);
      delay(50);
      noTone(LAUTSPRECHER);

      // eingegebenes Zeichen an der aktuellen Position speichern
      Zeichen[Position] = (char)Taste.bit.KEY;

      // Zeichen anzeigen
      Serial.print(Zeichen[Position]);

      // nächstes Zeichen -> Position erhöhen
      Position ++;

      // Korrektur ASCII-Wert 42 = *
      if (Taste.bit.KEY == 42)
      {
        // char-Array Zeichen leeren
        for (int i = 0; i < sizeof(Zeichen); i ++)
        {
          Zeichen[i] = NULL;
        }

        Position = 0;
        Serial.println("\tKorrektur: ");

      }

      // Zeichen ASCII-Wert 35 = #
      if (Taste.bit.KEY == 35)
      {
        // char-Array in String umwandeln
        Vergleich = String(Zeichen);

        // letzte Zeichen des Strings sind 0 und # -> müssen entfernt werden
        Vergleich = Vergleich.substring(0, Vergleich.length() - 2);

        Serial.println();
        Serial.print(Vergleich);

        // Eingabe mit Pin vergleichen
        if (Vergleich == Pin)
        {
          Serial.println("\tPin ist korrekt - Zugriff");
        }
        else Serial.println("\tFalscher Pin - kein Zugriff");

        // Variable zurücksetzen
        Position = 0;

        // neuen Pin erstellen
        neuerPin();
      }
    }
  }
}

Jetzt fehlt noch die String-Funk­ti­on für die Erstel­lung eines neu­en Pins:

String neuerPin()
{
  // zufälligen PIN bestimmen
  Pin = "";
  Serial.println("---------------------------------------");
  
  for (int i = 0; i < sizeof(Zeichen) - 1; i ++)
  {
    int Zahl = random(0, 10);
    Pin = Pin + String(Zahl);
  }

  // Pin anzeigen
  Serial.println("neuer Pin: " + Pin);
  return Pin;
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 9. Okt 2023 @ 17:46