Keypad Motor ansteuern

Hallo,

ich möchte mithilfe eines PIN Codes einen Motor ansteuern. Das funktioniert soweit auch schon.
Folgendes möchte ich erreichen:

  1. richtige Eingabe des PINs => Motor dreht links herum
  2. richtige Eingabe des PINs => Motor drehts rechts herum
  3. richtige Eingabe des PINs => Motor dreht links herum

usw. also immer abwechselnd links / rechts.
Bei falschem PIN darf natürlich nichts passieren.

Habe es schon soweit hinbekommen, dass der Motor bei richtigem PIN in eine Richtung dreht. Bei der nächsten richtigen Eingabe dreht er aber wieder in dieselbe Richtung.

#include <Stepper.h>
#include <Keypad.h>

#define STEPS  32  
int  Steps2Take; 
 
const byte PINLENGTH = 4;
char pinCode[PINLENGTH+1] = {'0','8','1','5'};
 
char keyBuffer[PINLENGTH+1] = {'-','-','-','-'};

const byte ROWS = 4; 
const byte COLS = 4; 
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; 
byte colPins[COLS] = {5, 4, 3, 2}; 
 
Stepper small_stepper(STEPS, 10, 12, 11, 13);

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  char customKey = customKeypad.getKey();
 
  if (customKey) {
    if ((int(customKey) >= 48) && (int(customKey) <= 57)){ 
      addToKeyBuffer(customKey); 
    }
    else if (customKey == '#') { 
      checkKey(); 
    } 
  } 
} 
 
void addToKeyBuffer(char inkey) { 
  Serial.print(inkey); 
  Serial.print(" > ");
  for (int i=1; i<PINLENGTH; i++) {
    keyBuffer[i-1] = keyBuffer[i];
  }
  keyBuffer[PINLENGTH-1] = inkey;
  Serial.println(keyBuffer);
}
 
void checkKey() {
  if (strcmp(keyBuffer, pinCode) == 0) {
    Serial.println("CORRECT");
 
  }
  else {
    Serial.println("WRONG!");

  }
 
  for (int i=0; i < PINLENGTH; i++) {
    keyBuffer[i] = '-'; 
  }


}
    switch(results.value)
 
void pinCorrect() {
  small_stepper.setSpeed(1000); 
                      Steps2Take  =  2048;  
                      small_stepper.step(Steps2Take);
                      delay(2000); 
                      
}
void  pinCorrect() {
  small_stepper.setSpeed(1000); 
                      Steps2Take  =  -2048;  
                      small_stepper.step(Steps2Take);
                      delay(2000); 
 }
void pinWrong() {
  small_stepper.setSpeed(1000);
                      Steps2Take  =  0;  
                      small_stepper.step(Steps2Take);
                      delay(2000); 
                      
 
}

Könnt ihr mir hier weiterhelfen?

Wenn du jetzt noch hinbekommst, den richtigen Sketch zu posten...
ab

    switch(results.value)

scheint dir da was durcheinandergeraten zu sein...

Im übrigen: ist irgendwie auch vorgesehen, den Motor mal zu stoppen?
Wie merkst du dir die aktuelle/gewünschte Richtung?
Die könntest du nach    Serial.println("CORRECT"); mit ausgeben...

Hi,

in der Tat. Da ist mir eine alte Version vom Sketch in die Zwischenablage gerutscht:

#include <Stepper.h>
#include <Keypad.h>

#define STEPS  32   
int  Steps2Take;  
 

const byte PINLENGTH = 4;
char pinCode[PINLENGTH+1] = {'0','8','1','5'};
 

char keyBuffer[PINLENGTH+1] = {'-','-','-','-'};
 

const byte ROWS = 4; // vier Zeilen
const byte COLS = 4; // vier Spalten

char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
 

Stepper small_stepper(STEPS, 10, 12, 11, 13);

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){

  char customKey = customKeypad.getKey();
 
  if (customKey) {

    if ((int(customKey) >= 48) && (int(customKey) <= 57)){ 
      addToKeyBuffer(customKey); 
    }

    else if (customKey == '#') { 
      checkKey(); 
    } 
  } 
} 
 
