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

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

Помогите с замком. Хочу сделать чтобы открывается и закрывается одной картой - один раз приложил замок открылся второй раз приложил закрылся. В этом примере это реализуется двумя картами. Спасибо за помощь

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

/*
подключение для Arduino Uno и Mega, производится к разным Pin!
 ----------------------------------------------------- Nicola Coppola
 * Pin layout should be as follows:
 * Signal     Pin              Pin               Pin
 *            Arduino Uno      Arduino Mega      MFRC522 board
 * ------------------------------------------------------------
 * Reset      9                5                 RST
 * SPI SS     10               53                SDA
 * SPI MOSI   11               51                MOSI
 * SPI MISO   12               50                MISO
 * SPI SCK    13               52                SCK
 
 */

// два Pin (SS и RST)  
// !(SS - он же - SDA).
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   
unsigned long uidDec, uidDecTemp;   

void setup() {

  Serial.begin(9600);     // Initialize serial communications with the PC.
  Serial.println(" Waiting for card...");
  SPI.begin();   
  mfrc522.PCD_Init();      
  pinMode(7, OUTPUT);    
  pinMode(6, OUTPUT);   
  pinMode(5, OUTPUT);   
  digitalWrite(7, HIGH);  
}

void loop() {
  //   Look for new cards.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  //   Select one of the cards.
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  uidDec = 0;

   
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec*256+uidDecTemp;  
  }  
  Serial.println("Serijnyj nomer karty / Card UID: ");
  Serial.println(uidDec);

  // ------------------------

  // начинаем сравнивать номер "UID", поднесённой к ридеру карты,
  // с записанным номером "UID" карты в sketch.

   
  if (uidDec == 3000069413) // если "UID" номер совпал.
  {
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    Serial.println("Hi 1");  
     }
    
  else if (uidDec == 4088880000)
  {
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    Serial.println("Hi 2");   
  }

  else  //  
  {
    digitalWrite(5, HIGH);
    Serial.println("unknown card");  
  }

  Serial.println("=====================================");

  delay(5000); // пауза
  digitalWrite(5, LOW);  

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

homejk пишет:

Помогите с замком. Хочу сделать чтобы открывается и закрывается одной картой - один раз приложил замок открылся второй раз приложил закрылся. В этом примере это реализуется двумя картами. Спасибо за помощь

Вместо прямого действия (номер карты совпал - открываем дверь) введите флаг состояния (номер карты совпал - меняем состояние на противоположное). Потом добавте еще один блок в программу - в зависимости от флага открыть или закрыть дверь.

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

Уже три дня пытаюсь сделать и ничего не получается можно подробнее какой то пример как использовать этот флаг состояния ? Спасибо

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014
boolean isLocked = true;

Вместо

 if (uidDec == 3000069413) // если "UID" номер совпал.
  {
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    Serial.println("Hi 1");  
     }

Сделайте

 if (uidDec == 3000069413) // если "UID" номер совпал.
  {
   isLocked  = !isLocked;
//аналогично:
//if (isLocked == true){
//isLocked = false;
//}else{
//isLocked = true;
//}
     }

Затем, в зависимости от состояния isLocked управляйте замком.

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

переделал как вы написали, очень благодарен за помощь я только начал осваивать программирование подскажите пожалуйста как управлять через boolean islocked меня интересует чтобы было только открыть digitalWrite(6, HIGH); digitalWrite(7, LOW); закрыть digitalWrite(7, HIGH); digitalWrite(6, LOW); и все. Мой скетч переработан по Вашим советам:

#include <SPI.h>  
#include <MFRC522.h>  
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   
unsigned long uidDec, uidDecTemp;
boolean isLocked = true;

void setup() {

  Serial.begin(9600);     // Initialize serial communications with the PC.
  Serial.println(" Waiting for card...");
  SPI.begin();   
  mfrc522.PCD_Init();      
  pinMode(7, OUTPUT); //синий взято на охрану  
  pinMode(6, OUTPUT); // зеленый охрана отключена  
  pinMode(5, OUTPUT);  // красный неверная карта
  digitalWrite(7, HIGH);  
}

