meerdere pincodes gebruiken met de keypad

Hallo,

Ik heb een kleine uitdaging waar ik al een tijdje mee zit, maar ik kom er maar niet uit hoe ik het moet maken.

Ik wil het volgende. Ik heb nu een alarmcentrale gemaakt waar ik maar 1 pincode in heb. Nu wil ik er meer pincodes in toevoegen, maar ik weet niet goed hoe ik dit moet doen. Zat zelf te denken aan (Sting of array) als er een cijfer op de keypad wordt ingedrukt dat dit dan ergens wordt opgeslagen en als er dan 4 cijfers zijn dat dit dan vergeleken wordt met de pincodes.

Wie wil mij hier mee op weg helpen.

Hier onder is mijn code, ik heb alleen het stukje over de pincode er ingelaten zo dat het overzichtelijk blijft.

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

const int Buzzer = 35;  

char* ourCode = "1234";
int currentPosition = 0;

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

const byte ROWS = 4; 
const byte COLS = 4; 

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

byte rowPins[ROWS] = {
  30, 29, 28, 27};  // verbinding maken met de pin rij van het keypad.
byte colPins[COLS] = {
  26, 25, 24, 22};  // verbinding maken met de pen kolom van het keypad.

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

const int led_rood = 32;      
const int led_groen = 31;


void setup(){
  Serial.begin(9600);
  lcd.begin(20,4);    // initialize the lcd for 20 chars 4 lines  
  lcd.backlight();    // LCD verlichting aan.

  pinMode(led_rood, OUTPUT);
  pinMode(led_groen, OUTPUT);

  Start_scherm(); 
}

void loop(){
  {
    
    int L;

    char key = keypad.getKey();

    if (int(key) != 0) {
      tone(Buzzer, 1700, 100);    // Als er een toets van de keypad wordt ingedrukt, Buzzer: frequency 1700 en 0.1 sec lang.
      lcd.setCursor(0, 2);
      lcd.print("   ");
      Serial.print(key);
      lcd.setCursor(0, 2);

      for (L = 0; L <= currentPosition; ++L)
      {
        lcd.print("*");
        }
      if (key == ourCode[currentPosition])
      {
        ++currentPosition;
        if (currentPosition == 4)        // Pincode is goed.
        {
          Serial.println(" PINCODE JUIST ");
          Serial.println(" ");
          tone(Buzzer, 2500, 1500);
          digitalWrite(led_groen, HIGH);
          digitalWrite(led_rood, LOW);
          Pincode_Goed();                  // Ga naar functie: Pincode_Goed.
          currentPosition = 0;
        }
      }

      else                               // Pincode is fout.
      {
        Serial.println(" PINCODE ONJUIST ");
        Serial.println(" ");
        digitalWrite(led_rood, HIGH);
        digitalWrite(led_groen, LOW);
        Pincode_Fout();                  // Ga naar functie: Pincode_Fout.
        currentPosition = 0;
      }
    }
  }
}


//****************************************************************************************************************************************//
//****************************************************************************************************************************************//

void Pincode_Fout()
{
  // ClearScreen.
  lcd.setCursor(0, 0);
  lcd.print("                    ");
  lcd.setCursor(0, 1);
  lcd.print("                    ");
  lcd.setCursor(0, 2);
  lcd.print("                    ");
  lcd.setCursor(0, 3);
  lcd.print("                    ");

  lcd.print("  PINCODE ONJUIST   ");
  lcd.setCursor(0, 2);
  lcd.print("      OPNIEUW       ");
  lcd.setCursor(0, 3);
  tone(Buzzer, 2500, 1500);
  delay(2000);
  digitalWrite(led_rood, LOW);
  Start_scherm(); 
}

//****************************************************************************************************************************************//
//****************************************************************************************************************************************//

void Pincode_Goed()
{
  // ClearScreen.
  lcd.setCursor(0, 0);
  lcd.print("                    ");
  lcd.setCursor(0, 1);
  lcd.print("                    ");
  lcd.setCursor(0, 2);
  lcd.print("                    ");
  lcd.setCursor(0, 3);
  lcd.print("                    ");

  lcd.setCursor(0, 1);
  lcd.print("   PINCODE JUIST    ");
  tone(Buzzer, 2500, 1500);
  delay(2000);
  digitalWrite(led_groen, LOW);
  Start_scherm(); 
}

//****************************************************************************************************************************************//
//****************************************************************************************************************************************//

void Start_scherm()
{
  lcd.setCursor(0, 0);
  lcd.print("                    ");
  lcd.setCursor(0, 1);
  lcd.print("                    ");
  lcd.setCursor(0, 2);
  lcd.print("                    ");
  lcd.setCursor(0, 3);
  lcd.print("                    ");
  lcd.setCursor(2, 3);
  lcd.print("Toets pincode in");
  digitalWrite(led_groen, LOW);

}

Alvast bedankt Marcel

Waarom maak je niet gewoon een array met de 4 cijfers per entry. Als er 4 cijfers binnen zijn loop je de array af met strcmp(). Heb je die gevonden geef je de index terug uit de tabel. En anders bijv. -1.

