RFID выключатель
- Войдите на сайт для отправки комментариев
Пт, 04/11/2016 - 23:47
Добрый вечер. Решил собрать выключатель с использованием RFID карточки.Задача такая,пока карточка лежит на RFID считывателе горит лампа, карточку убираем - лампа гаснет.
из примеров состряпал нечто
#include <SPI.h> #include <MFRC522.h> // библиотека "RFID". #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате boolean switchOn = false; void setup() { Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. } void loop() { // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. 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 == 3763966293) // Сравниваем Uid метки. { switchOn = true; Serial.println("Switched On"); } else { Serial.println("Switched Off"); switchOn = false; } }
но работает не так как нужно,выключение лампы (в данном случае пока просто вывод состояния в консоль) происходит не тогда кагда я убираю карту,а тогда когда подношу карту с другим UID ,понимаю что нужно как то в цикле сделать опрос состояния "есть ли карта", а не так как у меня сделано "есть ли карта с таким uid",вот,подскажите как сделать,описание библиотеки на русском не нашел,а в английском описаниии чет никак не разберусь
https://www.youtube.com/watch?v=TR4mf4wa4nA&index=21&list=PLfDmj22jP9S759DT250VVzfZs_4VnJqLa
Если такой....
Хотя и с другими принцип тот же. И про цикл и про сравнение и всё там --- там 2 видео...
аналогичные примеры я находил, там как бы один раз происходит опрос,а мне нужно постоянно опрашивать есть ли карта с таким uid и если ее нет выключать лампу,есть включать.
Пусть человек посмотрит. А то ему напишешь, он ничего не поймет и снова придет.
Задача такая,пока карточка лежит на RFID считывателе горит лампа, карточку убираем - лампа гаснет.
если есть карта и лампа не горит - то вкл лампу.
если карты нет и лампа горит - то выкл лампу.
аналогичные примеры я находил, там как бы один раз происходит опрос,а мне нужно постоянно опрашивать есть ли карта с таким uid и если ее нет выключать лампу,есть включать.
так?
if ( mfrc522.PICC_IsNewCardPresent()) {
if ((uidDec == 3763966293) && (switchOn == false)) {
switchOn = true;
Serial.println("Switched On");
}
else
{
Serial.println("Switched Off");
switchOn = false;
В конце только скобку поставь. И получился цикл.
p.masyukov мы наверно друг друга не понимаем,вернее я Вас не понимаю,что Вы хотели эти показать мне?
01
void
loop
()
02
{
03
while
()
04
{
05
// твой код опроса меток
06
07
// Если метка правильная - идем дальше, иначе в начало кода
08
09
// твой код на какое то действие
10
}
11
12
while
()
13
{
14
// твой код опроса меток
15
// Если метка правильная - идем дальше, иначе в начало кода
16
// твой код на какое то действие
17
18
}
19
20
}
p.masyukov мы наверно друг друга не понимаем,вернее я Вас не понимаю,что Вы хотели эти показать мне?
01
Задача твоя решается не считыванием постоянно карты, а проверкой что она всё еще лежит - каждые n миллисекунд...
В твоем варианте она будет циклично переключаться.
опробовал вышеизложенное
В консоль сыпет
Switched On
Switched Off
Switched On
Switched Off
Switched On
Switched Off
Switched On
Switched Off
постоянно как только подношу карту, я расчитывал что если карта всегда поднесена то будет один раз on как только уберу один раз of
попробовал,не работает
Да Вы правы,пологаю так и происходит (выше в коде),вот с опросом через какой то интервал времини не разберусь самостоятельно
опробовал вышеизложенное............
постоянно как только подношу карту, я расчитывал что если карта всегда поднесена то будет один раз on как только уберу один раз of
Я тебе писал --- вставь в цикл...
Спасибо,попробовал,но к сожалению не работает,если подношу карточку то постоянно сыпет
Switched Off
Switched On
Switched Off
Switched On
Switched Off
Switched On
Switched Off
http://arduino.ru/forum/programmirovanie/rfid-vyklyuchatel#comment-231898
задержку какой нибудь delay(10); поставь в конце цикла while...
Вообще ничего не происходит
Там знак присваивания был а не сравнения.....
Теперь при подношении карточки в порт пишет один раз on,карту убираю off не пишет и ничего дальше не происходит
там не учитываются ошибки чтения.... тоесть любая помеха может отрубить...
Теперь при подношении карточки в порт пишет один раз on,карту убираю off не пишет и ничего дальше не происходит
А надо то ЧТО!!!
Мне надо так, если карта с определенным uid ПОСТОЯННО поднесена к рфид считывателю то горит лампа,карту убираю лампа гаснет,на другие рфид карты чтоб вообще не реагировала ,пока вместо лампы пробую эти два состояния лампа горит и не горит выводить в порт,вот сейчас с Вашим кодом получается что лампа включается но не выключается когда я убираю карту.
я так понимаю что после else в 49 строке после или перед ней нужно еще раз опросить есть ли карта
Поправил - выше
Там три строки (23 -25 ) надо убрать и куда то вонзить ---- на выключение.
перед ретурном --- возможно при чтении карты. Возможно правильно сейчас всё.
только где - не соображу сходу... давно с этой ерундой не баловался.
Ну что? Где литр?
Да от литра уже почти ничего не осталось :) Надо кого нибудь послать за новой
Фот тут то что нужно https://www.youtube.com/watch?v=CEO-QDHKaY0 там и ссылка есть на статью,но скетч не рабочий,в консоль ничего не выводит
Да от литра уже почти ничего не осталось :) Надо кого нибудь послать за новой
Значит за коньяком иди. Заработало?
Да нет, не работает,светодиод я посадил на 2ю ножку,а то на 13 spi,код чуть подправил,пробовал разные варианты,то моргание получается, то просто горит и не выключается,то вообще не включается....какой коньяк то лучше взять?
Да нет, не работает,светодиод я посадил на 2ю ножку,а то на 13 spi,код чуть подправил,пробовал разные варианты,то моргание получается, то просто горит и не выключается,то вообще не включается....какой коньяк то лучше взять?
Да никакой я не пью.
Всё. затрахался... теперь будет отключать однозначно.
Не,не работает.Если подношу карту, то в порт постоянно шлет OFF и светодиод не горит
Не,не работает.Если подношу карту, то в порт постоянно шлет OFF и светодиод не горит
всё что после 58-й строки замени на таймер ожидания.
тоесть считывать карту по несколько раз за определенный промежуток времени.
и контроль ошибок чтения сделай.
так как у тебя всё обернуто в цикл while - в любом месте можешь воткнуть и программа начнется сначала по кругу.
нехочу я цеплять rfid, возьтися с проводами... .
Лови код. Проверил. Поставишь код своей карточки.
СПАСИБО!!!!!!!!!!!!!!Действительно,все четко,все работает!Но,пожалуйста,расскажите логику работы,чет все так наворочено не пойму,хотелось бы разобраться.
Этот кусок
Вызывает опрос в цикле loop каждые 20 миллисек. Разумеется можно убрать, тогда процессор только этой хренью и будет заниматься
Это идет опрос наличия карточки, считывание этой карточки и сравнение ее с эталоном. В результате выставляется флаг rfid_OK
Этот кусок сбрасывает флаг по истечении определеного времени, если пошли неверные запросы. Смотри код выше.
Этот кусок включает лампу.
Ну а этот выключает. Конечно он должен стоят вверху блока //#1 в секции loop()
ПС: Да код плотный. Так как я использовал уже провереные куски. Но рабочим может быть код который проверен на практике. Так что пришлось не только собирать, но и тестировать ее. Что занимает больше времени чем написание. И самое главное отрабатывать кучу вариантов отсеивая не рабочие или не очень "надежные".
Спасибо!
Здравствуйте.
Возникла необходимость использовать ваш проект с несколькими картами Rfid, но что то ни как не могу сделать привязку второй карты. Либо не видит нижнюю часть кода, либо на первую карту отрабатывает без задержки, вторая работает как задумано автором кода.
Подскажите как решить проблему.
отформатируйте код нормально
Извините, но я новичек.
Что значит - отформатировать?
выровнять отступы и убрать огромные пустые куски
ДЛя первого в ИДЕ есть кнопка CTRL_T, второе - вручную
Пробовал перейти на метки в десятичном формате, предварительно записав ключи в const char* keys[]={"204 184 193 56","240 222 56 27"} - но не смог сделать запрос, не нашел чем заменить команду uidCard.
Подскажите куда копать, 4 дня уже курю форумы и как понял каждый пишет по своему, нет какого либо эталона.
выровнять отступы и убрать огромные пустые куски
ДЛя первого в ИДЕ есть кнопка CTRL_T, второе - вручную
Поправил. Не подскажите как решить дилему?
выровнять отступы и убрать огромные пустые куски
Поправил.
ругаться неохота, но ничего вы не "поправили". Неужели трудно в Ардуино ИДЕ нахать одну кнопку???
Вот так оно должно выглядеть:
смысл в том, что отступ каждой строки соответвует уровню вложенности цикла или процедуры. Так сразу видно, где начало блока, а где конец и прослеживать логику программы в разы проще
По сути посмотрю попозже.
Могу только сразу сказать - переводить метки в char* - это глупость, не надо этого делать.
хотя сразу вижу косяк, сравнение карт неверное
в условии проверки карты:
сравнения всех байт должны быть обьединены логическим оператором "И", а у вас "ИЛИ". И для второй карты тоже самое
хотя сразу вижу косяк, сравнение карт неверное
в условии проверки карты:
сравнения всех байт должны быть обьединены логическим оператором "И", а у вас "ИЛИ". И для второй карты тоже самое
Изначально было так, остальная глупость от безысходности((
Могу только сразу сказать - переводить метки в char* - это глупость, не надо этого делать.
Вам виднее. У меня мнение относительно char сложилось из за имеющегося кода, в нем не нужно лишних блоков прописывать - достаточно только номера карт вписать. Но тот код только для замка, а мне нужно именно присутствие карт на считывателе.
Изначально было так, остальная глупость от безысходности((
не понял, как было изначально, но сейчас неверно, исправляйте.
Правда, насколько я вижу, на чтение второй карты эта ошибка влиять не должна, значит есть и другие.