Codeslot met klavier RFID lezer en LCD

Arduino specifieke Software
Berichten: 32
Geregistreerd: 18 Jan 2017, 19:58

Codeslot met klavier RFID lezer en LCD

Berichtdoor DG300flyer » 18 Mei 2017, 12:53

Hallo Forumleden

Hier ben ik weer met een nieuw projectje waar blijkbaar een foutje in zit zodat het geheel niet werkt zoals het hoort.
In dit projectje kan je een RFID-kaart of Tag aanbieden om in het geheugen te plaatsen zodat deze kaart of Tag achteraf door het systeem herkent word en dan toegang geeft.

Het paren van een kaart of Tag werkt blijkbaar probleemloos maar als achteraf de kaart of Tag aanbied aan de RFIDlezer blijkt de kaart of Tag niet herkent te worden.
Het is de bedoeling dat de kaartof Tag gegevens in de EEPROM wordt weggeschreven maar ik vermoed dat dit niet gebeurt zodat deze kaart of Tag achteraf niet wordt herkent.
Is er iemand die me een tip kan geven aub !!

Hier de code van het geheel, volgens mij werkt alles ( het keypad werkt vlekkeloos ) behalve het wegschrijven in de EEPROM.

Op de Serial Monitor krijg ik deze gegevens :

CODE PAIRED
6118148114aux2
107
COD6118148114COD6118148114 en toch werkt het niet !
cpp code
// Gecompileerd met IDE 1.8.1

#include <SPI.h>

#include <MFRC522.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#include <Keypad.h>

#include<EEPROM.h>



int relPin;

int state=0;

byte COD[10];

byte AUX[10];

int k=0;

String accessCode="04091953";

String codpairing="*654321#";

//NFC

#define RST_PIN 9

#define SS_PIN 10

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance

#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}

MFRC522::MIFARE_Key key;



//LCD



LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);



//KEYPAD

const byte numRows= 4; //number of rows on the keypad

const byte numCols= 3; //number of columns on the keypad



char keymap[numRows][numCols]=

{

{'1', '2', '3'},

{'4', '5', '6'},

{'7', '8', '9'},

{'*', '0', '#'}

};



//Code that shows the the keypad connections to the arduino terminals

byte rowPins[numRows] = {2,3,4,5}; //Rows 0 to 3

byte colPins[numCols]= {A0,7,8}; //Columns 0 to 2




//initializes an instance of the Keypad class

Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);



void setup() {

pinMode(A0,OUTPUT);
digitalWrite(A0,HIGH);
pinMode(A3,OUTPUT);
digitalWrite(A3,HIGH);
pinMode(A1,OUTPUT);
digitalWrite(A1,HIGH);
pinMode(A2,OUTPUT);
digitalWrite(A2,LOW);

//NFC
Serial.begin(9600); // Initialize serial communications with the PC
while (!Serial); // Do nothing if no serial port is opened
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card



for (byte i = 0; i < 6; i++) {

key.keyByte[i] = 0xFF;

}

lcd.begin(16, 2);

lcd.backlight();

lcd.clear();

lcd.setCursor(4,0);

lcd.print( "LEES UW" );

lcd.setCursor(1,1);

lcd.print( "KAART-TAG-CODE" );

}



void readNFC(){ // This function will read the code stored on

for (byte i =0; i<(mfrc522.uid.size); i++) { // the UID

COD[i]=mfrc522.uid.uidByte[i];

}

Serial.print("COD");

Serial.print(COD[0]);

Serial.print(COD[1]);

Serial.print(COD[2]);

Serial.print(COD[3]);

}



