Помогите с замком RFID

b707
Offline
Зарегистрирован: 26.05.2017

homejk - если реально захотите разобраться, как работает доступ к данным карт Мифаре - могу помочь. Только уговор - учиться будете сами, я готовый рецептов не даю.

Для начала почитайте вот эту ветку - как выставлять биты доступа и закрывать данные на карте. чтобы их нельзя было прочитать без пароля:

https://www.mifare.net/support/forum/topic/what-is-mifare-classic-1k-access-bits-means-how-to-calculate-and-use-it/

homejk
homejk аватар
Offline
Зарегистрирован: 08.04.2015

«Мы два разных человека, правда :)» - и правда весело, нет спасибо читал на Хабре если не ошибаюсь эмуляция защищенных карт mifare сейчас не проблема а соответственно это пустая трата времени

b707
Offline
Зарегистрирован: 26.05.2017

Похоже, мозгов не хватило понять текст по ссылке. В 2015м все, на что хватило умений - вставить в стандартный пример библиотеки две строчки со своим UID - вот и весь твой "замок". А  за 6 лет ничего больше и не освоил.

Сам ты можешь пользоваться любым дырявым скетчем - только нафига людям врать, что это "замок", когда по факту это шпингалет из туалета...

homejk
homejk аватар
Offline
Зарегистрирован: 08.04.2015

а все таки хорошие мои «две строчки кода» если Вы мониторите эту тему годами и ждете когда кто-то внидрить шифрования.  Успехов вам и учитесь культурно общаться на создании аккаунтов и отсылки в википедию далеко не заедете) 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Гивер перелогинься.
Или таких дуболомов в природе несколько ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

homejk пишет:

 зачем меняете аккаунт никто вас ни к чему не принуждает  научитесь признавать ошибки )

Это что сейчас было?

homejk, Вы, собственно, к кому обращаетесь?

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Гивер перелогинься. Или таких дуболомов в природе несколько ?

да их тыщи... Напишут две строчки гавнокода и тащат в инет "вдруг кому-то будет полезно" :)

Генрих
Offline
Зарегистрирован: 17.03.2021

Друзья, доброго времени суток. Нашел в инете интересный замок на модуле RС522. Он на основе мастер карты (первая считанная становится оной). Очень хочется его повторить, но знаний не хватает. Толи устарел он толя я еще не готов в кишках на столько ковыряться (что скорее всего), тем не менее, хочу вас не ругаться на меня и по возможности, помочь, подсказать что не так. Во-первых, я таким образом, благодаря тому, что ветки и обращаясь внимательно к ссылкам, которые вы рекомендуете, учусь с огромным интересом плюс хочу реализовать его на калитку обычную, детям на радость). Поможете, огромный плюс в карму, можно и донатах поговорить. Это же ваш труд и мне учеба ... Не поймите превратно)


Генрих
Offline
Зарегистрирован: 17.03.2021

На i2c даже не смог переориентировать я. Помогите, вы добрые, я знаю

Генрих
Offline
Зарегистрирован: 17.03.2021
homejk
homejk аватар
Offline
Зарегистрирован: 08.04.2015

существует такой Дмитрий Осипов он делал несколько таких проектов https://youtu.be/a583vq0vXyg

Генрих
Offline
Зарегистрирован: 17.03.2021

Он большой молодец. код его и есть

Генрих
Offline
Зарегистрирован: 17.03.2021

а нет  смотрю. Хорошая инфо

b707
Offline
Зарегистрирован: 26.05.2017

Генрих пишет:

На i2c даже не смог переориентировать я. Помогите, вы добрые, я знаю

что именно не смогли переориентировать на I2c ? - если RFID считыватель,то далеко не каждый переделывается

Генрих
Offline
Зарегистрирован: 17.03.2021

Монитор. Он обычно подключен в коде Колдовал, адрес поставил, библиотеку. Светится но не пишет ничего. Зато ионитор порта показывает исправно

b707
Offline
Зарегистрирован: 26.05.2017

Генрих, код у вас интересный

логическое isMaster (byte test []) {
  если (checkTwo (тест, masterCard))
    вернуть истину;
  еще
    вернуть ложь;
}

вы его гугл-транслейтом пытались перевести. что ли? - это плохо сказывается на работе :)

Ищите оригинал на английском, этот работать не будет

Генрих
Offline
Зарегистрирован: 17.03.2021

Сам перевелся когда вставлял сюда

homejk
homejk аватар
Offline
Зарегистрирован: 08.04.2015

