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.
конечно поправил, но не заработало...
Похоже, у нас с вами одна и таже проблема ... я ее тут описывал. Но я пришел к выводу, что проблема не в передаче, а в приеме, но пока не знаю, как ее решить.
У меня работает вот в таком странном виде:
если добавить цикл (у вас строка 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)
то передача идет как по маслу
я удивлен, но работает) причем из раза в раз из 149 пакетов приходит 147... пожалуй I можно уменьшить до 10)
спасибо) но это всеравно не элегантно :)
кстати проблема все же в передаче. когд без считывателя отрабатывает отлично
окай, отправка худо бедно работает.... а что делать с приемом?) благо мне не нужна двусторонняя связь, но на будущее надо знать)
окай, отправка худо бедно работает.... а что делать с приемом?) благо мне не нужна двусторонняя связь, но на будущее надо знать)
Конечно, добавить цикл, не понимая его назначение - это не только не элегантно, это еще и ущемляет мою гордость ... :) Мне надоели все эти пляски с бубном вокруг библиотеки nrf, возможно, она что-то не учитывает или есть какая-то тайна ... поэтому, продолжая поиски примеров на просторах вселенной, я наткнулся на таковой, который сразу заработал: http://www.elecfreaks.com/203.html
Теперь осталось разобрать и понять каждую строчку примера и приспособить для себя .... с учетом плохого знания языка - на это уйдут многие годы :) Там используется софтверный spi