[OPGELOST] Arduino RFID vraagje

Hey,

Ik ben bezig met een project waarvoor ik een RFID gebruik.
Zie meer hierover in dit filmpje: - YouTube
De code in dit filmpje is de code die in gebruik, en op het moment dat ik een pasje scan of iets dergelijks zie je veel informatie maar vooral belangrijk een 'Card UID: ....'
Nu vraag ik me af hoe ik in die code het zo kan krijgen dat bij een bepaald Card UID er iets gebeurt, een if-statement dus. Maar hoe krijg ik het zo dat die if-statement runt bij die Card UID..?

(Hij gebruikt deze libraries:
#include <SPI.h>
#include <MFRC522.h>)

Zie bijlage voor code en screenshot hoe het er in de Serial console uit ziet.

Alvast bedankt.

RFID_code_lezer_alleen.ino (2.13 KB)

Schermafbeelding 2016-12-02 om 16.38.25.png

RFID-Cloner.ino (10.1 KB)

Met een gewoon if statement kom je er niet mee weg. Er is als het goed is in de library een voorbeeld om de Uid te veranderen. dit is de sketch:

/*
 * --------------------------------------------------------------------------------------------------------------------
 * Example to change UID of changeable MIFARE card.
 * --------------------------------------------------------------------------------------------------------------------
 * This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
 * 
 * This sample shows how to set the UID on a UID changeable MIFARE card.
 * NOTE: for more informations read the README.rst
 * 
 * @author Tom Clement
 * @license Released into the public domain.
 *
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 */

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN   9     // Configurable, see typical pin layout above
#define SS_PIN    10    // Configurable, see typical pin layout above

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

/* Set your new UID here! */
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}

MFRC522::MIFARE_Key key;

void setup() {
  Serial.begin(9600);  // Initialize serial communications with the PC
  while (!Serial);     // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();         // Init SPI bus
  mfrc522.PCD_Init();  // Init MFRC522 card
  Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!"));
  
  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
}

// Setting the UID can be as simple as this:
//void loop() {
//  byte newUid[] = NEW_UID;
//  if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
//    Serial.println("Wrote new UID to card.");
//  }
//  delay(1000);
//}

// But of course this is a more proper approach
void loop() {
  
  // Look for new cards, and select one if present
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    delay(50);
    return;
  }
  
  // Now a card is selected. The UID and SAK is in mfrc522.uid.
  
  // Dump UID
  Serial.print(F("Card UID:"));
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  } 
  Serial.println();

  // Dump PICC type
//  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
//  Serial.print(F("PICC type: "));
//  Serial.print(mfrc522.PICC_GetTypeName(piccType));
//  Serial.print(F(" (SAK "));
//  Serial.print(mfrc522.uid.sak);
//  Serial.print(")\r\n");
//  if (  piccType != MFRC522::PICC_TYPE_MIFARE_MINI 
//    &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
//    &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
//    Serial.println(F("This sample only works with MIFARE Classic cards."));
//    return;
//  }
  
  // Set new UID
  byte newUid[] = NEW_UID;
  if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
    Serial.println(F("Wrote new UID to card."));
  }
  
  // Halt PICC and re-select it so DumpToSerial doesn't get confused
  mfrc522.PICC_HaltA();
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    return;
  }
  
  // Dump the new memory contents
  Serial.println(F("New UID and contents:"));
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
  
  delay(2000);
}

Daarvan is dus dit stukje code van belang

// Dump UID
  Serial.print(F("Card UID:"));
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  } 
  Serial.println();

Dit print de Uid uit. Je zult dus een array moeten maken waarin de Uid staat die je wilt testen. Dan een boolean vooraf zetten op bijv.

boolean gevonden = true;

Dan vergelijk je de gelezen Uid met de Uid die je in het geheugen hebt en zodra er een byte een verschil heeft zet je gevonden op false en doe je een break; verder zoeken in de loop is weinig zinvol omdat hij toch al ongelijk is.

Harstikke bedankt Nico, maar bedoel je nu dat ik de UID van zo'n chip/pasje overwrite met een nieuwe?

Want ik bedoel gewoon dat bij een bepaald UID die ik eerder in mijn serial monitor heb afgelezen dat er dan bijvoorbeeld een lampje gaat branden, niet dat ik het UID verander van zo'n chip of iets.

Sorry als je het wel zo hebt gedaan, ben nog beginner.

goeiedag.

van vele RFID Chip/pasjes kan je de UID helemaal niet! veranderen.

ik heb ook ooit een projectje gemaakt met deze library.
maar in deze variable/array

mfrc522.uid.uidByte[i]

staat dus de UID van de tag die hij heeft gelezen.

