[code]
// библиотека для работы с RFID/NFC
#include <Adafruit_PN532.h>
// бибилиотека для работы со стрелой
#include <Strela.h>
// бибилиотека для ИК приёмника
#include <IRremote.h>
//библиотека для дисплея
#include <LiquidCrystal_I2C.h>
//#include <LiquidCrystal.h>
// даем имя пину подключения ИК приёмника
int RECV_PIN = P8;
// даем имя пину на котором расположен встроенный светодиод
int LED_PIN = L1;
#define PN532_IRQ P9
// создаём объект для работы со сканером и передаём ему два параметра
// первый — номер пина прерывания
// вторым — число 100
// от Adafruit был программный сброс шилда
// в cканере RFID/NFC 13,56 МГц (Troyka-модуль) этот пин не используется
// поэтому передаём цифру, большая чем любой пин Arduino
Adafruit_PN532 nfc(PN532_IRQ, 100);
// указываем к какому пину подключен ИК приёмник
IRrecv irrecv(RECV_PIN);
decode_results results;
// Создадим объект lcd, который будет выводить текст на экран
LiquidCrystal_I2C lcd(LC_ADDR, LCEN, LCRW, LCRS, LC4, LC5, LC6, LC7);
//количество просмотренных карт
byte assume_card=0;
uint8_t ArrayOfCard[40][8];
void setup()
{
// инициируем открытие сериал порта и указываем его скорость
Serial.begin(9600);
// запускаем работу ИК приемника
irrecv.enableIRIn();
nfc.begin();
int versiondata = nfc.getFirmwareVersion();
if (!versiondata) {
Serial.print("Didn't find RFID/NFC reader");
while(1) {
}
}
// инициализация массива
for(uint8_t a=0;a<40;a++){
for(uint8_t b=0;b<8;b++){
ArrayOfCard[a][b]=0; //{0,0,0,0,0,0,0,0};
}
}
Serial.println("Found RFID/NFC reader");
// настраиваем модуль
nfc.SAMConfig();
Serial.println("Waiting for a card ...");
//Инициализация экрана. У нашего экрана 8 символов 2 строки
lcd.begin(8, 2);
//Переместим курсор в начало первой стройки (символ 0, строка 0)
lcd.home();
//Печатаем строку
lcd.print("RFID/NFC");
//Переместим строку в начало второй строки (символ 0, строка 1)
lcd.setCursor(0, 1);
//Печатаем строку
lcd.print(" Found! ");
//Пауза, чтобы успеть насладиться результатом
delay(2000);
lcd.home();
//Печатаем строку
lcd.print("Waiting ");
//Переместим строку в начало второй строки (символ 0, строка 1)
lcd.setCursor(0, 1);
//Печатаем строку
lcd.print("a card ");
//Пауза, чтобы успеть насладиться результатом
delay(2000);
}
void loop()
{
//часть для работы с rfid
uint8_t success;
// буфер для хранения ID карты
uint8_t uid[8];
// размер буфера карты
uint8_t uidLength;
// принимаем данные с ИК пульта
// в зависимости от нажатой кнопки пульта
// даём разные команды роботу
// lcd.begin(16, 2);
// печатаем первую строку
//lcd.print("Hello world");
if (irrecv.decode(&results)) {
if (results.value == 0x1689609F) {
ford();
} else if (results.value == 0x1689B847) {
back();
} else if (results.value == 0x168910EF) {
left();
} else if (results.value == 0x16899867) {
right();
} else if (results.value == 0x168938C7) {
stop();
}
// ждем следующее значение
irrecv.resume();
}
// слушаем новые метки
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength,200);
// если найдена карта
if (success) {
// выводим в консоль полученные данные
Serial.println("Found a card");
Serial.print("ID Length: ");
Serial.print(uidLength, DEC);
Serial.println(" bytes");
Serial.print("ID Value: ");
nfc.PrintHex(uid, uidLength);
if(!checkUID_RFID(uid)){
for(int z=0;z<8;z++){
ArrayOfCard[assume_card][z]=uid[z];
}
Serial.println("!!!!!!!!!!!!!!!!!!!!!!!!");
nfc.PrintHex(ArrayOfCard[assume_card], 7);
Serial.println("");
// lcd.home();
//Печатаем строку
lcd.clear();
lcd.home();
assume_card=assume_card+1;
lcd.print(assume_card);
unsigned long time = millis();
lcd.setCursor(0, 1);
lcd.print(time);
melody();
//delay(1000);
}
}
}
// функция движение вперёд
void back() {
// myservoFordL.write(0);
// myservoFordR.write(180);
// myservoBackL.write(0);
// myservoBackR.write(180);
// if (irrecv.decode(&results)) {
// if (results.value == 0xFFFFFFFF) {
// drive(127, 127); //Средний ход вперёд
// }else {drive(0, 0);}
// }
//delay(500);
// drive(60, 60);
Serial.println("BACK");
lcd.clear();
lcd.home();
lcd.print("BACK");
}
// функция движение назад
void ford() {
// myservoFordL.write(180);
// myservoFordR.write(0);
// myservoBackL.write(180);
// myservoBackR.write(0);
Serial.println("FORD");
//drive(-60, -65);
lcd.clear();
lcd.home();
lcd.print("FORD");
}
// функция поворота налево
void right() {
// myservoFordL.write(180);
// myservoFordR.write(180);
// myservoBackL.write(180);
// myservoBackR.write(180);
drive(0, -50);
Serial.println("left");
}
// функция поворота направо
void left() {
// myservoFordL.write(0);
// myservoFordR.write(0);
// myservoBackL.write(0);
// myservoBackR.write(0);
Serial.println("right");
drive(-50,0);
}
// функция остановки
void stop() {
// myservoFordL.write(90);
// myservoFordR.write(90);
// myservoBackL.write(90);
// myservoBackR.write(90);
drive(0, 0);
Serial.println("stop");
}
//функция звука попал на метку
void melody(void)
{
tone(BUZZER,1046,150);
delay(300);
tone(BUZZER,1046,150);
delay(150);
tone(BUZZER,1174,300);
delay(300);
tone(BUZZER,1318,150);
}
//проверка наличия в базе текущего RFID_UID, возвращает true если есть в базе, false - если нет
boolean checkUID_RFID(uint8_t uid1[8])
{
Serial.println("uid!!!!!!!!!!!!!!!!!");
nfc.PrintHex(uid1, 7);
Serial.println("array0!!!!!!!!!!!!!!!!!");
nfc.PrintHex(ArrayOfCard[0], 7);
Serial.println("array1!!!!!!!!!!!!!!!!!");
nfc.PrintHex(ArrayOfCard[1], 7);
Serial.println("array2!!!!!!!!!!!!!!!!!");
nfc.PrintHex(ArrayOfCard[2], 7);
Serial.println("array3!!!!!!!!!!!!!!!!!");
nfc.PrintHex(ArrayOfCard[3], 7);
boolean res;
for(int a=0;a<assume_card;a++){
Serial.println("+++++++++++++++++++++++++");
byte i=0;
while(i<8){
Serial.print("~");
Serial.print(ArrayOfCard[a][i]);
Serial.print("===");
Serial.print(uid1[i]);
if(ArrayOfCard[a][i]!=uid1[i]){
res=false;
break;
}
i++;
res=true;
}
if(res){return true;}
}
return false;
}
[/code]