void loop() {
  //   Look for new cards.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  //   Select one of the cards.
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  uidDec = 0;

   
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec*256+uidDecTemp;  
  }  
  Serial.println("Serijnyj nomer karty / Card UID: ");
  Serial.println(uidDec);

  // ------------------------

  // начинаем сравнивать номер "UID", поднесённой к ридеру карты,
  // с записанным номером "UID" карты в sketch.

   
  if (uidDec == 3000069413) // если "UID" номер совпал.
  {
    isLocked  = !isLocked;
    if (isLocked == true){
    isLocked = false;
  }else{
   isLocked = true;
     }
     }
  else  //  
  {
    digitalWrite(5, HIGH);
    Serial.println("unknown card");  
  }

  Serial.println("=====================================");

  delay(5000); // пауза
  digitalWrite(5, LOW);  
}

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

За невыполнение ругают.

homejk пишет:

переделал как вы написали, очень благодарен за помощь я только начал осваивать программирование подскажите пожалуйста как управлять через boolean islocked меня интересует чтобы было только открыть digitalWrite(6, HIGH); digitalWrite(7, LOW); закрыть digitalWrite(7, HIGH); digitalWrite(6, LOW); и все. Мой скетч 

вы об этом?

if (isLocked){
digitalWrite(6, HIGH); 
digitalWrite(7, LOW); 
}else{
digitalWrite(7, HIGH); 
digitalWrite(6, LOW)
}

 

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

я так и делаю но когда прикладываю карту замок открывается а закрываться не хочет вот мой последний скетч

#include <SPI.h>  
#include <MFRC522.h>  
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   
unsigned long uidDec, uidDecTemp;
boolean isLocked = true;

void setup() {

  Serial.begin(9600);     // Initialize serial communications with the PC.
  Serial.println(" Waiting for card...");
  SPI.begin();   
  mfrc522.PCD_Init();      
  pinMode(7, OUTPUT); //синий взято на охрану  
  pinMode(6, OUTPUT); // зеленый охрана отключена  
  pinMode(5, OUTPUT);  // красный неверная карта  
}

void loop() {
  //   Look for new cards.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  //   Select one of the cards.
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  uidDec = 0;

   
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec*256+uidDecTemp;  
  }  
  Serial.println("Serijnyj nomer karty / Card UID: ");
  Serial.println(uidDec);

  // ------------------------

  // начинаем сравнивать номер "UID", поднесённой к ридеру карты,
  // с записанным номером "UID" карты в sketch.

   
  if (uidDec == 3000069413) // если "UID" номер совпал.
  {
    isLocked  = !isLocked;
   
     if (isLocked){
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
        delay(100);
    }else{
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
         delay(100);
    }
     }
  else  //  
  {
    digitalWrite(5, HIGH);
    Serial.println("unknown card");  
  }

  Serial.println("=====================================");

  delay(5000); // пауза
  digitalWrite(5, LOW);  
}

 

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

P.S Спасибо за подсказку о вставке кода

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

будьте внимательны:

 

эта строка:

 isLocked  = !isLocked;

и это конструкция:

  if (isLocked == true){
   isLocked = false;
  }else{
   isLocked = true;
  }

равнозначны, т.е. по сути - одно и то-же.

Я конструкцию спрятал в комментарии. А вы поместили ее в свой код.

Это значит, что ваша программа делает одно и тоже два раза подряд.

Уберите что-то одно из программы и все должно заработать.

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

Действительно нашел ошибку. Все работает. Большое спасибо. Буду дальше экспериментировать)

winziwul
Offline
Зарегистрирован: 05.03.2014

подскажите плиз как сделать что бы опрос шёл переодически ну примерно пускай каждые 5 секунд и если карта отсутствует скажем 15 секунд замок закрылся

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

взять переменную куда записывать миллис() когда приложенна карта, и сравнивать разность миллис() и переменной с 15 секундами - если больше закрывать дверь. Так пока карта приложена разность всегда меньше.

TovBender
Offline
Зарегистрирован: 12.04.2015

Gippopotam  здравствуйте     помогите разобраться.

тоже собрал систему доступа на RFID. всё работало отлично.

