RFID-RC522 модуль
- Войдите на сайт для отправки комментариев
Пнд, 03/07/2017 - 13:26
RFID модуль. MFRC522
работает некорректно не понимаю в чем проблема ,,
когда нет метки - должен вызвать функцию in();
когда первая метка - функцию tas();
когда вторая метка - функцию qsan();
бывает , что когда есть один из меток но вызывает функцию in();
вот и код
void loop() { Key = 0; if ( ! rfid.PICC_IsNewCardPresent()) {goto empty;}// Поиск нового ключа if ( ! rfid.PICC_ReadCardSerial()) {goto empty;}// Выбор ключа for (byte i = 0; i < rfid.uid.size; i++){// Выдача серийного № ключа KeyTemp = rfid.uid.uidByte[i]; Key = Key * 256 + KeyTemp;} empty: Serial.print("Card №: "); Serial.println(Key); // Выводим № ключа в консоль if (0 == Key) { // делаем когда метки нет in(); } if( Key == 515280555){ //первая метка tas(); } if( Key == 1459297918){ // вторая метка qsan(); } }
что делать? помогите пожалуйста
что делать?
Привести код полностью.
Я, например, не вижу как у Вас описана переменная Key.
вот и весь код
Зачем у Вас из строк 112 и 114 - когда нет никакой метки - сделан переход на вывод номера ключа в консоль? Откуда возьмется номер. если метки нет?
Не говоря уж о том, что использование goto в С - это как признание в импотенции.
это для того чтобы когда нет метки вывать функцию in();
я новичок,многого не знаю ,, а как правильно это делать?
это для того чтобы когда нет метки вывать функцию in();
ну так вывод в Serial-то зачем? Даже с использованием goto было бы логичнее поставить empty: после печати, на строку 123. А можно вообще обойтись без переходов и меток - у вас программа и так пробегает по всем функциям каждый цикл.
а как мне вызвать функцию in(); когда на модуле нет никокой карты?
Если я правильно понял, что вы хотите сделать, код loop() можно переписать так:
Код не проверял, могут быть случайные ошибки
а как мне вызвать функцию in(); когда на модуле нет никокой карты?
Применительно к вашему коду из сообщения #2 - если на модуле нет карты, переменная Key будет равна нулю и условие в строке 124 сработает само - безо всяких goto
очень спосибо но по вашему примеру не работает и не работает без goto
очень спосибо но по вашему примеру не работает и не работает без goto
а что именно не работает? - я ж говорю, из вашего кода не вполне понятно. что вы вообще хотите сделать
у меня то задача немного сложная ,, у меня есть Arduino Uno, RFID module (MFRC522)
моя задача.
1. когда Arduino получает 10 импульсов и на модуле первая метка - отправить на светодиод 11 импульсов.
2. когда Arduino получает 10 импульсов и на модуле вторая метка - отправить на светодиод 12 импульсов.
3. когда на модуле нет метки - отправить на светодиод столько импульсов сколько получил.
у меня то задача немного сложная ,, у меня есть Arduino Uno, RFID module (MFRC522)
моя задача.
1. когда Arduino получает 10 импульсов и на модуле первая метка - отправить на светодиод 11 импульсов.
2. когда Arduino получает 10 импульсов и на модуле вторая метка - отправить на светодиод 12 импульсов.
3. когда на модуле нет метки - отправить на светодиод столько импульсов сколько получил.
ладно, давайте по порядку. В моем коде чтения меток что не так работает?
когда на модуле первая метка и получает 10 импульсов то вызывает функцию in(); то вызывает функцию tas();
Давайте попробуем временно убрать все функции и оставить только чтение ключа и вывод данных:
Замените loop вот на этот код и посмотрите, что будет валиться (и с какой скоростью) в Serial
UPD - если еще не изменили код - добавьте коротенький delay(50) в самом начале,
сейчас работает ,, открываю Монитор Порта и когда приближаю метку нормально выводит ключь
сейчас работает ,, открываю Монитор Порта и когда приближаю метку нормально выводит ключь
Устойчиво выводит номер? Сообщения "NO card" не проскаивают при приложенной метке?
проскаивает
проскаивает
Думаю, это и есть причина. почему у вас первый скетч не работал. У вас происходит "дребезг" чтения карты. аналогично дребезгу контактов кнопки при нажатии. Пока вы прикладываете карту, цикл loop успевает выполнится тысячи раз и столько же раз пытается считать карту, а RFID не всегда читает ее верно, особенно когда вы ее только подносите или когда снимаете со считывателя.
И кроме того, пока карта на считывателе - ваши процедуры qsan() и tas() тоже будут запускаться бесконечно - кмк. это не то, что вы хотели.
Надо сделать так - после того, как считыватель принял сигнал о прикладывании карты - ждем 20-50 мс и считываем снова. Если ключ карты тот же - значит это не ошибка и карта действительно приложена - выполняем процедуры. Если на выходе ноль - ничего не делаем.
И вообще, опрашивать считыватель вряд ли стоит чаще 5-10 раз в секунду.
смотрите ,, у меня импульсы передает монетоприемник CH-924 и дребезгов нет + у меня там функция debvance который убирает дребизг))
и знаете интересно то что когда я убираю условие 124 строки,все четко работает:
когда на считывателе первая метка - получает 10 импульсов отправляет 11
когда на считывателе вторая метка - получает 10 импульсов отправляет 12
как и есть в функциях.
смотрите ,, у меня импульсы передает монетоприемник CH-924 и дребезгов нет + у меня там функция debvance который убирает дребизг))
и знаете интересно то что когда я убираю условие 124 строки,все четко работает:
Я имею в виду дребезг чтения RFID - и он у вас безусловно есть. Когда вы убираете условие строки 124 - вы просто перестаете получать сообщения об этом дребезге, но сам дребезг никуда не девается.
Это как предложить больному не делать анализы, чтобы не расстраиватся...
Дело ваше - делайте как хотите. Куда двигаться. чтобы решить проблему - я предложил.
аааа да понял ,, а где правильно дабавить delay(50); ?
так?
???
аааа да понял ,, а где правильно дабавить delay(50); ?
так?
да, можно тут
все же не есть дребезг((
но я знаю другое решение вопроса можете помочь??
??
Народ уточнить бы такие моменты..понятно что авторизация по номеру карты лажа полная, т.к. она читается всеми и всяко разно кому не лень... но вот тут возникает вопрос касательно чтения как раз запороленых данных. Вот это меня и интересует чтение изапись данных запороленых ключем А и/или Б. Статей конечно почитал и кой что знаю но пока уверености нет вот и хотелось бы спросить тех кто все же умеет их записывать, ставить ключ и читать...короче спецов.
Начнем вот с чего: что мне все же не удалось выяснить - Вощьмем к примеру 15 сектор будет достаточно для понимания:
[Сек][Бло№][Байты 1, 2, 3- 15][Флаги защиты]
15 63 00 00 00 00 00 00 FF 07 80 69 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 ]
Из некоторых личных соображений не удалось понять следующие - ключ А и Б на ходятся в каждом блоке или они распространяются только на целый сектор в котором 4 блока? Понятно что ключ А имеет адрес 0-5 а ключ Б 10-15
Похже удалось найти такую информацию которая меня повергла в замешательство с примером из среды..если посмотреть на таблицу выше то там есть флаги защиты а тут такая инфа:
Сектор
Блок
Порядковый номер блока
Функция
0
0
0
UID и информация завода-изготовителя чипа
0
1
1
Данные
0
2
2
Данные
0
3
3
Sector Trailer (Ключ A, условие доступа, Ключ B)
...
...
...
...
15
0
60
Данные
15
1
61
Данные
15
2
62
Данные
15
3
63
Sector Trailer (Ключ A, условие доступа, Ключ B)
Напрягает это: Sector Trailer (Ключ A, условие доступа, Ключ B)
p985850, вы бы новую тему начали? А то непонятно, к чему ваш вопрос и какое он имеет отношение к предыдущему обсуждению.
b707 вопрос решился ,, вот и код
Suro, так в чем проблема была?
Автор меня интересует как записать информацию на карту и защитить паролем и потом вводя пароль читать данные. Вы знаете как? Рассматрев библию оказалось сожновато что то понять
Автор меня интересует как записать информацию на карту и защитить паролем и потом вводя пароль читать данные. Вы знаете как? Рассматрев библию оказалось сожновато что то понять
ОК, значит вопрос к автору темы.
Я бы все-таки советовал создать новую тему, если вы хотите, чтобы ваш вопрос прочитали больше 1-2х человек. И четче сформулировать вопрос.
p985850 этого я не знаю извените )
b707 не помните??
мы пытались сделать так, чтобы устойчиво выводил номер карты ,, сообщение "No Card" не проскаивался при приложенной метке
Вот инетересный код надыбал
#include
#include
#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.
MFRC522::MIFARE_Key key;
/**
* Initialize.
*/
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
// Prepare the key (used both as key A and as key B)
// using FFFFFFFFFFFFh which is the default at chip delivery from the factory
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
Serial.println("Scan a MIFARE Classic PICC to demonstrate read and write.");
Serial.print("Using key (for A and B):");
dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
Serial.println();
Serial.println("BEWARE: Data will be written to the PICC, in sector #1");
}
/**
* Main loop.
*/
void loop() {
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
return;
// Show some details of the PICC (that is: the tag/card)
Serial.print("Card UID:");
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print("PICC type: ");
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
// Check for compatibility
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println("This sample only works with MIFARE Classic cards.");
return;
}
// In this sample we use the second sector,
// that is: sector #1, covering block #4 up to and including block #7
byte sector = 1;
byte blockAddr = 4;
byte dataBlock[] = {
0x9B, 0x83, 0x7B, 0xB5, // 1, 2, 3, 4,
0xC3, 0x5D, 0xF6, 0xC9, // 5, 6, 7, 8,
0xFE, 0x31, 0x32, 0x30, // 9, 10, 255, 12,
0x34, 0xFF, 0x00, 0x00 // 13, 14, 15, 16
};
byte trailerBlock = 7;
byte status;
byte buffer[18];
byte size = sizeof(buffer);
// Authenticate using key A
Serial.println("Authenticating using key A...");
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print("PCD_Authenticate() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Show the whole sector as it currently is
Serial.println("Current data in sector:");
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println();
// Read data from the block
Serial.print("Reading data from block "); Serial.print(blockAddr);
Serial.println(" ...");
status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print("MIFARE_Read() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print("Data in block "); Serial.print(blockAddr); Serial.println(":");
dump_byte_array(buffer, 16); Serial.println();
Serial.println();
// Authenticate using key B
Serial.println("Authenticating again using key B...");
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print("PCD_Authenticate() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write data to the block
Serial.print("Writing data into block "); Serial.print(blockAddr);
Serial.println(" ...");
dump_byte_array(dataBlock, 16); Serial.println();
status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print("MIFARE_Write() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.println();
// Read data from the block (again, should now be what we have written)
Serial.print("Reading data from block "); Serial.print(blockAddr);
Serial.println(" ...");
status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print("MIFARE_Read() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print("Data in block "); Serial.print(blockAddr); Serial.println(":");
dump_byte_array(buffer, 16); Serial.println();
// Check that data in block is what we have written
// by counting the number of bytes that are equal
Serial.println("Checking result...");
byte count = 0;
for (byte i = 0; i < 16; i++) {
// Compare buffer (= what we've read) with dataBlock (= what we've written)
if (buffer[i] == dataBlock[i])
count++;
}
Serial.print("Number of bytes that match = "); Serial.println(count);
if (count == 16) {
Serial.println("Success :-)");
} else {
Serial.println("Failure, no match :-(");
Serial.println(" perhaps the write didn't work properly...");
}
Serial.println();
// Dump the sector data
Serial.println("Current data in sector:");
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println();
// Halt PICC
mfrc522.PICC_HaltA();
// Stop encryption on PCD
mfrc522.PCD_StopCrypto1();
}
/**
* Helper routine to dump a byte array as hex values to Serial.
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
Вот таким образом можно писать данные в карту
p985850 - вы ж вроде давно на форуме, несколько тем создали, а код так и научились выкладывать? - в таком виде, какой бы он ни был "интересный", смотреть его вряд ли кто захочет