en je kan dus UID vergelijken met de UID die jij in je code hebt staan. (hard coded)
of zo als ik heb gedaan is om de UID op teslaan in de EEPROM, doormiddel van een "Learn Mode"
zo dat als de Arduino stroom verliest alle UID's in de EEPROM staan opgeslagen.

Het voorbeeld was niet om aan te geven hoe je hem moest veranderen maar hoe je hem moet lezen om daarna te vergelijken.

Ohh maar kijk ik bedoel het heel simpel.

  1. Ik scan zo'n pasje en ik krijg in mijn Serial het UID te zien.
  2. Deze UID wil ik nu gaan gebruiken als in een if-statement.
  3. Ongeveer zo, 'if (cardUID = 8DENFQ) {
    digitalWrite(lampje, HIGH);
    }
    Maar mijn punt is nu dat dat 'cardUID = ....' natuurlijk helemaal niet zo werkt, maar hoe kan ik het dan toch zo krijgen dat het wel werkt bij bepaalde pasjes zeg maar.

Je kan het wel willen maar dat wil nog niet zeggen dat het zo gaat gebeuren. Ik weet niet uit hoeveel cijfers het nummer bestaat, maar een int32 getal gaat niet verder dan 10 cijfers decimaal en 8 cijfers in hex. In het voorbeeld staat hoe je een uid kan printen. Als je dat doet weet je hoe groot die is.
Ik heb je ook een voorbeeld gegeven om te toetsen of de UID gelijk is aan een opgeslagen UID. De uitkomst is de boolean. Die kan je gebruiken in een if statement.
Als dit nog een brug te ver is, zou het zomaar eens kunnen dat je nog niet voldoende kennis en ervaring hebt om dit project te moeten uitvoer en zou je kunnen overwegen een stapje terug te doen en eerst meer ervaring op te doen.
'Dus je hebt het basis materiaal bovenstaand. Nu is het jouw beurt.

Oke bedankt Nico, maar ik heb nog een vraagje, want in dat voorbeeld met 'ChangeUID', in die code staat toch :

byte newUid[] = NEW_UID;
  if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
    Serial.println(F("Wrote new UID to card."));

Bedoelen ze daar niet mee dat ze dan een nieuwe UID op de card hebben gezet?

Maar ik ben nog niet echt de slimste met Bytes, maar als ik dus een pasje hebt en ik wil daarvan de Card UID zo hebben dat de code hem herkent moet ik heb ongeveer zo doen.

byte HerkanNaam1 = ...

Ik had zoiets ook nog op internet gevonden:

if(str[0] == 56)

Ik snap dat er echt niks van klopt, maar ik snap dit gedeelte niet hoe ik het zo in mijn code kan opslaan, ja misschien is het iets te moeilijk maar ik zou het wel echt willen weten..

Oke Nico, mede dankzij je tips ben ik hier nu gekomen, kun je me vertellen of dit klopt en of het gaat werken?
Kun je me ook vertellen of het met het 'Dumpen' ook goed gaat.

byte Bram[] = {0xEE,0x29,0x43,0x14};   //Pasje Henk
byte Henk[] = {0xF6, 0x9D, 0xF7, 0x30}; // Blauwe Tag
int successRead;      

byte dummy = 0x00;

byte readCard[4];  

..............

  while (!successRead);    //Communicatie met kaart
  
  if (readCard[0] == Bram[0] && readCard[1] == Bram[1] 
  && readCard[2] == Bram[2] && readCard[3] == Bram[3])              //checking for blue card
  {   
   
    Serial.println("Welkom Bram");
    
   SuccesBram();
   
   for(int i = 0; i<4; i++) dummy = readCard[i];   // removing previous stored value from the readCard variable
   
   successRead = 0;

Ik heb nu meerdere if statements met de verschillende bytes, ik heb nu niet de initaliazes en de setup in de code gedaan, maar het gaat even om dit gedeelte?
Klopt dit zo :D?

Weet ik ik niet. Dat ga jij beantwoorden.... Ik vind nu eenmaal dat men veel meer eerst zelf moet proberen dan weer aan een ander vragen of iets werkt..... Je kan niets stuk maken. Dus wat houdt je tegen om ons te vertellen dat het werkt?
Initiatief.... en zo....ontdekken.....

nicoverduin:
Weet ik ik niet. Dat ga jij beantwoorden.... Ik vind nu eenmaal dat men veel meer eerst zelf moet proberen dan weer aan een ander vragen of iets werkt..... Je kan niets stuk maken. Dus wat houdt je tegen om ons te vertellen dat het werkt?
Initiatief.... en zo....ontdekken.....

@akatchi
Dat is de geest van dit forum. Geef de mensen een vis en ze hebben eten voor 1 dag, leer de mensen vissen en ze hebben eten voor de rest van hun leven.
Wil je gewoon een oplossing dan moet je maar iemand zoeken die het voor je doet tegen betaling.

De moderator
Jantje

Jantje:
@akatchi
Dat is de geest van dit forum. Geef de mensen een vis en ze hebben eten voor 1 dag, leer de mensen vissen en ze hebben eten voor de rest van hun leven.
Wil je gewoon een oplossing dan moet je maar iemand zoeken die het voor je doet tegen betaling.

De moderator
Jantje

Lol, een forum is er toch gewoon om vragen te stellen, als je ze niet wilt beantwoorden dan hoeft dat niet hoor...

Heb je het al geprobeerd dan ?

Gewoon die code die je nu hebt naar je Arduino, shields en zo er aan en kijken wat er gebeurt.
Als je niet kunt bijhouden wat er gebeurt, bouw je een paar delay()s in op strategische plaatsen.
Voor debugging kan dat helpen.
Net zoals de seriële verbinding en / of een display je kunnen helpen.

Echt daar leer je pas serieus van.

Jahoor hij werkte, maar ik kan pas om de zoveel dagen hij die scanner omdat ik het niet hier thuis heb :)!
Maar het werkte prima, nu loop ik weer tegen een nieuwe probleem aan; het clonen van een tag.
Wordt nog wat haha.

