nrf24l01 + rfid rc522
- Войдите на сайт для отправки комментариев
Помогите не быть извращенцем. подобные проблемы нагуглиси легко, а решение что то не очень) попадалось еще решение с softspi, но с ходу не разобрался что да как с ней....
Проблема следующая.
скрестил два примера.
задача: при поднесении опеределенной метки послать сигнал по nrf24l01(почему он? я хз. наверное было бы проще взять какойнибудь передатчик 433. связь всёравно в одну сторону).
проблема: после первой отправки данных перестает отправлять.
при этом считывание карты нормально происходит и до и после отправки данных, а вот второй раз отправить данные не получается уже :/
Выклутился извращением - после каждой отправки данных делаю програмный ресет. но это ж жесть.
в чем проблема? вроде SS пинами нормально манипулирую...
пока что программа просто считывает номер метки и просто отправляет данные, введенные в монитор.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <stdint.h>
#define CE_PIN 9
#define CSN_PIN 10
const uint64_t Pipe = 0xE8E8F0F0AALL;
#include <MFRC522.h>
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
#define SS_PIN 8
#define RST_PIN 7
#define DD 4 // Pin D4 --> выход на реле
#define ZZ 5 // Pin D4 --> выход на активный зумер
#define REL DD // REL - открывает дверь
MFRC522 mfrc522(SS_PIN, RST_PIN); // MFRC522
MFRC522::MIFARE_Key key;
// готовим массив карт с флагами доступа 0-нет доступа, 1-естьдоступ (спец пропуска)
struct Cards {
String id;
int flag;
};
struct Cards cards[8] = {{"3646564140", 1}, {"1904792590", 1}, {"1637145102", 0}, {"73934703", 1}, {"4067496491", 1}, {"964301100", 1}, {"2524519168", 1}, {"1645645646", 1}};
boolean work = false;
unsigned int CUR_TIME;
unsigned int ALL_TIME;
bool needSend=false;
RF24 radio(CE_PIN, CSN_PIN);
int data[4];
void setup() {
pinMode(8, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600);
Serial.println(F("hi"));
currentTime = 0;
digitalWrite(10, HIGH);
digitalWrite(8, LOW);
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
digitalWrite(8, HIGH);
digitalWrite(10, LOW);
radio.begin();
radio.setChannel(99);
radio.setRetries(15, 30);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_MAX);
radio.setAutoAck(1);
radio.setPayloadSize(32);
radio.openReadingPipe(1, Pipe);
radio.startListening();
if (needSend)
{
needSend=false;
SendData(data[0], data[1], data[2]);
}
}
void(* resetFunc) (void) = 0; // Reset MC function
void loop()
{
if (Serial.available()) { //если в мониторе порта ввели что-то
String SerialReadBuf = "";
while (Serial.available()) { //сохраняем строку в переменную val
int ch = Serial.read();
SerialReadBuf += char(ch);
delay(10);
}
Serial.print(F("serialBuf ")); Serial.println(SerialReadBuf);
byte n = 0;
String val[] = {"", "", "", ""};
for (int i = 0; i <= SerialReadBuf.length() - 1; i++) {
if (SerialReadBuf.charAt(i) != '@') {
val[n] += SerialReadBuf.charAt(i);
}
if ((SerialReadBuf.charAt(i) == '@') && n < 3) {
n += 1;
}
}
data[0] = val[0].toInt();
data[1] = val[1].toInt();
data[2] = val[2].toInt();
data[3] = val[3].toInt();
SendData(data[0], data[1], data[2]);
needSend=true;
resetFunc();
}
ALL_TIME = (millis() / 1000);
if ((ALL_TIME - CUR_TIME) >= 5) {
work = true;
work = false;
CUR_TIME = ALL_TIME;
}
if (work == false) {
work = true;
//------------------------РАБОТАЕМ СО СЧИТЫВАТЕЛЕМ КАРТ----------------------------
// Look for new cards, and select one if present
if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
delay(50);
work = false;
return;
}
String UID = dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
// mfrc522.PICC_HaltA();
Serial.print(F("Card UID: "));
Serial.print(UID);
Serial.println();
if (UID != "") {
for (int i = 0; i <= 7; i++) {
if (cards[i].id == UID && cards[i].flag == 1) {
// ТУТ ДЕЙСТВИЕ
work = false;
return;
}
}
}
}
work = false;
}
void SendData(char receiver, char effect, char effectValue) {
byte nul = 0;
int data[] = {receiver, effect, effectValue, nul};
Serial.print(F("send radio "));
Serial.print(data[0]);
Serial.print(F("@"));
Serial.print(data[1]);
Serial.print(F("@"));
Serial.print(data[2]);
Serial.println(F("@0"));
delay(10);
digitalWrite(8, HIGH);
digitalWrite(10, LOW);
radio.stopListening();
radio.openWritingPipe(Pipe);
radio.write( &data, sizeof(data) );
radio.startListening();
radio.write( &data, sizeof(data) );
delay(10);
digitalWrite(10, HIGH);
digitalWrite(8, LOW);
// SPI.begin(); // Init SPI bus
// mfrc522.PCD_Init(); // Init MFRC522 card
}
String dump_byte_array(byte *buffer, byte bufferSize) {
// String s;
unsigned long uiddec = 0;
// unsigned long temp;
char uid[8];
for (byte m = (bufferSize > 4 ? (bufferSize - 4) : 0); m < bufferSize; m++) { //берем только последние 4 байта и переводим в десятичную систему
unsigned long p = 1;
for (int k = 0; k < bufferSize - m - 1; k++) {
p = p * 256;
}
uiddec += p * buffer[m];
// s = s + (buffer[m] < 0x10 ? "0" : "");
// s = s + String(buffer[m], HEX);
}
// s.toCharArray(uid, 8);
return String(uiddec);
}
В 152-й строке вы пытаетесь передать, но перед ней начинаете слушать, разве это правильно?
но этот косяк появился уже в поисках решения проблемы, когда я в senddata закидывал полностью блок инициализации nRF.
конечно поправил, но не заработало...
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <stdint.h> #define CE_PIN 9 #define CSN_PIN 10 const uint64_t Pipe = 0xE8E8F0F0AALL; #include <MFRC522.h> #define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF} #define SS_PIN 8 #define RST_PIN 7 #define DD 4 // Pin D4 --> выход на реле #define ZZ 5 // Pin D4 --> выход на активный зумер #define REL DD // REL - открывает дверь MFRC522 mfrc522(SS_PIN, RST_PIN); // MFRC522 MFRC522::MIFARE_Key key; // готовим массив карт с флагами доступа 0-нет доступа, 1-естьдоступ (спец пропуска) struct Cards { String id; int flag; }; struct Cards cards[8] = {{"3646564140", 1}, {"1904792590", 1}, {"1637145102", 0}, {"73934703", 1}, {"4067496491", 1}, {"964301100", 1}, {"2524519168", 1}, {"1645645646", 1}}; boolean work = false; unsigned int CUR_TIME; unsigned int ALL_TIME; bool needSend=false; RF24 radio(CE_PIN, CSN_PIN); int data[4]; void setup() { pinMode(8, OUTPUT); pinMode(10, OUTPUT); Serial.begin(9600); Serial.println(F("hi")); digitalWrite(10, HIGH); digitalWrite(8, LOW); SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 card digitalWrite(8, HIGH); digitalWrite(10, LOW); radio.begin(); radio.setChannel(99); radio.setRetries(15, 30); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_MAX); radio.setAutoAck(1); radio.setPayloadSize(32); radio.openReadingPipe(1, Pipe); radio.startListening(); if (needSend) { needSend=false; SendData(data[0], data[1], data[2]); } } void(* resetFunc) (void) = 0; // Reset MC function void loop() { if (Serial.available()) { //если в мониторе порта ввели что-то String SerialReadBuf = ""; while (Serial.available()) { //сохраняем строку в переменную val int ch = Serial.read(); SerialReadBuf += char(ch); delay(10); } Serial.print(F("serialBuf ")); Serial.println(SerialReadBuf); byte n = 0; String val[] = {"", "", "", ""}; for (int i = 0; i <= SerialReadBuf.length() - 1; i++) { if (SerialReadBuf.charAt(i) != '@') { val[n] += SerialReadBuf.charAt(i); } if ((SerialReadBuf.charAt(i) == '@') && n < 3) { n += 1; } } data[0] = val[0].toInt(); data[1] = val[1].toInt(); data[2] = val[2].toInt(); data[3] = val[3].toInt(); SendData(data[0], data[1], data[2]); needSend=true; // resetFunc(); } ALL_TIME = (millis() / 1000); if ((ALL_TIME - CUR_TIME) >= 5) { work = true; work = false; CUR_TIME = ALL_TIME; } if (work == false) { work = true; //------------------------РАБОТАЕМ СО СЧИТЫВАТЕЛЕМ КАРТ---------------------------- // Look for new cards, and select one if present if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { delay(50); work = false; return; } String UID = dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); // mfrc522.PICC_HaltA(); Serial.print(F("Card UID: ")); Serial.print(UID); Serial.println(); if (UID != "") { for (int i = 0; i <= 7; i++) { if (cards[i].id == UID && cards[i].flag == 1) { // ТУТ ДЕЙСТВИЕ work = false; return; } } } } work = false; } void SendData(char receiver, char effect, char effectValue) { byte nul = 0; int data[] = {receiver, effect, effectValue, nul}; Serial.print(F("send radio ")); Serial.print(data[0]); Serial.print(F("@")); Serial.print(data[1]); Serial.print(F("@")); Serial.print(data[2]); Serial.println(F("@0")); delay(10); digitalWrite(8, HIGH); digitalWrite(10, LOW); radio.stopListening(); radio.openWritingPipe(Pipe); radio.write( &data, sizeof(data) ); delay(10); digitalWrite(10, HIGH); digitalWrite(8, LOW); // SPI.begin(); // Init SPI bus // mfrc522.PCD_Init(); // Init MFRC522 card } String dump_byte_array(byte *buffer, byte bufferSize) { // String s; unsigned long uiddec = 0; // unsigned long temp; char uid[8]; for (byte m = (bufferSize > 4 ? (bufferSize - 4) : 0); m < bufferSize; m++) { //берем только последние 4 байта и переводим в десятичную систему unsigned long p = 1; for (int k = 0; k < bufferSize - m - 1; k++) { p = p * 256; } uiddec += p * buffer[m]; // s = s + (buffer[m] < 0x10 ? "0" : ""); // s = s + String(buffer[m], HEX); } // s.toCharArray(uid, 8); return String(uiddec); }Похоже, у нас с вами одна и таже проблема ... я ее тут описывал. Но я пришел к выводу, что проблема не в передаче, а в приеме, но пока не знаю, как ее решить.
У меня работает вот в таком странном виде:
если добавить цикл (у вас строка 149)
for(int I = 0; I < 150; I++) { // Ваша 149 строка }то передача идет как по маслу
я сам с этими модулями не работал, хотя лежит 10-ок, недавно наткнулся
http://forum.amperka.ru/threads/nrf24l01-%D0%BF%D0%BE%D0%B1%D0%B5%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C.3205/
может что то для себя подчерпнете.
http://forum.amperka.ru/threads/nrf24l01-%D0%BF%D0%BE%D0%B1%D0%B5%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C.3205/
может что то для себя подчерпнете.
Да, я это читал ... хочу этому товарищу в личку написать ...
Похоже, у нас с вами одна и таже проблема ... я ее тут описывал. Но я пришел к выводу, что проблема не в передаче, а в приеме, но пока не знаю, как ее решить.
У меня работает вот в таком странном виде:
если добавить цикл (у вас строка 149)
for(int I = 0; I < 150; I++) { // Ваша 149 строка }то передача идет как по маслу
я удивлен, но работает) причем из раза в раз из 149 пакетов приходит 147... пожалуй I можно уменьшить до 10)
спасибо) но это всеравно не элегантно :)
кстати проблема все же в передаче. когд без считывателя отрабатывает отлично
окай, отправка худо бедно работает.... а что делать с приемом?) благо мне не нужна двусторонняя связь, но на будущее надо знать)
окай, отправка худо бедно работает.... а что делать с приемом?) благо мне не нужна двусторонняя связь, но на будущее надо знать)
Конечно, добавить цикл, не понимая его назначение - это не только не элегантно, это еще и ущемляет мою гордость ... :) Мне надоели все эти пляски с бубном вокруг библиотеки nrf, возможно, она что-то не учитывает или есть какая-то тайна ... поэтому, продолжая поиски примеров на просторах вселенной, я наткнулся на таковой, который сразу заработал: http://www.elecfreaks.com/203.html
Теперь осталось разобрать и понять каждую строчку примера и приспособить для себя .... с учетом плохого знания языка - на это уйдут многие годы :) Там используется софтверный spi