keypad code uitlezen

Hoi,

Ik wil met een keypad een beveiligingscode intoetsen, deze controleren en vervolgens goed- of foutkeuren.
Met de Custom-keypad uit de keypad-library zit ik in elk geval al handig op weg om de cijfers weer te geven.

Het lijkt me dat ik een array moet vullen met bijv. 4 cijfers.
Zijn deze cijfers goed (hoe controleer ik dat?) volgt er een actie.

Maar ik snap het principe niet zo van een array en hoe daar mee om te gaan.

Of zou het handiger op een andere manier kunnen?

Hier de code uit de library:

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    Serial.println(customKey);
  }
}

Is het volgende (afgezien van de syntax) een idee?

if (customKey){
//zet deze key ergens (in een array?) en wacht op de volgende
}
if (array = in orde){
//maak de deur open o.i.d.
}

Groet,
Johan

Hallo en welkom op het nederlandse forum.
Ik snap niet zo goed warom je een array zou nodig hebben.
Kan je niet gewoon met getallen werken? code '1' '2' '3' '4' wordt dan gewoon getal 1234?

de loop wordt dan (veronderstellend dat je enkel cijfers indrukt

int geheimeCode=1234;
int code=0;
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    code=code*10+customKey-'0';
    if (code ==geheimeCode ) 
      {
        //open de deur
     }
   if (code >999) code=0;
  }
}

met vriendelijke groet
Jantje

Naar zo'n soort truc was ik idd op zoek.
Mijn gedachte was dat de 'int code' steeds weer opnieuw gevuld wordt, dus nooit de totaal ingetoetste code kan bevatten.
Maar door het *10 en minus het nulletje te doen, zou dat moeten kunnen. We gaan het proberen.

Nog even terugkomend op die array gedachte: Je kunt een array toch vullen met 'customKey'? Hoe werkt dat dan?
Ik snap wel hoe je bepaalde waarde uit een array haalt, maar hoe zet je een getal/letter op een bepaalde positie in de array?

Bedankt alvast voor de hulp.

Gr.
Johan

jmnijsse:
Nog even terugkomend op die array gedachte: Je kunt een array toch vullen met 'customKey'? Hoe werkt dat dan?
Ik snap wel hoe je bepaalde waarde uit een array haalt, maar hoe zet je een getal/letter op een bepaalde positie in de array?

Allereerst een opmerking. Het geheugen van een arduino is heel beperkt. Met een array (zeker een meer dimentionele) is het steeds opletten blazen.

C/C++ is een vrij rechtoe rechtaan taal. Alles heeft zijn "formulle" en als je die gebruikt dan maakt het eigenlijk niet meer uit waar je het gebruikt.
Wat ik bedoel is "als je weet hoe je een array moet uitlezen dan weet je ook hoe je er iets in moet steken".
VB 1 : is de volgende code compileerbaar

a=myArray[5];

Dan is de volgende het ook

myArray[5]=a;

VB 2: gehele getallen beginnen met 0. Dus C/C++ ook. Dit kan heel verwarrend zijn in het begin.

int myArray[2];

reserveert een array van 2 integers. Volgende code is dan juist

myArray[0]=1;
myArray[1]=2;

De volgende code is echter fout

myArray[2]=1;

want myArray[2] is de derde integer en je hebt er maar 2 voorzien.

Ik hoop dat het wat duidelijker is nu.

Met vriendelijke groet
Jantje

Beste Jantje,
Even je code geprobeerd, maar dat werkt nog niet.

int geheimeCode = 1234;
int code = 0;
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    code=code*10+customKey-'0';
    Serial.println(code);
  }
}

Ik was dus even bij het begin begonnen en had puur de code geprint. Nog zonder acties van als if code == geheimeCode etc.
Als ik nu 1 druk, komt er 1.
Druk ik daarna 2, komt er alleen 2. En niet 12. Hij vervangt die 1 gewoon door die 2. Lijkt me...

Maar hij moet 4 getallen in één 'ding' zetten en die getallen samen controleren.
Vandaar eigenlijk mijn gedachte met die array. Daarin kun je 4 getallen plaatsen en daarna (dacht ik dus) die 4 getallen als één getal uitlezen.

Whats wrong?

Gr.
Johan

Johan
Dan is er ergens iets mis. Die code werkt.
Ik heb dit programma gecompileerd en opgeladen

int code = 0;

void voeg_char_toe(char customKey)
{

	if (customKey)
	{
		code = code * 10 + customKey - '0';
		Serial.println(code);
	}
}

void setup()
{
	Serial.begin(115200);
	voeg_char_toe('1');
	voeg_char_toe('2');
	voeg_char_toe('3');
	voeg_char_toe('4');
	voeg_char_toe('5');

}

void loop()
{
}

en ik krijg dit in de serial monitor

1
12
123
1234
12345

Jantje

Ik gebruik de library Keypad.
Om het keypad uit te lezen stond in het voorbeeldbestand de functie getKey()

Zou het mogelijk zijn dat in de functie getKey() standaard een newline commando zit?

Ik zal eens een poging doen met een sketch zonder gebruik van deze library.

Gr.
Johan

Hmmm, nog steeds zelfde probleem.
Code uit het O'Reilly Cookbook gebruikt, zonder library.
Ik ga, zonder jouw expertise te onderschatten (de meesten hier zijn vele malen verder dan mij!), de vraag ook even op het algemene forum neerleggen.
Mogelijk krijg ik dan nieuwe inzichten.

Gr.
Johan

Opgelost:
int code stond op een of andere manier binnen de loop en moest globaal gedefinieerd worden.

Bedankt voor het meedenken...

Gr.
Johan

jmnijsse:
Opgelost:
int code stond op een of andere manier binnen de loop en moest globaal gedefinieerd worden.

Bedankt voor het meedenken...

Gr.
Johan

Hallo Johan,

Ik zit met ongeveer hetzelfde probleem. Zou je kunnen uitleggen wat je gedaan hebt om de int code uit de loop te halen en globaal te definieren?

groet

Ruud

@ruud

Je moet int code gewoon boven de setup() plaatsen, zodat deze voor heel de sketch te gebruiken is.
Als je 'm in de loop plaatst maakt ie 'm iedere loop weer aan.

Gr.
Johan