Auf ein LCD mehrstellige zahlen schreiben mit einem Numpad

Hallo, ich habe mal eine frage unzwar arbeite ich an einem Projekt beidem es wichtig ist das ich mehrstellige zahlen aufschreiben kann, aber ich kriege es irgendwie nicht hin da er immer nur eine Zahl anzeigt.

#include <LiquidCrystal.h>
#include <Keypad.h>  //Keypad und Servo Library wird eingebunden
#include <Servo.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
Servo servoblau;  //Servo wird ab jetzt mit „servoblau“ angesprochen
int position = 0;
char key;
const byte ROWS = 4;  //Hier wird angegeben wie viele Zeilen und Spalten das
const byte COLS = 3;  //Tastenfeld besitzt
char keys[ROWS][COLS] = {
  { '#', '0', '*' },
  { '9', '8', '7' },
  { '6', '5', '4' },
  { '3', '2', '1' }
};
byte rowPins[ROWS] = { 25, 26, 27, 28 };  //Die Verbindung mit dem Arduino wird
byte colPins[COLS] = { 22, 23, 24 };      //festgelegt
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
int roteLED = 49; 
int grueneLED = 51;
void setup() {
  lcd.begin(16, 2);
  pinMode(roteLED, OUTPUT);  //Die LEDs werden als Ausgang festgelegt
  pinMode(grueneLED, OUTPUT);
  servoblau.attach(47);  //Der Servo ist an Pin 11 angeschlossen
  setLocked(true);
}
void loop() {

  key = keypad.getKey();

  if (key) {
    lcd.setCursor(0, 0);
    lcd.print(key);
    lcd.setCursor(1, 0);
    lcd.print(key);
  }


  if (key == '#') {

    position = 0;
    setLocked(true);
    lcd.setCursor(0, 0);
    lcd.print("Locking...");
    delay(1000);
    lcd.setCursor(0, 0);
    lcd.print("                ");
  }

  if (key == '*') {
    position = 0;
    lcd.setCursor(0, 0);
    lcd.print("Status Reset");
    digitalWrite(50, HIGH);
    delay(1000);
    digitalWrite(50, LOW);
    lcd.setCursor(0, 0);
    lcd.print("                ");
  }

  if (key == "123"[position]) {
    position++;
  }
  if (position == 3) {
    setLocked(false);
    lcd.setCursor(0, 0);
    lcd.print("Passwort Correct!");
    delay(2500);
    lcd.setCursor(0, 0);
    lcd.print("                ");
  }
}
void setLocked(int locked) {
  if (locked)  // Wenn das Schlo
  {
    digitalWrite(roteLED, HIGH);
    digitalWrite(grueneLED, LOW);
    servoblau.write(90);  //und de
  } else                  //wenn das Schloss entsp

  {
    digitalWrite(roteLED, LOW);     
    digitalWrite(grueneLED, HIGH);  
    servoblau.write(0);             
  }
}

Das ist bis jetzt mein Aktueller versuch, und ich möchte das man die Zahlen nacheinander auf ein LCD klatschen kann dass, wenn man die falschen zahlen geschrieben hat, man es einfach mit "*" wegmachen kann.

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

achso ja ok wusste ich nicht

du hast welchen Microcontroller?

einen Arduino Mega2560

Schritt 1:

Pins 0 und 1 sind für die Serielle Schnittstelle. Verwende diese nicht für das LCD. Die Serielle Schnittstelle benötigst du zum debuggen / zur Fehlersuche.

Schließ das LCD an andere freie Pins an und lass 0 und 1 frei.

Schritt 2:
überarbeite deine Kommentare.

das verwirrt nur:

int grueneLED = 51; //Die grüne LED wird an Pin 13 angeschlossen

und

Drück mal STRG-T in der IDE - dann sieht der code schöner aus.
Wenn du Fertig bist, poste deinen Code neu hier.

bei mir ist STRG-F "Find"

STRG+T das meinte @noiasca

achso ja ich hab das aus so nem Tutorial kopiert was aber nicht geklappt hat aber kann ich auch weg machen

nicht weg - "Richtig" ... du brauchst die Pin Nummer nicht nochmal im Kommentar anführen - ist nur eine Fehlerquelle.
Aber natürlich kannst du Variablen mit einen Kommentar besser erklären. Das stört nicht.

edit:

sehe ich das richtig:

  • du willst den User einen dreistelligen Code eingeben lassen
  • Wenn sich der User vertippt, soll er mit * das letzte Zeichen löschen können
  • Wenn der Code richtig ist - willst du ein Servo betätigen
#include <LiquidCrystal.h>
#include <Keypad.h>  //Keypad und Servo Library wird eingebunden
#include <Servo.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
Servo servoblau;  //Servo wird ab jetzt mit „servoblau“ angesprochen
int position = 0;
char key;
const byte ROWS = 4;  //Hier wird angegeben wie viele Zeilen und Spalten das
const byte COLS = 3;  //Tastenfeld besitzt
char keys[ROWS][COLS] = {
  { '#', '0', '*' },
  { '9', '8', '7' },
  { '6', '5', '4' },
  { '3', '2', '1' }
};
byte rowPins[ROWS] = { 25, 26, 27, 28 };  //Die Verbindung mit dem Arduino wird
byte colPins[COLS] = { 22, 23, 24 };      //festgelegt
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
int roteLED = 49;
int grueneLED = 51;
void setup() {
  lcd.begin(16, 2);
  pinMode(roteLED, OUTPUT);  //Die LEDs werden als Ausgang festgelegt
  pinMode(grueneLED, OUTPUT);
  servoblau.attach(47);  //Der Servo ist an Pin 11 angeschlossen
  setLocked(true);
  lcd.cursor();
}
void loop() {
  key = keypad.getKey();

  if (key) {
    lcd.print(key);
  }

  if (key == '#') {
    position = 0;
    setLocked(true);
    lcd.setCursor(0, 0);
    lcd.print("Locking...");
    ClearIn(1000);
  }

  if (key == '*') {
    position--;
    lcd.setCursor(0, 0);
    lcd.print("Status Reset");
    digitalWrite(50, HIGH);
    ClearIn(1000);
    digitalWrite(50, LOW);
  }

  if (key == "123"[position]) {
    position++;
  } else     position = 0;

  if (position == 3) {
    position = 0;
    setLocked(false);
    lcd.setCursor(0, 0);
    lcd.print("Passwort Correct!");
    ClearIn(2500);
  }
}