Nico, bedankt voor je reactie.

Ik heb alleen geen flauw idee hoe ik de 4cijfers binnen haal van de keypad. 1 voor 1 dat lukt wel maar ik moet moet ze eerst alle 4 hebben en dan vergelijken gaan toch?

Is hier ook info over hoe dit moet. Ik kan hier niks over vinden jammer genoeg (zal wel niet goed zoeken denk ik :( )

in pseudocode:

index = 0;      // positie binnen de 4 cijfers
while(index != 4) {
   char toets = leesToets();    // lees een toets
   pinCode[index] = toets;     // zet toets in pincode
   index++;                          // verhoog index
}

Waarom maak je geen getal van je 4 cijfers en dan gewoon getallen vergelijken?

Dat probeer ik hem juist uit te leggen :grin:

Ik bedoel (psuedo code

unsigned long ingevoerdeCode=0;
index = 0;      // positie binnen de 4 cijfers
while(index != 4) {
   char toets = leesToets();    // lees een toets
   ingevoerdeCode = ingevoerdeCode *255 +toets;     
   index++;                          // verhoog index
}
unsigned long goedecode1=((('4'*255+'5')*255+'6')*255)+'B' 
unsigned long goedecode2=((('1'*255+'2)'*255+'*')*255)+'#' 
if ((ingevoerdeCode==goedecode1)||(ingevoerdeCode==goedecode2))
{
bingo!!!!!!
}

Ik zou zelf een array gebruiken om wat meer flexibiliteit te hebben met zoeken. Maar goed nu heeft ie 2 mogelijkheden :grin:

Inderdaad 2 mogelijkheden (van de heel vele). Ik heb de 2 gekoppeld wat het een derde methode maakt (en misschien wel de beste maar niet direct iets voor beginners)

union CodeKraker {
    char code[4];
    unsigned value;
};


//The setup function is called once at startup of the sketch
void setup()
{
// Add your initialization code here
}
/*char leesToets()
{
    static int pos=0;
    char values[4*5]={'3','5','6','B','4','5','6','B','4','5','6','b','1','2','*','#','1','2','*','s'};
    return values[pos++];
*/}

// The loop function is called in an endless loop
void loop()
{
    CodeKraker ingevoerdeCode;
    int index = 0;      // positie binnen de 4 cijfers
    while(index != 4) {
       ingevoerdeCode.code[index] = leesToets();    // lees een toets
       index++;                          // verhoog index
    }
    CodeKraker goedecode1={{'4','5','6','B'}};
    CodeKraker goedecode2={{'1','2','*','#'}};
    if ((ingevoerdeCode.value==goedecode1.value)||(ingevoerdeCode.value==goedecode2.value))
    {
      //printf("goede code");
    }
    else
    {
        //printf("verkeerde code");
    }
}

Dit is echt een mooi voorbeeldje waarom de "debug je arduino code locaal" een heel goede feature is. Met vriendelijke groet Jantje

er moet nog wel een wis toets bij denk ik, want nu weet je nuet waar de teller staat, en zet sterretjes op scherm

Heren,

Bedankt voor jullie uitleg, maar ik ga toch maar voor Nico zijn oplossing. Die van Jantje begrijp ik nog niet helemaal :( Ik ga er dinsdagavond mee aan de slag, laat het wel even weten hoe het afloopt :D

@shooter, ik wil een timer laten mee lopen van 8sec. Als er dan niks op de keypad wordt ingedrukt moet alles weer op 0 gezet worden.

Marcel

ja dat is een goede oplossing.

Hoe wil je het eigenlijk gebruiken? Als ik een code inlezen denk (of meerdere codes), denk ik aan een finite state machine opbouwen. Dan heb je zelfs geen reset knop nodig, eens een juiste code is ingegeven zal je een signaal kunnen geven, onafhankelijk van of er ervoor nog andere knoppen geduwd geweest zijn :). Maar met een reset knop werken en dan gewoon de 4 knoppen die erna komen inlezen kan natuurlijk ook, en is makkelijker te programmeren. Maar moest je benieuwd zijn, kan je altijd eens opzoeken hoe ene zo'n state machine werkt: http://en.wikipedia.org/wiki/Finite-state_machine

racemaniac: Hoe wil je het eigenlijk gebruiken? Als ik een code inlezen denk (of meerdere codes), denk ik aan een finite state machine opbouwen. Dan heb je zelfs geen reset knop nodig, eens een juiste code is ingegeven zal je een signaal kunnen geven, onafhankelijk van of er ervoor nog andere knoppen geduwd geweest zijn :). Maar met een reset knop werken en dan gewoon de 4 knoppen die erna komen inlezen kan natuurlijk ook, en is makkelijker te programmeren. Maar moest je benieuwd zijn, kan je altijd eens opzoeken hoe ene zo'n state machine werkt: http://en.wikipedia.org/wiki/Finite-state_machine

En jij denkt dat iemand die al genoeg moeite heeft om dit voor mekaar te krijgen, begrijpt waar je naar verwijst..... Waar overigens niets mis mee is :grin:

nicoverduin: En jij denkt dat iemand die al genoeg moeite heeft om dit voor mekaar te krijgen, begrijpt waar je naar verwijst..... Waar overigens niets mis mee is :grin:

je kan maar bijleren hoop ik :). en 'k denk dat finite state machines vooral moeilijk klinken. het concept is best wel simpel.