решил добавить, чтоб и с радио брелка открыть можно было.  в месте они не работают, кнопка и NFC, а по отдельности, если заремить, пол кода,  вполне даже быстро. вот если за ремить с 37 по 56 строки , Радио брелок открывает замок. если оставить как есть то только, карты доступа.    Радио доступ отазывается работать. и после После 56 строки ничего не работает.  Ардвинка на код не ругается. подскажите как заставить их работать, чтоб и карта доступа работала и радио брелок. конечно не сенхронно. а на выбор. у кого есть карта, и удалённо с радио брелка кнопка.  Что не так с этим кодом. возможно что тут конфликт библиотек ??   

#include <SPI.h>

#include <MFRC522.h> 
#include <LiquidCrystal_I2C.h>
#include <RCSwitch.h>
 LiquidCrystal_I2C lcd(0x27,16,2);  //  SDA - A4;  SCL - A5
RCSwitch mySwitch = RCSwitch();

#define SS_PIN 10
#define RST_PIN 9
#define ted 5  // замок с мотором   #5
#define tet 6  // замок с мотором
int but =0;

word Rkod=0;

MFRC522 mfrc522(SS_PIN, RST_PIN);  
unsigned long uidDec, uidDecTemp;  
void setup() {               // **********************************************************

  Serial.begin(9600);     // Initialize serial communications with the PC.
  Serial.println("Prilozhite kartu .");
//    lcd.init();  // Активировать дисплей
//   lcd.backlight(); // подсветка дисплея
//   lcd.print(" Zamok Nevidimka");
  SPI.begin();  //  инициализация SPI / Init SPI bus.
  mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.

   pinMode(ted , OUTPUT);
   pinMode(tet , OUTPUT);
   mySwitch.enableReceive(0);  
   
}

void loop()  {        //   *************************************************

   if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  uidDec = 0;

  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec*256+uidDecTemp;  
  }  
  
  // ------------------------------------------------------------------

  if (uidDec == 20460007958)        
  {
    digitalWrite(ted, HIGH);
    Serial.println(" Hi Liza"); 
  }
  
 //  ------------------------------------------------------------------------------------
               // void cikl1 () {
                 //  while(1){

 // Serial.println(" Ne Rabotaet "); // ------------------

   if (mySwitch.available())      {            
Rkod= mySwitch.getReceivedValue();
Serial.print(Rkod);     
Serial.println();
                               
if ( Rkod == 528 ) {              
  digitalWrite(ted, HIGH); delay(100); digitalWrite(ted, LOW); // lcd.setCursor(0, 1); 
//  lcd.print("OTKRITO po Radio");}  



   }
   mySwitch.resetAvailable(); // сброс радио кода
}  }

 

пробовал и через флаг, и через switch отделял блоки.

 

TovBender
Offline
Зарегистрирован: 12.04.2015

Кто нибудь поможет .   с кодом, управление доступа по RFIF, и открыть по радио.  #12

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

попробуй с 37 по 56 написать так:

if (mfrc522.PICC_ReadCardSerial()) 
{
  uidDec = 0;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec*256+uidDecTemp;  
  }  
  // ------------------------------------------------------------------
  if (uidDec == 20460007958)        
  {
    digitalWrite(ted, HIGH);
    Serial.println(" Hi Liza"); 
  }
}

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

TovBender пишет:

Кто нибудь поможет .   с кодом, управление доступа по RFIF, и открыть по радио.  #12

Ваша проблема в строке 23.

 

IlyaV
Offline
Зарегистрирован: 01.02.2017

homejk спасибо за скетч и всем кто помог доработать. Сам дуб в этом всём. Немного добавил от себя сохранение в еепром последнее состояние замка, что бы после выкл/вкл устройства он оставался, например, закрыт. Знающие проверте, пожалуйста, на кривизну кода ). Точнее, может быть есть способ проще и/или вообще минуя еепром?

#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp;
boolean isLocked = true;
int eeAddr = 0; // Адрес EEPROM, откуда следует начать чтение.