void ClearIn(int Delay) {
  delay(Delay); lcd.clear();
}

void setLocked(bool locked) {
  digitalWrite(roteLED, locked);
  digitalWrite(grueneLED, !locked);
  servoblau.write(locked ? 90 : 0);
}

nein, das ist keine gute Skizze.
Deine Idee, das Passwort bei jedem Tastendruck zu prüfen, ist kontraproduktiv.
Normalerweise gibt der Benutzer eine beliebige Anzahl oder die maximale Anzahl von Symbolen ein und drückt die Eingabetaste. Erst dann sollte das gesammelte Array mit dem ursprünglichen Passwort verglichen werden.

@p_eer

Ihr fast identisches Thema im englischen Teil des Forums wurde gelöscht.

Bitte:
Posten Sie nur in den englischen Teilen des Forums auf Englisch, wenn Sie auf Deutsch posten möchten, verwenden Sie nur den deutschen Teil des Forums.

Posten Sie Ihre Frage nur einmal und achten Sie darauf, eine geeignete Forumkategorie in der Sprache Ihrer Wahl auszuwählen.

Vielen Dank

genau so

ich häng' momentan an einem andere Problem.
Funktioniert der Sketch von @kolaha ?
Wenn nicht beschreibe ihm exakt was alles anders sein soll.

Moin, ich hätte mal eine Frage unzwar, möchte ich ein Zahlencode erstellen mitdem ich einen Servo entsperren kann. Aber ich habe das Problem das er nicht den Zahlencode resetet wenn bei dem Zahlencode einfach alle Zahlen nur durcheinander gedrückt wird. Deshalb möchte ich das wenn ich über 4 Zahlen geschrieben habe, dass sich dann der Zahlencode resetet und man dann (wie im Arduino Code vorgesehen) die Position wieder Auf null stellt und sich das LCD Resetet.

Ich Verlinke einmal den Code.

  #include <LiquidCrystal.h>
  #include <Keypad.h>  //Keypad und Servo Library wird eingebunden
  #include <Servo.h>
  LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
  Servo servoblau;  //Servo wird ab jetzt mit „servoblau“ angesprochen
  int position = 0;
  char key;
  const byte ROWS = 4;  //Hier wird angegeben wie viele Zeilen und Spalten das
  const byte COLS = 3;  //Tastenfeld besitzt
  char keys[ROWS][COLS] = {
    { '#', '0', '*' },
    { '9', '8', '7' },
    { '6', '5', '4' },
    { '3', '2', '1' }
  };
  byte rowPins[ROWS] = { 25, 26, 27, 28 };
  byte colPins[COLS] = { 22, 23, 24 };      
  Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
  int roteLED = 49;
  int grueneLED = 51;
  void setup() {
    lcd.begin(16, 2);
    pinMode(roteLED, OUTPUT);  
    pinMode(grueneLED, OUTPUT);
    servoblau.attach(47);  
    setLocked(true);
    lcd.cursor();
  }
  void loop() {
    key = keypad.getKey();

    if (key) {
      lcd.print(key);
    }

    if (key == '#') {
      position = 0;
      setLocked(true);
      lcd.setCursor(0, 0);
      lcd.print("Locking...");
      ClearIn(1000);
    }

    if (key == '*') {
      position--;
      lcd.setCursor(0, 0);
      lcd.print("Status Reset");
      digitalWrite(50, HIGH);
      ClearIn(1000);
      digitalWrite(50, LOW);
    }

    if (key == "123"[position]) {
      position++;
    }

    if (position == 3) {
      position = 0;
      setLocked(false);
      lcd.setCursor(0, 0);
      lcd.print("Passwort Correct!");
      ClearIn(2500);
    }


  }

  void ClearIn(int Delay) {
    delay(Delay);
    lcd.clear();
  }

  void setLocked(bool locked) {
    digitalWrite(roteLED, locked);
    digitalWrite(grueneLED, !locked);
    servoblau.write(locked ? 90 : 0);
  }

(Und an die Mods und Admins (falls ich den Beitrag wieder in den Englischen Teil des Forums gemacht habe), ich habe keinen Blassen Schimmer wie ich das in den Deutschen Teil machen, und bitte verschieben sie nur meinen Beitrag in den Deutschen Teil, aber löschen ihn nicht :slight_smile: )

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Hallo, geht das auch verständlich ?
Also so, dass man deinen Text und die Frage auch versteht, ohne das man ständig nur im Kopf resettet ?

Suchfunktion des Arduino-Forums rechts oben

Schon mal gegoogelt?

Dann gibt es im Forum einen Menüpunkt all categories
https://forum.arduino.cc/categories

Runterscrollen bis International

Also noch nicht mal googeln ist jetzt echt ne Superbequemhaltung.