Пользовался RFID меткой с библиотекой <MFRC522.h>. Возникла проблема, при поиске новой метки цикл программы останавливается. То есть ждет пока поднесут метку. Код (C++): // poisk novoy metki if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Vibor metki if ( ! mfrc522.PICC_ReadCardSerial()) { return; } Мне же нужно, чтобы программа продолжала работать циклически. Пытался использовать библиотеку <RFID.h> , но бесполезно. Пытался как-то работать с выходом прерывания RC522 - IRQ. Но по видимому он не работает. Прошу помощи, как сделать опрос метки по прерыванию или же так, чтобы программа продолжала работать, а не ждала пока сработает rfid метка.
Код (C++): ! mfrc522.PICC_IsNewCardPresent(); // Vibor metki if ( ! mfrc522.PICC_ReadCardSerial()) { return; } Если так, то он работает точно так же и стопорится. Код (C++): ! mfrc522.PICC_IsNewCardPresent(); // Vibor metki ! mfrc522.PICC_ReadCardSerial() Если так, то серво после задержки закрывается и сразу же открывается, как я понимаю он хранит старое значение. Проблема не решилась.
убрать первый if: Код (C++): // poisk novoy metki if ( ! mfrc522.PICC_IsNewCardPresent()) { return; }
Код (C++): if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Vibor metki if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Vida4a seriynogo nomera metki for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } // Serial.println("Card UID: "); // Serial.println(uidDec); if (uidDec == 2422114125) { servo.write(90); delay(3000); } Вот весь код. Если первый if убрать, то серво вообще не будет реагировать. Не будет работать.
Код (C++): #include <Servo.h> #include <SPI.h> #include <MFRC522.h> // библиотека "RFID". #define SS_PIN 53 #define RST_PIN 5 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате Servo servo; void setup() { Serial.begin(9600); // Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(10); servo.write(0); // устанавливаем серву в закрытое сосотояние } void loop() { // Vibor metki if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Vida4a seriynogo nomera metki for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } // Serial.println("Card UID: "); // Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 2422114125) // Сравниваем Uid метки, если он равен заданому то серва открывает. { servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. } servo.write(0); // устанавливаем серву в закрытое сосотояние } Можете сами проверить. rfid без этой команды не работает
работает Код (C++): #include <Servo.h> #include <SPI.h> #include <MFRC522.h> // библиотека "RFID". #define SS_PIN 53 #define RST_PIN 5 unsigned long uidDec; // для хранения номера метки в десятичном формате MFRC522 mfrc522(SS_PIN, RST_PIN); Servo servo; unsigned long readRFID(); void setup() { Serial.begin(9600); // Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(10); servo.write(0); // устанавливаем серву в закрытое сосотояние } void loop() { uidDec = readRFID(); if (uidDec > 0) { Serial.print("Card UID: "); Serial.println(uidDec); } if (uidDec == 2422114125) { servo.write(90); delay(3000); } servo.write(0); // устанавливаем серву в закрытое сосотояние } // Чтение меток unsigned long readRFID() { if ( !mfrc522.PICC_IsNewCardPresent()) return 0; if ( !mfrc522.PICC_ReadCardSerial()) return 0; // Vida4a seriynogo nomera metki unsigned long uidDecTemp; // для временного хранения номера метки в десятичном формате for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } return uidDec; }
Ещё вопрос если не надоел) Можно ли как-то servo.write(0) в условие "если" добавить? Там нужна булевская переменная, пытаюсь сделать ее булевской, ругается на точку.
Код (C++): if (analogRead(photorez3)<400) Грубо говоря в это условие еще нужно добавить условие Код (C++): servo.write(90); Но там понятное дело нужна булевская переменная. Возможно ли в условие команду servo.write(90) добавить? То есть если 90 градусов, то условие выполняется.
Код (C++): unsigned int servoAngle = 0; // в это месте что-то меняет переменную servoAngle if(analogRead(photorez3) < 400) { if(servoAngle == 90) { servoAngle = 0; servo.write(servoAngle); } else { servoAngle = 90; servo.write(servoAngle); } }
Жаль что до меня не дошло =) Спасибо большое Вы используете unsigned int потому что меньше байт эти переменные занимают?)
Потому что unsigned int может быть только положительным числом, в отличие от просто int. Если у тебя угол поворота не превышает 255, можно вообще тип byte использовать, для экономии ресурсов.