RFID PN532+тормоза ардуино
- Войдите на сайт для отправки комментариев
Добрый день. Есть проект состоит из Arduino UNO R3+RFID PN532 (китаец, не от адафрут, подключен по HSU)+ethernet модуль enc28j60 (запрограммирован работать как web-server). Проблема в следующем ставлю на пинг модуль enc28j60, а RFID PN532 находится в режиме чтения карт. Когда рядом с RFID нет карты, то пинги до enc28j60 составляют от 200 до 2000мс, причем значение каждый раз плавает и на запросы через браузер ответы приходят также с задержкой до 2000мс. Стоит только RFID модуль положить карту, то пинги падают 20-30мс и сервер отвечает сразу же. Также, если отключить RFID от контроллера или снять питания, то пинги приходят быстро и сервер отвечает махом. Такое чувство, что RFID в режиме ожидания карты съедает все время процессора, в чем может быть дело?
Прикладываю код проекта
//RFID library
#include <PN532_HSU.h>
#include <PN532.h>
PN532_HSU pn532hsu(Serial);
PN532 nfc(pn532hsu);
//RFID data
uint8_t data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Data for send/recieve
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
bool writeMode =false; // Write mode on RFID
uint8_t keya[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; // keyA
//String
String readString = String(32);
String cmdString = String(32);
String numberString = String(32);
char c;
int ind1 = 0;
int ind2 = 0;
int ind3 = 0;
#include <EEPROM.h>
#include <SPI.h>
#include <UIPEthernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 10, 0, 1, 200 }; // IP адрес (изменить в title)
EthernetServer server(80);
int i = 0;
//TIME
const int addrWW = 1000;
const int addrHH = 1001;
byte WW = 0;
byte HH = 0;
byte MM = 0;
unsigned long timeMillis;
unsigned long timeBuffer;
int newHHMM = 0;
//------------------------------------------------
//-------------- инициализация -------------------
//------------------------------------------------
void setup()
{
//Старт
Serial.begin(115200);
//Ethernet
Ethernet.begin(mac);
//DHCP
// Serial.print("localIP: ");
Serial.println(Ethernet.localIP());
// Serial.print("subnetMask: ");
// Serial.println(Ethernet.subnetMask());
// Serial.print("gatewayIP: ");
// Serial.println(Ethernet.gatewayIP());
// Serial.print("dnsServerIP: ");
// Serial.println(Ethernet.dnsServerIP());
server.begin();
//RFID
nfc.begin();
nfc.SAMConfig();
//Инициализация времени
HH = EEPROM.read(addrHH);
WW = EEPROM.read(addrWW);
MM = 0;
//Info
Serial.println("device is run");
}
//------------------------------------------------
//------------------- цикл -----------------------
//------------------------------------------------
void loop()
{
//чтение первой страницы RFID карты
//var
//RFID on
//nfc.begin();
uint8_t success;
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
if (success)
{if (writeMode)
{unsigned long time_;
int timeDelta;
time_ = millis();
// ожидание карточки 1 минуту
timeDelta = int((time_ - timeMillis)/60000);
if (timeDelta!=0) {writeMode = false;}
if (writeMode)
{success = nfc.mifareclassic_AuthenticateBlock (uid, uidLength, 1, 0, keya);
if (success)
{nfc.mifareclassic_WriteDataBlock (1, data);
writeMode = false;
}
}
}
else
{success = nfc.mifareclassic_AuthenticateBlock (uid, uidLength, 1, 0, keya);
if (success)
{success = nfc.mifareclassic_ReadDataBlock (1, data);
if (success)
{//vars
int addr = 0;
bool whileLoopFinish = false;
uint8_t prevEmployee = 0;
uint8_t prevWW = 0;
uint8_t prevHH = 0;
//Find blank block
while (whileLoopFinish==false)
{//check last employee
prevEmployee = EEPROM.read(addr);
prevWW = EEPROM.read(addr+1);
prevHH = EEPROM.read(addr+2);
//Protect from dublication
if (data[0]==prevEmployee && WW==prevWW && HH==prevHH) {whileLoopFinish = true;}
//Write
if (EEPROM.read(addr)==0 && EEPROM.read(addr+1)==0 && EEPROM.read(addr+2)==0 && EEPROM.read(addr+3)==0 && whileLoopFinish == false)
{EEPROM.write(addr,data[0]);
EEPROM.write(addr+1,WW);
EEPROM.write(addr+2,HH);
EEPROM.write(addr+3,MM);
whileLoopFinish = true;
}
//increment
addr = addr + 4;
//All blocks without last block which reserved for finish point
if (addr>=addrWW) {whileLoopFinish = true;}
}
}
}
}
}
//nfc.shutDown();
// Работа со временем
timeCurrent();
// Обработка запросов от сервера
EthernetClient client = server.available();
if (client)
{while (client.connected())
{if (client.available())
{c = client.read();
//read char by char HTTP request
if (readString.length() < 32)
{//store characters to string
readString.concat(c);
}
if (c == '\n')
{ind1 = readString.indexOf('/');
ind2 = readString.indexOf('=');
ind3 = readString.indexOf('H');
cmdString = readString.substring(ind1+1, ind2);
numberString = readString.substring(ind2+1, ind3-1);
// Выводим всех работников при запросе
if (cmdString == "log")
{client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println();
client.println("<!DOCTYPE html>");
client.println("<html>");
client.println("<body>");
i=0;
// while (i<=100)
// while (EEPROM.read(i)!=0 && EEPROM.read(i+1)!=0 && EEPROM.read(i+2)!=0 && EEPROM.read(i+3)!=0)
while (EEPROM.read(i)!=0 && i<=addrWW)
{client.print("<p>");
client.print(EEPROM.read(i));
client.print(".");
client.print(EEPROM.read(i+1));
client.print(".");
client.print(EEPROM.read(i+2));
client.print(".");
client.print(EEPROM.read(i+3));
client.print("</p>");
i=i+4;
}
client.println("</body>");
client.println("</html>");
client.stop();
}
// Записываем новое время
if (cmdString == "nt")
{newHHMM = numberString.toInt();
Serial.println(numberString);
HH = int(newHHMM/100);
MM = newHHMM - HH*100;
EEPROM.write(addrHH, HH);
}
// Записываем новый день
if (cmdString == "nd")
{WW = numberString.toInt();
EEPROM.write(addrWW, WW);
}
// Очищаем память
if (cmdString == "clr")
{i=0;
for (int i=0; i<=1000; i++ ) {EEPROM.write(i,0);}
}
// Записываем нового пользователя
if (cmdString == "nu")
{data[0] = numberString.toInt();
timeBuffer = millis();
writeMode = true;
}
// передать успешную команду
if (cmdString != "log")
{client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println();
client.println("<!DOCTYPE html>");
client.println("<html>");
client.println("<body>");
client.println("<p>");
client.println("ok");
client.println("</p>");
client.println("</body>");
client.println("</html>");
client.stop();
}
}
}
}
}
readString="";
}
//------------------------------------------------
//-------------- текущее время -------------------
//------------------------------------------------
void timeCurrent()
{
unsigned long time_;
int timeDelta;
time_ = millis();
// изменение в минутах
timeDelta = int((time_ - timeMillis)/60000);
if (timeDelta>0)
{timeMillis = time_;
MM=MM+timeDelta;
//minutes++
if (MM>=60)
{MM=0;
HH=HH+1;
if (HH!=24)
{EEPROM.write(addrHH, HH);
EEPROM.write(addrWW, WW);
}
}
//hours++
if (HH>=24)
{HH=0;
WW=WW+1;
//day of week++
if (WW>=7) {WW=0;}
// сохранение времени
EEPROM.write(addrHH, HH);
EEPROM.write(addrWW, WW);
}
}
// превышение счетчика времени
if (timeDelta<0) {timeMillis = time_;}
}
Проблема в том что вы используете асинхронный интерфейс Serial для чтения модуля, а он молчит и так до таймаута. Надо SPI попробовать или I2C.
Проблема в том что вы используете асинхронный интерфейс Serial для чтения модуля, а он молчит и так до таймаута. Надо SPI попробовать или I2C.
Спасибо, перешел на I2C, помогло.