void addToKeyBuffer(char inkey) { 
  Serial.print(inkey); 
  Serial.print(" > ");
  for (int i=1; i<PINLENGTH; i++) {
    keyBuffer[i-1] = keyBuffer[i];
  }
  // in ganz rechter Stelle die letzte Ziffer speichern
  keyBuffer[PINLENGTH-1] = inkey;
  Serial.println(keyBuffer);
}
 
void checkKey() {
  if (strcmp(keyBuffer, pinCode) == 0) {
    Serial.println("CORRECT");
    pinCorrect();
  }
  else {
    Serial.println("WRONG!");
    pinWrong();
  }

  for (int i=0; i < PINLENGTH; i++) {
    keyBuffer[i] = '-'; 
  }
}
 
void pinCorrect() {
  small_stepper.setSpeed(1000); //Max seems to be 1000
                      Steps2Take  =  2048;  // Rotate CW
                      small_stepper.step(Steps2Take);
                      delay(2000); 
                      
}
 
void pinWrong() {
  small_stepper.setSpeed(1000);
                      Steps2Take  =  0;  // Rotate CCW
                      small_stepper.step(Steps2Take);
                      delay(2000); 
                      
 
}

Wie merkst du dir die aktuelle/gewünschte Richtung?

Du könntest z.B. die int steps2Take; dafür verwenden.

#define STEPS  2048   
int  Steps2Take = STEPS;  // abwechselnd + - STEPS

void pinCorrect() {
   small_stepper.setSpeed(1000); //Max seems to be 1000
   small_stepper.step(Steps2Take);
   delay(2000); 
   Steps2Take = - Steps2Take; // nächstes Mal zurück
}

void pinWrong() {
   delay(2000);   // nichts tun 
}

Hi,
habe deinen Vorschlag mal so übernommen. Nun dreht sich der Motor aber nur noch ein kleines Stück. Das ist auch kaum sichtbar, sondern eigtl. nur fühlbar am Motor selbst.

#include <Stepper.h>
#include <Keypad.h>

#define STEPS  2048   
int  Steps2Take = STEPS;  // abwechselnd + - STEPS

// Pinlänge und Pincode festlegen
const byte PINLENGTH = 4;
char pinCode[PINLENGTH+1] = {'0','8','1','5'};
 
// Zwischenspeicher für Eingaben
char keyBuffer[PINLENGTH+1] = {'-','-','-','-'};
 
// Kompakter kann man das auch so schreiben:
// char pin[] = "0815";
// char keyBuffer[] = "----";
 
// Definition für das Keypad von Elegoo
const byte ROWS = 4; // vier Zeilen
const byte COLS = 4; // vier Spalten
// Symbole auf den Tasten
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
 

Stepper small_stepper(STEPS, 10, 12, 11, 13);


 
// Instanz von Keypad erzeugen, Keymap und Pins übergeben
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  // Gedrückte Taste abfragen
  char customKey = customKeypad.getKey();
 
  if (customKey) {
    // Check, ob ASCII Wert des Char einer Ziffer zwischen 0 und 9 entspricht
    if ((int(customKey) >= 48) && (int(customKey) <= 57)){ 
      addToKeyBuffer(customKey); 
    }
  // oder Code überprüfen, falls Raute gedrückt wurde 
    else if (customKey == 'A') { 
      checkKey(); 
    } 
  } 
} 
 
void addToKeyBuffer(char inkey) { 
  Serial.print(inkey); 
  Serial.print(" > ");
  // Von links nach rechts Zeichen um eins weiterkopieren = ältestes Zeichen vergessen
  for (int i=1; i<PINLENGTH; i++) {
    keyBuffer[i-1] = keyBuffer[i];
  }
  // in ganz rechter Stelle die letzte Ziffer speichern
  keyBuffer[PINLENGTH-1] = inkey;
  Serial.println(keyBuffer);
}
 
