Passwort einlesen und abgleichen

Hallo zusammen!

Ich brauche Hilfe bei meinem ersten großen Projekt.

Im Grunde genommen soll mein Arduino Uno nichts weiter machen als einen 7-stelligen Code einlesen, einen weiteren Code einlesen und die beiden miteinander abgleichen.
Dafür habe ich ein 4x3 Keypad.

Meine Frage ist es, wie ich es schaffe, erst das eine array (char password[7]) einzulesen bis es gefüllt ist, dann das 2. (char abgleich[7]) um DANN die beiden abgleichen zu können.

Das Einlesen des ersten Arrays klappt gut soweit, beim 2. hängt es. Die Ausgabe sieht wie folgt aus:

ENTER CODE:
2316546 //der eingegebene Code
CODE SET!

ENTER CODE:
6 //hier wird nur eine Ziffer eingelesen und der Rest der Ausgabe taucht nicht auf.

Bitte habt ein wenig Nachsicht, ich bin ein ziemlicher Anfänger in diesem Gebiet.

Ich bin für jede Hilfe sehr dankbar, denn ich stehe derzeit einfach auf dem Schlauch!
Hier ist mein derzeitiger Code, damit man sich vielleicht besser etwas darunter vorstellen kann.

void loop(){
  char key = keypad.getKey();

  if ((key) && (i <= 7)){
    led();
    password[i++]=key;
    Serial.print(key);
  }

  if (i==7){
    char key2 = keypad.getKey();
    if (j==1){
      Serial.println("CODE SET!");
      Serial.println();
      Serial.println("ENTER CODE:");
      j=0;
      }
      if (key2){
        led();
        abgleich[j++]=key2;
        Serial.println("abgleich");
        Serial.print(key2);
      }
  }
}

Ich hoffe ich habe alles Notwendige aufgelistet.

Liebe Grüße!

Hier ist mein derzeitiger Code
Ich hoffe ich habe alles Notwendige aufgelistet.

Ist er nicht. Die Variable i ist zum Beispiel nicht deklariert.

Hallo,

doch doch, ich hätte vielleicht erwähnen sollen, dass es sich hierbei nur um den Teil handelt, bei dem das Problem auftritt.
Die Variablen sind im Vorfeld deklariert. Ich habe eben nur den Loop eingefügt.

... den Teil handelt, bei dem das Problem auftritt.
Die Variablen sind im Vorfeld deklariert. Ich habe eben nur den Loop eingefügt.

Ist mir schon klar. Aber loop() ist nicht der Code (und meist auch nicht das Problem).

Dass du vermutlich irgendwo

   int i; // globale Variable, ratet mal wozu die gut ist

geschrieben hast, ist Teil des Problems, das andere mit deinem loop() - Schnipsel haben.

Lies dich alles in ein einziges Array ein und vergleiche 0-5 mit 6-11
evtl. musst du das Bestätigungszeichen berücksichtigen

Alles oder nichts.
Den ganze Code oder nur Rätselraten unsererseits.
Kommt mir fast so vor, als wenn ich bei einem Freund was kochen soll, aber weder in die Speisekammer noch in die Schränke schauen darf, um zu wissen, was vorhanden ist. Ja, ich bin hungrig :wink:
Grüße Uwe

Überzeugt!
…habt ja total Recht.

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int i=0;
int j=1;
char password[7];
char abgleich[7];

void setup(){
  Serial.begin(9600);
  Serial.println("ENTER CODE:");
}
  
void loop(){
  char key = keypad.getKey();

  if ((key) && (i <= 7)){
    password[i++]=key;
    Serial.print(key);
  }

  if (i==7){
    char key2 = keypad.getKey();
    if (j==1){
      Serial.println("CODE SET!");
      Serial.println();
      Serial.println("ENTER CODE:");
      j=0;
      }
      if (key2){
        abgleich[j++]=key2;
        Serial.println("abgleich");
        Serial.print(key2);
      }
  }
}

Na dann guten Hunger, Uwe ;D

Auf den ersten Blick sehe ich Zählfehler.

  if ((key) && (i <= 7)){
    password[i++]=key;
    Serial.print(key);

Die ließt 8Zeichen ein. Außerdem ist am Ende i=8. Es müsste in der Bedingung wohl i<7 heißen.

Mit i=8 wird der zweite Teil des Codes gar nicht erst angesprungen:

if (i==7){..
}

Für den Abgleich fehlt das Aufhören nach 7 Zahlen.

Vielen Dank.

Den ersten Teil habe ich mit <7 angepasst.

Beim Einlesen in das “abgleich” Array habe ich das gleiche Schema wie bei dem ersten Array angewendet.

Somit sieht der 2. Teil wie folgt aus:

 if (i==7){
    if (j==1){
      Serial.println("CODE SET!");
      Serial.println();
      Serial.println("ENTER SET CODE:");
      j = 0;
      }
      if ((key) && (j < 8)){
        abgleich[j++]=key;
        Serial.println("abgleich");
        Serial.print(j);
        Serial.print(key);
      }
  }

Und da hab ich endlich meinen Fehler gefunden.
Damit der Text einmal gesendet wird habe ich j von Anfang an mit dem Wert 1 versehen, welcher danach auf 0 gesetzt werden soll. Das klappt auch, aber nachdem durch die erste Eingabe via Tastatur j wieder um 1 erhöht wird (0+1 = 1) läuft das Programm wieder in die Schleife rein.
Wie dumm ^^

Vielen Dank Theseus, durch deinen Hinweis hab ich Fehler Nr. 1&2 gelöst und bin endlich auf den Schleifenfehler gekommen.

Super, dann kann ich ja weiter machen! :slight_smile:

Wenn ich nochmal ein Wehwehchen habe melde ich mich einfach ganz dreist :>

Danke an alle!!

Freue mich über Karma :wink:

Arrays kann man übrigens ganz einfach mit memcmp() vergleichen:
http://www.cplusplus.com/reference/cstring/memcmp/

Die Funktion liefert bei Gleichheit 0 zurück