чувак талантливый Дмитрий Осипов но походу он ушел в нирвану ... жаль его (

Генрих
Offline
Зарегистрирован: 17.03.2021
/*------------------------------------------
  RFID CARD READER 
  By https://nonstopengineering.blogspot.com/
  Using Arduino,RFID-RC522 and LCD 16x23
  ------------------------------------------*/

#include <EEPROM.h>  //Library To read and write PICC's UIDs from/to EEPROM
#include <SPI.h>      //Library  RC522 Module uses SPI protocol
#include <MFRC522.h> //Library  RC522 Module
#include <LiquidCrystal.h> //Library  for LCD Display

boolean match = false; // initialize card match to false
boolean programMode = false; // initialize programming mode to false
int successRead; // Variable integer to keep if we have Successful Read from Reader
byte storedCard[4];   // Stores an ID read from EEPROM
byte readCard[4];           // Stores scanned ID read from RFID Module
byte masterCard[4]; // Stores master card's ID read from EEPROM
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Initializing LCD PINS as (RS,EN,D4,D5,D6,D7)
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);  // Initialize serial communications with PC
  lcd.begin(16, 2);    //Initializing LCD 16x2
  pinMode(8, OUTPUT);  //LED and Buzzer PIN OUT
  SPI.begin();           // MFRC522 Hardware uses SPI protocol
  mfrc522.PCD_Init();    // Initialize MFRC522 Hardware
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
  if (EEPROM.read(1) != 1) {  // Look EEPROM if Master Card defined, EEPROM address 1 holds if defined
    Serial.println("No Master Card Defined"); //When no Master Card in Your EEROM (Serial Display)
    Serial.println("Scan A PICC to Define as Master Card");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.println("SET MASTERCARD   "); //When no Master Card in Your EEROM (LCD Display)
    lcd.setCursor(0, 1);
    lcd.println("SCAN A PICC....."); //Scan any RFID CARD to set Your Master Card in Your EEROM (LCD Display)
    delay(1500);
    do {
      successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
    }
    while (!successRead); //the program will not go further while you not get a successful read
    for ( int j = 0; j < 4; j++ ) { // Loop 4 times
      EEPROM.write( 2 + j, readCard[j] ); // Write scanned PICC's UID to EEPROM, start from address 3
    }
    EEPROM.write(1, 1); //Write to EEPROM we defined Master Card.
    Serial.println("Master Card Defined");
    
  }
  Serial.println("Master Card's UID");
  for ( int i = 0; i < 4; i++ ) {     // Read Master Card's UID from EEPROM
    masterCard[i] = EEPROM.read(2 + i); // Write it to masterCard
    Serial.print(masterCard[i], HEX); //Master Card only view in serial
     Serial.println("Waiting PICCs to bo scanned :)"); 
  }
  //WAITING TO SCAN THE RFID CARDS:
  Serial.println("");
  Serial.println("Waiting PICCs to bo scanned :)");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.println("WAITING         ");
  lcd.setCursor(0, 1);
  lcd.println("FOR PICC....     ");
  delay(1500);
}
void loop() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("      SWIPE");
  lcd.setCursor(0, 1);
  lcd.print("    YOUR CARD");

 /* 
 if (digitalRead(BUTTON) == HIGH);                     //To Delete the EEROM USE the below command just run it
  {
  // for (int i = 0 ; i < EEPROM.length() ; i++) {
  // EEPROM.write(i, 0);
  // }
  // }                                     */
  do {
    successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
    if (programMode) {
      // Program Mode cycles through RGB waiting to read a new card
    }
    else {
   }}
  while (!successRead); //the program will not go further while you not get a successful read
  if (programMode) {
    if ( isMaster(readCard) ) {  //If master card scanned again exit program mode
      Serial.println("This is Master Card");
      Serial.println("Exiting Program Mode");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("EXITING FROM");
      lcd.setCursor(0, 1);
      lcd.print("MASTERCARD MODE");
      delay(2000);
      programMode = false;
      return;
    }
    else {
      if ( findID(readCard) ) { //If scanned card is known delete it
        Serial.println("I know this PICC, so removing");
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("AVAILABLE!");
        lcd.setCursor(0, 1);
        lcd.print("SO DELETING.....");
        delay(5000);
        deleteID(readCard);
        Serial.println("-----------------------------");
      }
      else {                    // If scanned card is not known add it
        Serial.println("I do not know this PICC, adding...");
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Card no:");
        lcd.setCursor(0, 1);
        lcd.print(readCard[0], HEX);
        lcd.print(readCard[1], HEX);
        lcd.print(readCard[2], HEX);
        lcd.print(readCard[3], HEX);
        lcd.print(readCard[4], HEX);
        delay(4000);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("NOT AVAILABLE");
        lcd.setCursor(0, 1);
        lcd.print("SO ADDING.......");
        delay(5000);
        writeID(readCard);
        Serial.println("-----------------------------");
      }} }
  else {
    if ( isMaster(readCard) ) {  // If scanned card's ID matches Master Card's ID enter program mode
      programMode = true;
      Serial.println("Welcome to Mastercard Mode");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("WELCOME TO");
      lcd.setCursor(0, 1);
      lcd.print("MASTERCARD MODE");
      delay(3000);
      int count = EEPROM.read(0); // Read the first Byte of EEPROM that
      Serial.print("I have ");    // stores the number of ID's in EEPROM
      Serial.print(count);
      Serial.print(" record(s) on EEPROM");
      Serial.println("");
      Serial.println("Scan a PICC to ADD or REMOVE");
      Serial.println("-----------------------------");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("SCAN PICC TO");
      lcd.setCursor(0, 1);
      lcd.print("ADD OR REMOVE...");
      delay(2500);
    }
    else {
      if ( findID(readCard) ) {        // If not, see if the card is in the EEPROM
        Serial.println("Acces Granted");
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" CONGRATULATION");
        lcd.setCursor(0, 1);
        lcd.print(" ACCESS GRANTED");
        digitalWrite(8, HIGH);
        delay(1500);
        digitalWrite(8, LOW);
        lcd.clear();
      }
      else {        // If not, show that the ID was not valid
        Serial.println("Access Denied");
        for (int abcd = 0; abcd < 6; abcd++)
        {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("     SORRY");
          lcd.setCursor(0, 1);
          lcd.print("  ACCESS DENIED");
          digitalWrite(8, HIGH);
          delay(700);
          digitalWrite(8, LOW);
          lcd.clear();
          lcd.print("   YOU'RE NOT  ");
          lcd.setCursor(0, 1);
          lcd.print("   AUTHORIZED   ");
          delay(700);
        }
        lcd.clear();
      }}}}
int getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
    return 0;
  }
  // There are Mifare PICCs which have 4 byte or 7 byte UID care if you use 7 byte PICC
  // I think we should assume every PICC as they have 4 byte UID
  // Until we support 7 byte PICCs

  Serial.println("Scanning PICC's UID.........");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SCANNING");
  lcd.setCursor(0, 1);
  lcd.print("PICC's UID.....");
  delay(2000);
  for (int i = 0; i < 4; i++) {  //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
  }
  Serial.println("");
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}
boolean isMaster( byte test[] ) {
  if ( checkTwo( test, masterCard ) )
    return true;
  else
    return false;
}

boolean checkTwo ( byte a[], byte b[] ) {
  if ( a[0] != NULL ) // Make sure there is something in the array first
    match = true; // Assume they match at first
  for ( int k = 0; k < 4; k++ ) { // Loop 4 times
    if ( a[k] != b[k] ) // IF a != b then set match = false, one fails, all fail
      match = false;
  }
  if ( match ) { // Check to see if if match is still true
    return true; // Return true
  }
  else  {
    return false; // Return false
  }}
boolean findID( byte find[] ) {
  int count = EEPROM.read(0); // Read the first Byte of EEPROM that
  for ( int i = 1; i <= count; i++ ) {  // Loop once for each EEPROM entry
    readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
    if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
      return true;
      break; // Stop looking we found it
    }
    else {  // If not, return false
    }}
  return false;
}
void readID( int number ) {
  int start = (number * 4 ) + 2; // Figure out starting position
  for ( int i = 0; i < 4; i++ ) { // Loop 4 times to get the 4 Bytes
    storedCard[i] = EEPROM.read(start + i); // Assign values read from EEPROM to array
  }
}
void deleteID( byte a[] ) {
  if ( !findID( a ) ) { // Before we delete from the EEPROM, check to see if we have this card!
    failedWrite(); // If not
  }
  else {
    int num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
    int slot; // Figure out the slot number of the card
    int start;// = ( num * 4 ) + 6; // Figure out where the next slot starts
    int looping; // The number of times the loop repeats
    int j;
    int count = EEPROM.read(0); // Read the first Byte of EEPROM that stores number of cards
    slot = findIDSLOT( a ); //Figure out the slot number of the card to delete
    start = (slot * 4) + 2;
    looping = ((num - slot) * 4);
    num--; // Decrement the counter by one
    EEPROM.write( 0, num ); // Write the new count to the counter
    for ( j = 0; j < looping; j++ ) { // Loop the card shift times
      EEPROM.write( start + j, EEPROM.read(start + 4 + j)); // Shift the array values to 4 places earlier in the EEPROM
    }
    for ( int k = 0; k < 4; k++ ) { //Shifting loop
      EEPROM.write( start + j + k, 0);
    }
    successDelete();
  }}
  //For Failed to add the card:
void failedWrite() {

  Serial.println("something wrong with Card");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SOMETHING WRONG");
  lcd.setCursor(0, 1);
  lcd.print("WITH CARD");
  delay(2000);
}
//For Sucessfully Deleted:
void successDelete() {
  Serial.println("Succesfully removed");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SUCCESFULLY");
  lcd.setCursor(0, 1);
  lcd.print("REMOVED");
  delay(2000);
}
int findIDSLOT( byte find[] ) {
  int count = EEPROM.read(0); // Read the first Byte of EEPROM that
  for ( int i = 1; i <= count; i++ ) { // Loop once for each EEPROM entry
    readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
    if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
      // is the same as the find[] ID card passed
      return i; // The slot number of the card
      break; // Stop looking we found it
    }
  }
}
//For Sucessfully Added:
void successWrite() {

  Serial.println("Succesfully added");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SUCCESFULLY");
  lcd.setCursor(0, 1);
  lcd.print("ADDED");
  delay(2000);
}
//For Adding card to EEROM:
void writeID( byte a[] ) {
  if ( !findID( a ) ) { // Before we write to the EEPROM, check to see if we have seen this card before!
    int num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
    int start = ( num * 4 ) + 6; // Figure out where the next slot starts
    num++; // Increment the counter by one
    EEPROM.write( 0, num ); // Write the new count to the counter
    for ( int j = 0; j < 4; j++ ) { // Loop 4 times
      EEPROM.write( start + j, a[j] ); // Write the array values to EEPROM in the right position
    }
    successWrite();
  }
  else {
    failedWrite();
  }
}

 

Генрих
Offline
Зарегистрирован: 17.03.2021

Мне бы хотяб с экраном разобраться, дальше вроде все получается. Как подключить экран через контроллер (адаптер) 4 пина

Генрих
Offline
Зарегистрирован: 17.03.2021

Да. заработало! но экран светится информацию не отображает, инфо только в мониторе порта. Все читает и пишет  Я его и обычными пинами подключал и так. Только светится (контрастность настроил если что))

b707
Offline
Зарегистрирован: 26.05.2017

Библиотеку дисплея надо на LiquidCrystal_I2C заменить, инициализацию в сетапе поправить ... ну и физически провода подключить

Генрих
Offline
Зарегистрирован: 17.03.2021

Заменил, подключил. просто светится. А инфо в мониторе порта только. 

Возможно, неправильно инициализировал

Генрих
Offline
Зарегистрирован: 17.03.2021

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

MFRC522 mfrc522(10,9);

LiquidCrystal_I2C lcd(0x27,16,2);
 
byte cardx[4]= {0x3F,0x01,0x23,0x44};
Генрих
Offline
Зарегистрирован: 17.03.2021

И пин 8 сигнал на реле и пищалку не дает

Sergio_M
Sergio_M аватар
Offline
Зарегистрирован: 17.12.2020

Если есть уже установленная библиотека LiquidCristal_I2C.h то дальше надо проверить подключение SCL и SDA. Дальше код :



001 /*------------------------------------------
002   RFID CARD READER
004   Using Arduino,RFID-RC522 and LCD 16x23
005   ------------------------------------------*/
006 #include <Wire.h>// вот без этой библиотеки работать не будет
007 #include <EEPROM.h>  //Library To read and write PICC's UIDs from/to EEPROM
008 #include <SPI.h>      //Library  RC522 Module uses SPI protocol
009 #include <MFRC522.h> //Library  RC522 Module
010

#include <LiquidCrystal_I2C.h>

// если "LiquidCrystal_I2C" не светится красным, значит библиотека не видна, должна быть в папке где и все остальные. 

011  
012 boolean match = false// initialize card match to false
013 boolean programMode = false// initialize programming mode to false
014 int successRead; // Variable integer to keep if we have Successful Read from Reader
015 byte storedCard[4];   // Stores an ID read from EEPROM
016 byte readCard[4];           // Stores scanned ID read from RFID Module
017 byte masterCard[4]; // Stores master card's ID read from EEPROM
018 #define SS_PIN 10
019 #define RST_PIN 9
020 MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.
021 LiquidCrystal_I2C lcd(0x27, 16, 2); // или тут вместо 0x27 пишем 0x3F
022 void setup() {
023   // put your setup code here, to run once:
024   Serial.begin(9600);  // Initialize serial communications with PC
025   lcd.init(); lcd.begin(16,2); lcd.backlight();   //Initializing LCD 16x2
026   pinMode(8, OUTPUT);  //LED and Buzzer PIN OUT

 

Генрих
Offline
Зарегистрирован: 17.03.2021

Ну вот, Друзья! Благодарю за участие. Заработало!) Дети прыгают от радости)) Чудесааа. Мира Вам!!!