void pairNFC(){

Serial.println("COD in pair");

Serial.print(COD[0]);

Serial.print(COD[1]);

Serial.print(COD[2]);

Serial.print(COD[3]);

long r=0;

int c=0;

for(int i=1;i<=EEPROM.read(0);i++){ //The UID cannot be stored on

switch(i%4){ // one variable, it was needed to be

case 1 :{AUX[0]=EEPROM.read(i); break;} // split

case 2 :{AUX[1]=EEPROM.read(i); break;}

case 3 :{AUX[2]=EEPROM.read(i); break;}

case 0 :{AUX[3]=EEPROM.read(i); break;}

}

if((i)%4==0)

{Serial.println(r);

if( AUX[0]==COD[0] && AUX[1]==COD[1] && AUX[2]==COD[2] && AUX[3]==COD[3] ){ //Verify if the code is in EEPROM

lcd.clear();

lcd.setCursor(0,0);

lcd.print("CODE BESTAAT AL!");

lcd.setCursor(0,1);

lcd.print("SYSTEEM");

delay(3000);

c=1;

break;}

}

}



if(c==0){int aux2=EEPROM.read(0);

Serial.println("CODE PAIRED");

Serial.print(COD[0]);

Serial.print(COD[1]);

Serial.print(COD[2]);

Serial.print(COD[3]);



EEPROM.write(aux2+1,COD[0]); //Writing code in EEPROM

EEPROM.write(aux2+2,COD[1]);

EEPROM.write(aux2+3,COD[2]);

EEPROM.write(aux2+4,COD[3]);



aux2=aux2+4; // Position for a new code

Serial.println("aux2");

Serial.println(aux2);

EEPROM.write(0,0);

EEPROM.write(0,aux2);

lcd.clear();

lcd.setCursor(1,0);

lcd.print("SYNCRONISERING");

lcd.setCursor(6,1);

lcd.print("OK");

delay(2000);}

}



boolean validationNFC(){

boolean c=false;

for(int i=1;i<=EEPROM.read(0);i++){ //Read the EEPROM

switch(i%4){

case 1 :{AUX[0]=EEPROM.read(i); break;}

case 2 :{AUX[1]=EEPROM.read(i); break;}

case 3 :{AUX[2]=EEPROM.read(i); break;}

case 0 :{AUX[3]=EEPROM.read(i); break;}

}

if((i)%4==0)

{

if( AUX[0]==COD[0] && AUX[1]==COD[1] && AUX[2]==COD[2] &&

AUX[3]==COD[3])

c=true; //Verify if the code is in EEPROM and make flag=true;

}

}

return c;

}



int compareCODE(String a) //We type a code on keypad and this will be compared

{ //with the accessCode;

if(a.equals(accessCode))

return 1;

else if(a.equals(codpairing)) return 2;

else return 0;

}



String takeCode(char x) //Will display on the LCD the code typed

{ char vec[10];

vec[0]=x;

lcd.setCursor(0,0);

lcd.clear();

lcd.print('X');

for(int i=1;i<8;i++)

{vec[i]=myKeypad.waitForKey(); //Waits for 8 keys to be pressed and after that

lcd.print('X');} //is taking the decision

vec[8]=NULL;

String str(vec);

return str;

}



void loop() {



switch(state){

case 0: {

mfrc522.PCD_Init();

if ( mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ){



readNFC(); //It will read the card and it will search for UID in its

if(validationNFC()) //memory

{ state=1;

lcd.clear();

lcd.setCursor(0,0);

lcd.print( " RFID CODE OK" ); //The door will be opened

delay(1000);

return;

}

else{

lcd.clear();

lcd.setCursor(1,0);

lcd.print( "VERKEERDE CODE" ); //If the code was wrongblocked

delay(2000);

lcd.clear();


lcd.setCursor(4,0);

lcd.print( "LEES UW" );

lcd.setCursor(1,1);

lcd.print( "KAART-TAG-CODE" );

return;

}

}



char c=myKeypad.getKey();

if(c != NO_KEY){



String codcurent=takeCode(c);

int A=compareCODE(codcurent);

if(A==0){ //A is a variable that stores the current code

lcd.clear();

lcd.setCursor(1,0);

lcd.print("VERKEERDE CODE");

lcd.setCursor(1,1);

lcd.print("PROBEER OPNIEUW");

delay(4000);

lcd.clear();

lcd.setCursor(4,0);

lcd.print( "LEES UW" );

lcd.setCursor(1,1);

lcd.print( "KAART-TAG-CODE" );

return;

}

if(A==1){

lcd.clear();

lcd.setCursor(1,0);

//lcd.clear();

lcd.print( "CORRECTE CODE" );

delay(1000);

state = 1;

return;

}

if(A==2); {

state=2;

lcd.clear();

lcd.setCursor(0,0);

lcd.print( " SYNCRONISERING" );

lcd.setCursor(1,1);

lcd.print( "KAART-TAG-CODE" );

delay(2000);

return;}

}

break;

}



case 1:{

lcd.clear();

lcd.setCursor(1,0);

lcd.print( "CORRECTE CODE" );

lcd.setCursor(6,1);

lcd.print( "OPEN" );

digitalWrite(A3,LOW);

digitalWrite(A1,LOW); //The red LED will be off

digitalWrite(A2,HIGH); //The green LED will be on

tone(6,3000,2000); //The buzzer will make a sound for 2 seconds

delay(2000); //After 2 seconds the system will be blocked

digitalWrite(A3,HIGH);

digitalWrite(A1,HIGH);

digitalWrite(A2,LOW);

state=0;

lcd.clear();

lcd.setCursor(4,0);

lcd.print( "LEES UW" );

lcd.setCursor(1,1);

lcd.print( "KAART-TAG-CODE" );

return;

}



case 2:{

mfrc522.PCD_Init();

if ( mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ){

readNFC();

pairNFC();

state=0;

delay(1000);

lcd.clear();

lcd.setCursor(4,0);

lcd.print( "LEES UW" );

lcd.setCursor(2,1);

lcd.print( "KAART - CODE" );}



break;

}

}

}