We horen wel wanneer je het opgelost hebt...

Dankjewel Nico! :smiley:

Oke ik kom er niet echt uit, ook niet met google. Ik probeer nu een pasje te clonen met de RFID waarmee ik bijvoorbeeld een kluisje kan openen, ik probeer hem te clonen, maar daarvoor moet ik eerst in de RFID-cloner (niet zelf gemaakt, staat bij voorbeelden) hard-coden de data op het pasje.

Dit is het stukje in de code waar ik vast loop:

// Number of known default keys (hard-coded)
// NOTE: Synchronize the NR_KNOWN_KEYS define with the defaultKeys[] array
#define NR_KNOWN_KEYS   8
// Known keys, see: https://code.google.com/p/mfcuk/wiki/MifareClassicDefaultKeys
byte knownKeys[NR_KNOWN_KEYS][MFRC522::MF_KEY_SIZE] =  {
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // FF FF FF FF FF FF = factory default
    {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5}, // A0 A1 A2 A3 A4 A5
    {0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5}, // B0 B1 B2 B3 B4 B5
    {0x4d, 0x3a, 0x99, 0xc3, 0x51, 0xdd}, // 4D 3A 99 C3 51 DD
    {0x1a, 0x98, 0x2c, 0x7e, 0x45, 0x9a}, // 1A 98 2C 7E 45 9A
    {0xd3, 0xf7, 0xd3, 0xf7, 0xd3, 0xf7}, // D3 F7 D3 F7 D3 F7
    {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, // AA BB CC DD EE FF
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}  // 00 00 00 00 00 00

Ik moet hier dus die data invullen maar ik snap niet waar ik dat kan uitlezen.

Hier de data van het pasje:

ScCC to see UID and type...
Scan PICC to see UID and type...
Card UID: 7A 6F BA 56
Card SAK: 08
PICC type: MIFARE 1KB
Sector Block   0  1  2  3   4  5  6  7   8  9 10 11  12 13 14 15  AccessBits
  15     63   00 00 00 00  00 00 FF 07  80 BC FF FF  FF FF FF FF  [ 0 0 1 ] 
         62   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         61   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         60   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  14     59   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         58   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         57   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         56   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  13     55   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         54   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         53   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         52   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  12     51   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         50   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         49   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         48   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  11     47   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         46   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         45   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         44   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
  10     43   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         42   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         41   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         40   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   9     39   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         38   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         37   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         36   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   8     35   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         34   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         33   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         32   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   7     31   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         30   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         29   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         28   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   6     27   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         26   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         25   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         24   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   5     23   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         22   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         21   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         20   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   4     19   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         18   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         17   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         16   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   3     15   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         14   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         13   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
         12   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   2     11   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
         10   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
          9   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
          8   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   1      7   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
          6   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
          5   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
          4   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
   0      3   00 00 00 00  00 00 FF 07  80 69 FF FF  FF FF FF FF  [ 0 0 1 ] 
          2   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
          1   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  [ 0 0 0 ] 
          0   7A 6F BA 56  D6 88 04 00  C0 8E 5A 10  65 50 38 14  [ 0 0 0 ]

Volledige sketch zal ik attachen in de originele post, misschien zit ik er wel helemaal naast en werkt het zo niet.

Geen idee.... Ik doe verder niets met dit soort kaarten.....

Oke snap ik jammer, overal waar ik het vraag zeggen mensen hetzelfde dat ze er niks mee doen. Maar kan het nergens vinden haha.

Ik zie ook het nut niet zo in van klonen...... Een professioneel bedrijf koopt daarvoor de benodigde apparatuur. Dus waarom zou je er energie in steken. Om te hacken? Moet je niet bij mij zijn.