Hallo heren,

Na een paar dagen ziek geweest te zijn ben ik weer verder gegaan, maar ik kom er nog niet helemaal uit.
Wat me al wel gelukt is, dat ik de 4 cijfers kan binnen halen en kan uitprinten met Serial.print.
Maar ik krijg er dan we 2 rare tekens achter, wat kan dit zijn?
Ik denk dat daarom ook het vergelijken van de pincodes niet goed meer gaat, want hij geeft telkens aan pincode fout.

Hier onder mijn code tot nu toe.

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

const int Buzzer = 35;  

char ourCode []= "1234";
int pinIndex= 0;
char Pin [4];


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

const byte ROWS = 4; 
const byte COLS = 4; 

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

byte rowPins[ROWS] = {
  30, 29, 28, 27};  // verbinding maken met de pin rij van het keypad.
byte colPins[COLS] = {
  26, 25, 24, 22};  // verbinding maken met de pen kolom van het keypad.

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

const int led_rood = 32;      
const int led_groen = 31;


void setup(){
  Serial.begin(9600);
  Serial.println(ourCode);
  lcd.begin(20,4);    // initialize the lcd for 20 chars 4 lines  
  lcd.backlight();    // LCD verlichting aan.

  pinMode(led_rood, OUTPUT);
  pinMode(led_groen, OUTPUT);

  Start_scherm(); 
}

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

    if (int(key) != 0)
    {
      tone(Buzzer, 1700, 100);    // Als er een toets van de keypad wordt ingedrukt, Buzzer: frequency 1700 en 0.1 sec lang.
      lcd.setCursor(0, 2);
      lcd.print("   ");
      Serial.println(" "); 
      Serial.print(key);
      Pin [pinIndex] = key;
      lcd.setCursor(0, 2);
      ++pinIndex;

      for (int L = 1; L <= pinIndex; ++L)
      {
        lcd.print("*");
      }
      if (pinIndex == 4)
      {
        if (Pin == ourCode)
        {
          Serial.println(" "); 
          Serial.println(" PINCODE JUIST ");
          Serial.println(Pin);
          pinIndex = 0;
          tone(Buzzer, 2500, 1500);
          digitalWrite(led_groen, HIGH);
          digitalWrite(led_rood, LOW);
          Pincode_Goed();                  // Ga naar functie: Pincode_Goed.     
        }

        else
        {
          Serial.println(" "); 
          Serial.println(" PINCODE ONJUIST ");
          Serial.println(Pin);
          pinIndex = 0;
          digitalWrite(led_rood, HIGH);
          digitalWrite(led_groen, LOW);
          Pincode_Fout();                  // Ga naar functie: Pincode_Fout.    
        }
      }
    }
  }
}

//****************************************************************************************************************************************//
//****************************************************************************************************************************************//

void Pincode_Fout()
{
  // ClearScreen.
  lcd.setCursor(0, 0);
  lcd.print("                    ");
  lcd.setCursor(0, 1);
  lcd.print("                    ");
  lcd.setCursor(0, 2);
  lcd.print("                    ");
  lcd.setCursor(0, 3);
  lcd.print("                    ");

  lcd.print("  PINCODE ONJUIST   ");
  lcd.setCursor(0, 2);
  lcd.print("      OPNIEUW       ");
  lcd.setCursor(0, 3);
  tone(Buzzer, 2500, 1500);
  delay(2000);
  digitalWrite(led_rood, LOW);
  Start_scherm(); 
}

//****************************************************************************************************************************************//
//****************************************************************************************************************************************//

void Pincode_Goed()
{
  // ClearScreen.
  lcd.setCursor(0, 0);
  lcd.print("                    ");
  lcd.setCursor(0, 1);
  lcd.print("                    ");
  lcd.setCursor(0, 2);
  lcd.print("                    ");
  lcd.setCursor(0, 3);
  lcd.print("                    ");

  lcd.setCursor(0, 1);
  lcd.print("   PINCODE JUIST    ");
  tone(Buzzer, 2500, 1500);
  delay(2000);
  digitalWrite(led_groen, LOW);
  Start_scherm(); 
}

//****************************************************************************************************************************************//
//****************************************************************************************************************************************//

void Start_scherm()
{
  lcd.setCursor(0, 0);
  lcd.print("                    ");
  lcd.setCursor(0, 1);
  lcd.print("                    ");
  lcd.setCursor(0, 2);
  lcd.print("                    ");
  lcd.setCursor(0, 3);
  lcd.print("                    ");
  lcd.setCursor(2, 3);
  lcd.print("Toets pincode in");
  digitalWrite(led_groen, LOW);

}

Marcel