Advertisement

Berichten: 32
Geregistreerd: 18 Jan 2017, 19:58

Re: Slot met codeklavier - RFID lezer en LCD

Berichtdoor DG300flyer » 18 Mei 2017, 15:13

Hallo iedereen,

Nu heb ik een kleine aanpassing in de code doorgevoerd en nu kan ik wel een kaart in het EEPROM inlezen en bij het aanbieden van die kaart opent het slot zoals het hoort maar nu kan ik maar 1 kaart in het geheugen inbrengen, wanneer ik een volgende kaart in het geheugen inlees dan verdwijnt de eerste uit het geheugen.
Heeft iemand een idee hoe ik de code moet aanpassen zodat ik alsnog meerdere kaarten in het geheugen kan inbrengen zodat het slot kan bediend worden met meerdere kaarten ?

Alex

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Codeslot met klavier RFID lezer en LCD

Berichtdoor baco1978 » 18 Mei 2017, 16:09

Hey Alex, dat is heel fijn om te horen dat het je in ieder geval gelukt is om 1 kaart kan opslaan.

op dit moment gebruik je een paar vaste lokaties in je eeprom,

wil je meerdere opslaan, dan zal je daar meerdere lokaties voor moeten gebruiken.

nu gebruik je :

EEPROM.write(aux2+1,COD[0]); //Writing code in EEPROM
EEPROM.write(aux2+2,COD[1]);
EEPROM.write(aux2+3,COD[2]);
EEPROM.write(aux2+4,COD[3]);

en volgens mij is het dan de bedoeling om aux.. variabel te maken
en dat is het in dit geval nog niet.

hopelijk kan je hier wat mee
Met vriendelijke groet Arjan

Berichten: 32
Geregistreerd: 18 Jan 2017, 19:58

Re: Codeslot met klavier RFID lezer en LCD

Berichtdoor DG300flyer » 18 Mei 2017, 17:58

Hallo Arjan,

Bedankt voor uw snelle reactie, ik ben vrij nieuw in de Arduinowereld en heb al wel een paar projectjes met succes gemaakt maar het probleem is dat ik de taal C++ niet ken en dus niet versta wat er geschreven staat, dit maakt het voor mij ook uitermate moeilijk om juist te weten wat ik moet doen of veranderen.
Weet dat het script niet van mij is maar ik heb het van het internet geplukt, bij het demofilmpje dat erbij hoorde bleek alles wel te werken maar ik loop tegen het probleem aan dat ik niet meerdere kaarten in het geheugen kan stoppen ,in het originele script vind je dit stukje over het wegschrijven van een kaartcode in de EEPROM en dat werkt bij mij totaal niet :

SVP code tussen de code tags [ code2=cpp ] en[ /code2 ] (zonder spaties) zetten mvgr. moderator