void checkKey() {
  // Eingabe mit festgelegtem Pincode vergleichen
  if (strcmp(keyBuffer, pinCode) == 0) {
    Serial.println("CORRECT");
    // Aktion für richtigen Pin ausführen
    pinCorrect();
  }
  else {
    Serial.println("WRONG!");
    // Aktion für falschen Pin ausführen
    pinWrong();
  }
 
  // Nach Überprüfung Eingabe leeren
  for (int i=0; i < PINLENGTH; i++) {
    keyBuffer[i] = '-'; 
  }
}
 



void pinCorrect() {
   small_stepper.setSpeed(1000); //Max seems to be 1000
   small_stepper.step(Steps2Take);
   delay(2000); 
   Steps2Take = - Steps2Take; // nächstes Mal zurück
}

void pinWrong() {
   delay(2000);   // nichts tun 
}

Ersetze mal das

    Serial.println("CORRECT");

durch

    Serial.print("CORRECT : "); Serial.println(steps2Take);

und schau/erzähl was du dann siehst.

Beim geposteten Sketch wird die Überprüfung übrigens bei Eingabe der Taste A gemacht.

Hi,
durch deinen Vorschlag hat sich nichts geändert. Die Situation ist unverändert.

#include <Stepper.h>
#include <Keypad.h>

#define STEPS  2048   
int  Steps2Take = STEPS;  // abwechselnd + - STEPS

// Pinlänge und Pincode festlegen
const byte PINLENGTH = 4;
char pinCode[PINLENGTH+1] = {'0','8','1','5'};
 
// Zwischenspeicher für Eingaben
char keyBuffer[PINLENGTH+1] = {'-','-','-','-'};
 
// Kompakter kann man das auch so schreiben:
// char pin[] = "0815";
// char keyBuffer[] = "----";
 
// Definition für das Keypad von Elegoo
const byte ROWS = 4; // vier Zeilen
const byte COLS = 4; // vier Spalten
// Symbole auf den Tasten
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
 

Stepper small_stepper(STEPS, 10, 12, 11, 13);


 
// Instanz von Keypad erzeugen, Keymap und Pins übergeben
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  // Gedrückte Taste abfragen
  char customKey = customKeypad.getKey();
 
  if (customKey) {
    // Check, ob ASCII Wert des Char einer Ziffer zwischen 0 und 9 entspricht
    if ((int(customKey) >= 48) && (int(customKey) <= 57)){ 
      addToKeyBuffer(customKey); 
    }
  // oder Code überprüfen, falls Raute gedrückt wurde 
    else if (customKey == '#') { 
      checkKey(); 
    } 
  } 
} 
 
void addToKeyBuffer(char inkey) { 
  Serial.print(inkey); 
  Serial.print(" > ");
  // Von links nach rechts Zeichen um eins weiterkopieren = ältestes Zeichen vergessen
  for (int i=1; i<PINLENGTH; i++) {
    keyBuffer[i-1] = keyBuffer[i];
  }
  // in ganz rechter Stelle die letzte Ziffer speichern
  keyBuffer[PINLENGTH-1] = inkey;
  Serial.println(keyBuffer);
}
 
void checkKey() {
  // Eingabe mit festgelegtem Pincode vergleichen
  if (strcmp(keyBuffer, pinCode) == 0) {
   Serial.print("CORRECT : ");
   Serial.println("steps2Take");  
    
    
   pinCorrect();
  }
  else {
    Serial.println("WRONG!");
    // Aktion für falschen Pin ausführen
    pinWrong();
  }
 
  // Nach Überprüfung Eingabe leeren
  for (int i=0; i < PINLENGTH; i++) {
    keyBuffer[i] = '-'; 
  }
}
 



void pinCorrect() {
   small_stepper.setSpeed(1000); //Max seems to be 1000
   small_stepper.step(Steps2Take);
   delay(2000); 
   Steps2Take = - Steps2Take; // nächstes Mal zurück
}

void pinWrong() {
   delay(2000);   // nichts tun 
}
   Serial.println("steps2Take");

ist was anderes als

   Serial.println(steps2Take);

schau/erzähl was du dann siehst.