Motor mit dem Tastenfeld steuern

Servus!
Ich arbeite an einem Projekt, in dem ich einen Motor mit dem 4x4 Tastenfeld steuere. Um den Motor zu steuern, muss der Benutzer zuvor ein Passwort eingeben. ich will, dass der Pin 12 mit dem Druck der Taste “A” aktiviert wird.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#define Password_Length 5

int signalPin = 12;
int thisChar = 'a';
int buzzer = 13;
char Data[Password_Length]; 
char Master[Password_Length] = "1234"; 
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;

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};

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C lcd(0x27, 16, 2);  

void setup(){
  lcd.init(); 
  lcd.backlight();
  pinMode(signalPin, OUTPUT);
  pinMode(buzzer,OUTPUT);
  digitalWrite(buzzer,HIGH);
  delay(500);
  digitalWrite(buzzer,LOW);
  lcd.setCursor(0,0);
  lcd.print("Wikllkommen");
  lcd.setCursor(0,1);
  lcd.print("zum");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Bonuscache");
  lcd.setCursor(0,1);
  lcd.print("Haselbach");
   delay(3000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("von");
  lcd.setCursor(0,1);
  lcd.print("BigBjrn");
   delay(3000);
  lcd.clear();
   digitalWrite(buzzer,HIGH);
  delay(200);
  digitalWrite(buzzer,LOW);
  delay(100);
   digitalWrite(buzzer,HIGH);
  delay(200);
  digitalWrite(buzzer,LOW);
 
}

void loop(){

  lcd.setCursor(0,0);
  lcd.print("Passwort:");

  customKey = customKeypad.getKey();
  if (customKey){
    Data[data_count] = customKey; 
    lcd.setCursor(data_count,1); 
    lcd.print(Data[data_count]); 
    data_count++; 
    }

  if(data_count == Password_Length-1){
    lcd.clear();

    if(!strcmp(Data, Master)){
      lcd.print("Richtig");
      digitalWrite(signalPin, HIGH); 
      delay(20000);
      digitalWrite(signalPin, LOW);
      }
    else{
      lcd.print("Falsch");
      delay(1000);
      }
    
    lcd.clear();
    clearData();  
  }
}

void clearData(){
  while(data_count !=0){
    Data[data_count--] = 0; 
  }
  return;
}

Sorry, ich kann kein englisch, darum bin ich hier im deutschen Forum.

ich will, dass der Pin 12 mit dem Druck der Taste “A” aktiviert wird

Du hast aber programmiert, dass “1234” eingetippt werden muss. (Damit Pin 12 für 20 sec HIGH wird) Wenn ich richtig geraten habe.
Mit einer Motor-Ansteuerung hat das Ganze nichts zu tun.

Hi

Du willst mit Sicherheit nicht bei JEDEM loop()-Durchlauf auf das Passwort prüfen.
Du möchtest Prüfen, ob JETZT eine Prüfung ansteht und DANN das Passwort abfragen, prüfen, entscheiden, wie's weiter geht.

Nach erfolgreicher Passwort-Prüfung wirst Du ja wohl irgend etwas Sinnvolles machen wollen - Da stört die laufende Passwortabfrage (Die zudem den ganzen Ablauf blockiert) nur.

MALE Dir haarklein auf, was wann passieren soll.
Je kleiner die Einzelschritte, desto genauer kannst Du Das nachprogramieren.
Auch wird Dir bereits beim Auf-MALEN auffallen, wie kompliziert der Vorgang wirklich ist - und auch, daß Du zig verschiedene Status (auch die Mehrzahl lautet Status) brauchst - und in jedem Status prüfst Du, ob Du 'hier fertig bist' um zu einem anderen Status zu springen.

So kannst Du recht komplizierte Abläufe hintereinander bringen.

Wenn mehrere Sachen parallel (gleichzeitig) ablaufen sollen, Die NICHTS miteinander zu tun haben, bekommen Die eigene Status und einen eigenen Ablauf.

In JEDEM loop()-Durchlauf wird geprüft, in welchem Status wir uns befinden und was zu Dessen beenden nötig ist.

Einfacher Ablauf:
LED ANschalten, Uhrzeit merken
Warten, bis 10 Sekunden um sind
LED AUSschalten, Ihrzeit merken
Warten, bis 15 Sekunden um sind

Wobei hier das Warten NUR aus der Abfrage besteht, ob die Zeit um ist -- wenn nicht, passiert hier NICHTS - gar nichts, also auch kein delay().
Im nächsten Durchlauf das Gleiche 'in grün' ... irgend wann ist die Zeit um (der Arduino rannte zig tausende Mal im Kreis, hatte aber Zeit, was Anderes zu machen !!), Du schaltest die LED um (je nach Status an oder aus), merkst Dir erneut die aktuelle Zeit (millis() ) und zählst den Status - also den Schritt, Den Du gerade abarbeitest, hoch.

In der IDE gibt's 'Blink_without_delay' als Beispiel - hier im Forum gibt's den Nachtwächter (einfach nach Suchen).

MfG

postmaster-ino:
In der IDE gibt’s ‘Blink_without_delay’ als Beispiel - hier im Forum gibt’s den Nachtwächter (einfach nach Suchen).

Das heißt BlinkWithoutDelay. Wie soll das denn ein Anfänger bei der total falschen Schreibweise finden?

Gruß mTommy

Moin

Per Denken und NACHdenken?
Ganz nebenbei hättest Du noch erwähnen können, daß dieses Beispiel bei 02.Digital zu finden ist ... in der Arduino-IDE ... auf dem eigenen PC ...

Wie soll ein Anfänger mit so viel fehlenden Hinweisen auch nur ansatzweise den heutigen Tag überleben?

Ja - ich verlange, daß man sogar etwas mitdenkt - wenngleich ich schuldig im Sinne der Anklage bin, daß besagter Anfänger mit meinem String wohl bei der Volltextsuche keinen Treffer in den Tiefen Seines Windows (whatever) landen wird.

MfG

Edit DU->Du

Google mal Blink_without_delay und die Intelligenz der Suchmaschine wird dich überraschen

Ok, aber wir wollen ja nicht die Suchmaschinen testen.

Gruß Tommy

Das ist hier ja ganzschön ausgeartet... :slight_smile: Natürlich vielen Dank für die vielen Antworten! Ich werd das ganze nochmal durchdenken und die Frage dann neu formulieren, damit es keine Unklarheiten gibt.