cpp code
if(c==0){int aux2=EEPROM.read(0);

Serial.println("CODE PAIRED");

Serial.print(COD[0]);

Serial.print(COD[1]);

Serial.print(COD[2]);

Serial.print(COD[3]);



EEPROM.write(aux2+1,COD[0]); //Writing code in EEPROM

EEPROM.write(aux2+2,COD[1]);

EEPROM.write(aux2+3,COD[2]);

EEPROM.write(aux2+4,COD[3]);



aux2=aux2+4; // Position for a new code

Serial.println("aux2");

enz.enz.


Toen heb ik het script aangepast en er het volgende van gemaakt op goed geluk :

EEPROM.write(1,COD[0]); //Writing code in EEPROM

EEPROM.write(2,COD[1]);

EEPROM.write(3,COD[2]);

EEPROM.write(4,COD[3]);

En wat blijkt dat het syteem nu de kaart die ik aanbied wel herkent maar als ik een tweede kaart tracht te paren met het systeem de eerste kaart uit het geheugen wordt gegooid en vervangen door de laatste kaart die ik aanbood om te paren.
Het zou de bedoeling moeten zijn dat ik meerdere kaarten in het geheugen kan laden en dat het syteem die ook alzo herkent.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Codeslot met klavier RFID lezer en LCD

Berichtdoor Koepel » 18 Mei 2017, 21:39

Beschrijf eerst eens de gegevens van de EEPROM. Hoe is het opgebouwd ?
Wat gebeurt er wanneer je een nieuwe Arduino pakt, en in lokatie 0 staat 0xFF (of een ander getal) ?

Kun je een link geven naar waar je die code hebt gevonden ? Ik heb de indruk dat die code al vreemd in elkaar zit.

Berichten: 32
Geregistreerd: 18 Jan 2017, 19:58

Re: Codeslot met klavier RFID lezer en LCD

Berichtdoor DG300flyer » 19 Mei 2017, 12:14

Hallo Koepel ,

Ja hier ben ik alweer met mijn problemen.

http://www.deviceplus.com/how-tos/ardui ... door-lock/

is de link waar ik de code vandaan haalde zoals je weet is mijn kennis niet groot dus ik experimenteer wat , hoe de inhoud van de EEPROM is opgebouwd weet ik al helemaal niet want ik weet niet hoe een EEPROM de aangeboden gegevens plaatst of leest.

Ik heb nog geen ander Arduinoboardje gebruikt maar dat zal ik eens proberen om te kijken of dit een ander resultaat geeft .
Ik heb een Nano gebruikt met een 368 processor en volgens de resultaten van de schets zou er voldoende geheugen op de Nano voorhanden zijn.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Codeslot met klavier RFID lezer en LCD

Berichtdoor Koepel » 19 Mei 2017, 19:17

Dat artikel in die link is van 2016, maar er bestond toen al een betere manier om het EEPROM te gebruiken met meerdere bytes tegelijk (.put en .get). Die code vind ik met name voor het EEPROM gebruik niet zo mooi gemaakt.
Het lijkt er op dat je van ons vraagt om voor jouw de code te schrijven. Dit forum is er echter voor bedoeld om jouw te vertellen hoe je zelf er iets van kunt maken.
Je kunt beginnen met https://www.arduino.cc/en/Reference/EEPROM en te bedenken hoe je het wilt opslaan, of in die bestaande sketch te kijken hoe die het opslaat.

Berichten: 32
Geregistreerd: 18 Jan 2017, 19:58

Re: Codeslot met klavier RFID lezer en LCD

Berichtdoor DG300flyer » 21 Mei 2017, 12:48

Dag Koepel ,

Ik zou heel graag zelf het probleem oplossen , het is zeker niet mijn bedoeling dat iemand voor mij een code uitschrijft maar enige ondersteuning vind ik ook niet te versmaden, dus moest je me een tip kunnen geven waar ik tot een mogelijke oplossing zou kunnen komen zou ik dat heel knap vinden.
Groeten
Alex

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Codeslot met klavier RFID lezer en LCD

Berichtdoor Koepel » 21 Mei 2017, 17:56

Volgens mij heeft die code dit:
Op positie 0 in het EEPROM één byte, dat het aantal in de lijst aangeeft.
Daarna op positie 1...4 de eerste gegevens, op positie 5...8 de tweede enzovoorts.

Je kunt ook de gegevens op 0...3 zetten, de tweede op 4...7 en de lijst afsluiten met vier 0xFF.

In beide gevallen is er iets nodig om de lijst leeg te maken. Dat heb ik zo snel niet in de code gezien.

Welke van de bovenstaande manieren voor de lijst spreekt je het meeste aan ?

Berichten: 32
Geregistreerd: 18 Jan 2017, 19:58

Re: Codeslot met klavier RFID lezer en LCD

Berichtdoor DG300flyer » 22 Mei 2017, 17:27

Hallo Koepel ,
Bedankt voor de tip ,
Ik ga het eens proberen met de eerste mogelijkheid die jij voorstelt ( Op positie 0 in het EEPROM één byte, dat het aantal in de lijst aangeeft.Daarna op positie 1...4 de eerste gegevens, op positie 5...8 de tweede enzovoorts. )

Je leest ervan !
Dank u
Alex

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten