Go Down

Topic: Een character weg halen op LCD. Door * op keypad in te toetsen? (Read 325 times) previous topic - next topic

shab-1r

Hallo,


Ik ben bezig met een maken van een kluis systeem waarbij je 1 arduino gebruikt en meerdere relais voor de solenoid. Het is de bedoeling dat ik voor elke kluis een andere pincode intoets. dus kluis van "andy" gaat open als ik 1234 en dan # in toets en van "Mike" gaat open als ik 8520 intoets enzovoort.


Ik heb het voor elkaar dat als je de pincode invoert op de lcd een * te voor schijn komt dus als ik 123 intoets dan komt er op het lcd ***.  Ik maak gebruik van de NewPasswordv2 die heeft een soort van een back space functie dat wil zeggen als ik bijvoorbeeld in mijn geval op "*" klik dan wordt het cijfer wat ik heb in getoets verwijderd. Dus als ik 123 intoets gevolgd door *** dan zijn alle 3 cijfers weg. als ik twee keer * doe dan gaat 23 weg enzovoort.


maar het probleem is dat de sterretjes * op de lcd dan niet weg gaan. die blijven. Dus als ik een pincode van vier cijfers intoets zie je **** en als ik eentje fout heb ingetoets kan ik met de toets * die weg halen en dan de goede cijfer intoetsen maar op de lcd blijft dan **** staan en als ik de goede cijfer in toets zie je ****** enzo.  


Dit is de hele code

Code: [Select]

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


NewPasswordV2 Mypass1;
NewPasswordV2 Mypass2;
NewPasswordV2 Mypass3;

#define Lock1 10
#define Lock2 11
#define Lock3 12



const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

char Name[10] = {NULL};
char Pword1[6] = {''};
char Pword2[6] = {''};
char Pword3[6] = {''};
char data1;
int currentPosition = 0;


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

  Mypass1.EnterKey('#'); // MANUAL MODE Must add # at the end of password to enter it
  Mypass1.BackSpaceKey('*'); // MANUAL MODE '-' or (Backspace Key) will delete an index of the password array before checking it.

  Mypass2.EnterKey('#'); // MANUAL MODE Must add # at the end of password to enter it
  Mypass2.BackSpaceKey('*'); // MANUAL MODE '-' or (Backspace Key) will delete an index of the password array before checking it.

  Mypass3.EnterKey('#'); // MANUAL MODE Must add # at the end of password to enter it
  Mypass3.BackSpaceKey('*'); // MANUAL MODE '-' or (Backspace Key) will delete an index of the password array before checking it.

  Mypass1.AddPassword("1111", "*Master  SHABIR*"); // password, name, function.
  Mypass2.AddPassword("2222", "*Master  joshua*"); // regular password and username, no function required.
  Mypass3.AddPassword("3333", "Joey");


  pinMode(Lock1, OUTPUT);
  pinMode(Lock2, OUTPUT);
  pinMode(Lock3, OUTPUT);


  lcd.init();
  lcd.backlight();

  displayCodeEntryScreen();
}

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

  if (key)
  {
    Serial.println(key);
  }

  if ((key >= '0' && key <= '9')) {
    lcd.setCursor(7, 1);
    lcd.print("                ");
    lcd.setCursor(7, 1);

    for (L = 0; L <= currentPosition; ++L)
    {
      lcd.print("*");
    }
    ++currentPosition;
  }




  if (key == '*') {
    currentPosition= 0;
  }




  data1 = key;


  if (Mypass1.EnterData(data1, Pword1))
  {
    if ( Mypass1.CheckPassword(Pword1) )
    {
      clearScreen();
      lcd.setCursor(0, 0);
      lcd.print(F("Acces Granted: "));
      Serial.print(F("Acces Granted: "));
      lcd.setCursor(0, 1);
      lcd.print(Mypass1.CheckUser());
      Serial.print(Mypass1.CheckUser());
      Serial.println();

      //   Here comes the code to open Andy's locker.
      digitalWrite(Lock1, HIGH);
      currentPosition = 0;
    }
  }



  if (Mypass2.EnterData(data1, Pword2))
  {
    if ( Mypass2.CheckPassword(Pword2) )
    {
      clearScreen();
      lcd.setCursor(0, 0);
      lcd.print(F("Acces Granted: "));
      Serial.print(F("Acces Granted: "));
      lcd.setCursor(0, 1);
      lcd.print(Mypass2.CheckUser());
      Serial.print(Mypass2.CheckUser());
      Serial.println();

      //   Here comes the code to open Andy's locker.
      digitalWrite(Lock2, HIGH);

    }
  }


  if (Mypass3.EnterData(data1, Pword3))
  {
    if ( Mypass3.CheckPassword(Pword3) )
    {
      clearScreen();
      lcd.setCursor(0, 0);
      lcd.print(F("Acces Granted: "));
      Serial.print(F("Acces Granted: "));
      lcd.setCursor(0, 1);
      lcd.print(Mypass3.CheckUser());
      Serial.print(Mypass3.CheckUser());
      Serial.println();

      //   Here comes the code to open Andy's locker.
      digitalWrite(Lock3, HIGH);

    }
  }

  if (key == '#' && !(Mypass1.EnterData(data1, Pword1))) {
    Serial.println("knaker");
  }




  if (key == 'C') {
    currentPosition = 0;
    clearScreen();
    digitalWrite(Lock1, LOW);
    digitalWrite(Lock2, LOW);
    digitalWrite(Lock3, LOW);
    displayCodeEntryScreen();
  }



  if (key == '#') {
    delay(1000);
    displayCodeEntryScreen();
    currentPosition = 0;
  }
}
void displayCodeEntryScreen()
{
  clearScreen();
  lcd.setCursor(0, 0);
  lcd.print("Enter Code:");
}

void clearScreen()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");

}



dit is het stukje wat ervoor zorg dat er een * op de lcd komt.


Code: [Select]
if ((key >= '0' && key <= '9')) {
    lcd.setCursor(7, 1);
    lcd.print("                ");
    lcd.setCursor(7, 1);

    for (L = 0; L <= currentPosition; ++L)
    {
      lcd.print("*");
    }
    ++currentPosition;
  }




en in dit stuk je moet ik ervoor zorgen dat die ster weg gaat als ik knopje * in toets
Code: [Select]

 if (key == ' * ')
{
   currentPosition--;
    lcd.print(" ");

 }





Mijn idee was als er op de knopje * op de keypad werd gedrukt moest de cursor een plaats naar links en daar moest met lcd.print(" "); <--  komen  en als ik dan weer een cijfer in toets moet dan weer character * op die plek komen.






Bij voorbaat dank.


excuses voor de lange post. Ik wil zo duidelijk mogelijk zijn.  ik hoop niet dat je door de war raakt door de karakter * en het knopje* op de keypad.



TechGraphix

Is het misschien een idee om een string te maken die je vanaf een bepaalde cursorpositie laat printen?
Een string kan je initieel vullen met 4 spaties
Op zich verwacht ik dat die positie--; print spatie; zou moeten werken. mits je, natuurlijk, die cursorpositie-- ook nog even in een lcd.setCursor(cursorpositie,regel) zet.. (anders is alleen die waarde veranderd, maar dat weet je display niet..)

Kees


shooter

zoek inderdaad naar current position in de password lib.
een andere makkelijke is zet een spatie achter het sterretje dan haalt hij het volgende karakter weg.
nog een andere is eerst de lcd met spaties vullen en dan pas de sterretjes neerzetten.
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Go Up