void setup() {

  Serial.begin(9600);     // Initialize serial communications with the PC.
  while (!Serial) {
    ; // ждать подключения последовательного порта. Необходимо только для встроенного USB порта.
  }
  Serial.println(" Waiting for card...");
  SPI.begin();
  mfrc522.PCD_Init();
  pinMode(7, OUTPUT); //синий взято на охрану
  pinMode(6, OUTPUT); // зеленый охрана отключена
  pinMode(5, OUTPUT);  // красный неверная карта
  EEPROM.get(eeAddr, isLocked);
}

void loop() {

  //   Look for new cards.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  //   Select one of the cards.
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  uidDec = 0;


  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec * 256 + uidDecTemp;
  }
  Serial.println("Serijnyj nomer karty / Card UID: ");
  Serial.println(uidDec);

  // ------------------------

  // начинаем сравнивать номер "UID", поднесённой к ридеру карты,
  // с записанным номером "UID" карты в sketch.


  if (uidDec == 811319680 , 5078650) // если "UID" номер совпал.
  {
    isLocked  = !isLocked;
    if (isLocked) {
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
      Serial.println("Open");
      EEPROM.put(eeAddr, isLocked);
      delay(100);
    } else {
      digitalWrite(7, HIGH);
      digitalWrite(6, LOW);
      Serial.println("Close");
      EEPROM.put(eeAddr, isLocked);
      delay(100);
    }
  }
  else  //
  {
    digitalWrite(5, HIGH);
    Serial.println("unknown card");
  }

  Serial.println("=====================================");

  delay(2000); // пауза
  digitalWrite(5, LOW);
}

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

строка 55 вызывает сомнения - я не знаток C++ но вроде бы так нельзя сравнивать.

строки 62,63 и 68,69 можно обьединить и вынести за IF

switch(uidDec){
   case 811319680 :
   case 5078650 : // если "UID" номер совпал.
      isLocked  = !isLocked;
      if (isLocked) {
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
        Serial.println("Open");
      } else {
        digitalWrite(7, HIGH);
        digitalWrite(6, LOW);
        Serial.println("Close");
      }
      EEPROM.put(eeAddr, isLocked);
      delay(100);
      break;
   default:
     digitalWrite(5, HIGH);
     Serial.println("unknown card");
}

 

IlyaV
Offline
Зарегистрирован: 01.02.2017

Сравнение меток утащил из какого то примера. А по 62,63 и 68,69 - точно. Спасибо.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

IlyaV пишет:

Сравнение меток утащил из какого то примера.

Вот в этом и проблема. Когда тащат друг у друга неправильный код, даже не вникая и не проверяя.

Вместо запятой надо использовать логические операторы.

IlyaV
Offline
Зарегистрирован: 01.02.2017

Я стащил и проверил на плате. Оба ключа работают в данной задаче. Ну и как чисто механник, решил что всё в порядке ), да и вычеслений дальнейших нет с использованием uid_ов, т.е. || или ,  в моём случае без разницы, я так думаю.

Не стреляйте, я лет 25 программированием не занимался.

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

дайте финальный скетч попробую на своем ардуино что у Вас получилось

IlyaV
Offline
Зарегистрирован: 01.02.2017
#include <SPI.h>  
#include <MFRC522.h>  
#include <EEPROM.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   
unsigned long uidDec, uidDecTemp;
boolean isLocked = true;
int eeAddr = 0; // Адрес EEPROM, откуда следует начать чтение.

void setup() {

  Serial.begin(9600);     // Initialize serial communications with the PC.
  while (!Serial) {
    ; // ждать подключения последовательного порта. Необходимо только для встроенного USB порта.
  }
  Serial.println(" Waiting for card...");
  SPI.begin();   
  mfrc522.PCD_Init();      
  pinMode(7, OUTPUT); //синий взято на охрану  
  pinMode(6, OUTPUT); // зеленый охрана отключена  
  pinMode(5, OUTPUT);  // красный неверная карта  
  EEPROM.get(eeAddr, isLocked);  
  }

void loop() {
  
  //   Look for new cards.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  //   Select one of the cards.
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  uidDec = 0;

   
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec*256+uidDecTemp;  
  }  
  Serial.println("Serijnyj nomer karty / Card UID: ");
  Serial.println(uidDec);

  // ------------------------

  // начинаем сравнивать номер "UID", поднесённой к ридеру карты,
  // с записанным номером "UID" карты в sketch.

   
  if (uidDec == 811319680 , 5078650) // если "UID" номер совпал.
  {
    isLocked  = !isLocked;   
     if (isLocked){
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    Serial.println("Open");
         delay(100);
    }else{
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
    Serial.println("Close");     
         delay(100);
    }
    EEPROM.put(eeAddr, isLocked); 
     }
  else  //  
  {
    digitalWrite(5, HIGH);
    Serial.println("unknown card");  
  }

  Serial.println("=====================================");

  delay(2000); // пауза
  digitalWrite(5, LOW);  
}

 

IlyaV
Offline
Зарегистрирован: 01.02.2017

После сброса, состояние выходов получалось вообщи ни какое, добавил конструкцию 27-35. Выглядит не элегантно, но работает ). Про запятую вы были правы.

#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp;
boolean isLocked = true;
int eeAddr = 0; // Адрес EEPROM, откуда следует начать чтение.

void setup() {
  pinMode(7, OUTPUT); //синий взято на охрану
  pinMode(6, OUTPUT); // зеленый охрана отключена
  pinMode(5, OUTPUT);  // красный неверная карта
  EEPROM.get(eeAddr, isLocked);
  Serial.begin(9600);     // Initialize serial communications with the PC.
  while (!Serial) {
    ; // ждать подключения последовательного порта. Необходимо только для встроенного USB порта.
  }
  Serial.println(" Waiting for card...");
  SPI.begin();
  mfrc522.PCD_Init();

}

void loop() {
  if (isLocked) {
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    delay(100);
  } else {
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
    delay(100);
  }
  //   Look for new cards.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  //   Select one of the cards.
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  uidDec = 0;


  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec * 256 + uidDecTemp;
  }
  Serial.println("Serijnyj nomer karty / Card UID: ");
  Serial.println(uidDec);

  // ------------------------

  // начинаем сравнивать номер "UID", поднесённой к ридеру карты,
  // с записанным номером "UID" карты в sketch.


  if (uidDec == 811319680 || uidDec == 5078650) // если "UID" номер совпал.
  {
    isLocked  = !isLocked;
    if (isLocked) {
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
      Serial.println("Open");
      delay(100);
    } else {
      digitalWrite(7, HIGH);
      digitalWrite(6, LOW);
      Serial.println("Close");
      delay(100);
    }
    EEPROM.put(eeAddr, isLocked);
  }
  else  //
  {
    digitalWrite(5, HIGH);
    Serial.println("unknown card");
  }

  Serial.println("=====================================");

  delay(2000); // пауза
  digitalWrite(5, LOW);
}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

зачем только это в loop пихать ?

#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp;
boolean isLocked = true;
int eeAddr = 0; // Адрес EEPROM, откуда следует начать чтение.

void setup() {
  pinMode(7, OUTPUT); //синий взято на охрану
  pinMode(6, OUTPUT); // зеленый охрана отключена
  pinMode(5, OUTPUT);  // красный неверная карта
  EEPROM.get(eeAddr, isLocked);
  digitalWrite(6, isLocked);
  digitalWrite(7, !isLocked);
  Serial.begin(9600);     // Initialize serial communications with the PC.
  while (!Serial) {
    ; // ждать подключения последовательного порта. Необходимо только для встроенного USB порта.
  }
  Serial.println(" Waiting for card...");
  SPI.begin();
  mfrc522.PCD_Init();

}

void loop() {
  //   Look for new cards.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  //   Select one of the cards.
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  uidDec = 0;


  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec * 256 + uidDecTemp;
  }
  Serial.println("Serijnyj nomer karty / Card UID: ");
  Serial.println(uidDec);

  // ------------------------

  // начинаем сравнивать номер "UID", поднесённой к ридеру карты,
  // с записанным номером "UID" карты в sketch.


  if (uidDec == 811319680 || uidDec == 5078650) // если "UID" номер совпал.
  {
    isLocked  = !isLocked;
    digitalWrite(6, isLocked  );
    digitalWrite(7, !isLocked);
    if (isLocked) {
      Serial.println("Open");
    } else {
      Serial.println("Close");
    };
    delay(100);
    EEPROM.put(eeAddr, isLocked);
  }
  else  //
  {
    digitalWrite(5, HIGH);
    Serial.println("unknown card");
  }

  Serial.println("=====================================");

  delay(2000); // пауза
  digitalWrite(5, LOW);
}

 

IlyaV
Offline
Зарегистрирован: 01.02.2017

Вот, уже элегантнее. Спасибо.

xDriver пишет:

зачем только это в loop пихать ?

Из за отсутствия знаний. Я как в тёмном сарае с граблями.

p985850
Offline
Зарегистрирован: 07.07.2017

Автор наверно не в курсе что по UID делать открытие замка нельзя, к вам воры залезут.

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

замок прекрасно работает уже 3 года как по Вашему «вор» подберет UID методом бутфорсу? или украдет карту?

n971030
Offline
Зарегистрирован: 09.01.2017

Есть считыватели даже за 800 рублей, пройдете мимо его и все, номер карты прочитан. Склонировать номер карты на балванку все очень просто. Да и зачем тогда ставить Mifare если по такому же принципу работает EmMarin ? Посмотрите на алиэкспрес считыватели и видосы на ютюбе..но это дело лично ваше, спорить незачем.

n971030
Offline
Зарегистрирован: 09.01.2017

А вот если бы вы написали как стереть запрограммированую карту к заводскому варианту то это да - заслуживает внимание. 

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

homejk пишет:

замок прекрасно работает уже 3 года как по Вашему «вор» подберет UID методом бутфорсу? или украдет карту?

достаточно на долю секунды поднести вашу карту к своему считывателю - и UID прочитан. А собрать считыватель ровно также просто, как и замок - детали те же.

Вывод - RFID замок на принципе проверки UID - не замок вовсе, скорее как шпингалет в туалете

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

Не все так просто у меня брелок с четырьмя UID, без нажатия кнопки на нем вы ничего не считайте! Но если предложите вариант как организовать шифрование будет интересно посмотреть!

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

Элементарно.

на Мифаре есть закрытые блоки, которые можно прочитать, только зная пароль. Записываете UID карты в таком блоке, и замок должен открываться, только если ID в заголовке карты и в закрытом блоке совпали. Код элементарный, а надежность замка на несколько порядков выше. Теперь пусть кто угодно сканирует и копирует вашу карту - замок он не откроет

-NMi-
Offline
Зарегистрирован: 20.08.2018

Сейчас уже можно купить считыватели именно стандарта NXP?   Ссылку можно.

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

это все можно организовать на существующем оборудовании RC522 или нужно что-то другое? можно какой-то пример или ссылку на такой проект?

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

В библиотечных примерах это есть.
Или туда религия заглядывать не позволяет ?

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

в примерах к RC522 не нашел ничего по шифрованию, даже если есть вопрос насколько это все будет надежно так как теперь умудряются клонировать банковские карты для себя купил вот такой брелок на али ничего не скопируется пока не нажата кнопка плюс добавляется фунционал https://aliexpress.ru/item/4000555087326.html?spm=a2g0s.9042311.0.0.1f2033edvA3dQd

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

Доброго дня, простите за элементарный вопрос, но. Все получается только застрял над вопросом как в коде добавить еще несколько меток для замка...

#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // создаем экземпляр MFRC522
 
void setup() 
{
  Serial.begin(9600);   // запускаем последовательную коммуникацию 
  SPI.begin();          // инициализируем шину SPI
  mfrc522.PCD_Init();   // инициализируем MFRC522
  Serial.println("Approximate your card to the reader...");
             //  "Приложите карту к ридеру..."
  Serial.println();
 
}
void loop() 
{
  // ищем новые карты:
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  // выбираем одну из карт:
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  // показываем UID в мониторе порта:
  Serial.print("UID tag :");  //  "UID тега: " 
  String content= "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();
 ВОТ ЗДЕСЬ!!!  if (content.substring(1) == "66 78 84 25" )
  
  // впишите здесь UID одной или нескольких карт,
  // которым хотите дать доступ; например, "BD 31 15 2B"
 
  {
    Serial.println("Authorized access");  //  "Доступ разрешен"
    Serial.println();
    delay(3000);
  }
 
 else   {
    Serial.println(" Access denied");    //  " Доступ отклонен"
    delay(3000);
  }
}
Генрих
Offline
Зарегистрирован: 17.03.2021

ВОТ ЗДЕСЬ!!!  if (content.substring(1) == "66 78 84 25" )

Какой синтаксис применить надо?

Заранее Благодарен)

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

Для начала научитесь правильно вставлять код в комментарий, в моем скетчи метки добавляются вот так

if ((uidDec == 3679469413) || (uidDec == 2388434862)|| (uidDec == 3679469413))  
    {
      isLocked  = !isLocked; 
      if (isLocked)

 

Enable GingerCannot connect to Ginger Check your internet connection
or reload the browserDisable in this text fieldEditEdit in GingerEdit in Ginger×

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

Благодарю, научусь обязательно, но..

У вас в десятичной, а у меня все построено в 16 ти(

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

БЛАГОДАРЮ. работает) Хорошего дня!

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

RFID по-мойму не дюже надёжная тема. Тонны подтверждений тому есть. Но даже не в этом дело. Как хто думает, а не надежней будет ИК ключик для замка с кодом? Считать такой со стороны нет возможности, совсем, ибо слабым его сотворить можно ( только чтоб доставал 20-30 см. не более), никуда не летит далеко.  Подошел близко к окошку приемника, ПИН-код с мини-пульта ввел и сим-сим открылся) Гораздо всё проще будет, и не менее надежно. 

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

 

Идеального замка не существует к сожалению, мы здесь обсуждаем замок на основе технологии RFID технические нюансы, совершенствования то что вы предлагаете это совсем другая технология ее можно добавить в этот замок или создать отдельный проект. Вопрос надежности это отдельный вопрос - взломать можно что угодно вопрос в наличии времени и ресурсов

 

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

Sergio_M пишет:

RFID по-мойму не дюже надёжная тема. Тонны подтверждений тому есть.

можно сделать понадежнее, если внимательно читать документацию, а не как в этой ветке. Представленный в этой ветке замок - бесполезная игрушка, ключ от него может клонировать любой школьник. Автору об этом писали еще год назад - но он только отмахнулся.

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

 

автор написал как решил проблему возможного клонирования ключа (брелок с кнопкой или кошелек с защитой от считывания таких валом на али) а по поводу добавить шифрования легко писать «можно сделать понадежнее» о призрачных документациях и примерах которых по факту не существует если не так то наведите рабочий скетч данной реализации?

 

 

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

homejk пишет:

 по поводу добавить шифрования легко писать «можно сделать понадежнее» о призрачных документациях и примерах которых по факту не существует если не так то наведите рабочий скетч данной реализации?

ну ты правда такой темный?

Почитал бы,  как мифаре карты устроены. То, что кроме UID на карте 1К  еще 16 секторов по 64 байта - не слыхал? и у каждого можно установить свой пароль и записать туда свои данные. Как читать и писать данные - есть в примерах к либе.

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

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

 

Не ты а Вы, мы не знакомые, на счет «темный» не буду комментировать так как не могу опускаться до вашего уровня, для продолжения беседы рабочий скетч пожалуйста ?! бросать с «wiki» умные фразы может каждый вы покажите реализацию

 

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

homejk, если Вам нужна "реализация", ее уместнее просить в разделе "Ищу исполнителя".

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

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

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

homejk пишет:

мне ничего не нужно все прекрасно работает не один год, зачем меняете аккаунт

homejk - никто ничего не меняет. мы два разных человека, правда :) Просто ваша дремучесть очевидна не только мне - вот народ и подтягивается. Вы бы все-таки прочитали что-то на тему"RFID для чайников", а то уже стыдно должно быть. Это уже выглядит так, будто я вам говорю "2х2 =4" - а вы мне "Не верю, покажите код"

Я вполне понимаю. что когда вы писали этот код в 2015 году - это был ваш первый скетч в Ардуино. И тогда такой код был простителен. Но неужели вы за 6 лет вообще не продвинулись в программировании и не научились читать документацию?