RFID и реле
- Войдите на сайт для отправки комментариев
Втр, 06/03/2018 - 22:06
Помогите с кодом. Не работает.
Логика: если концевик kv1=HIGH, то RFID считывает карту и включает реле relay1.
Подключил правильно, проверял тестовым скетчем. Реле работает, RFID в сериал порт отправляет.
Подозреваю что с "for" что то напутал.
#include <SPI.h>
#include <MFRC522.h> // библиотека "RFID"
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
bool perenos = false;
// ----РАСПИНОВКА-----
int kv1 = 2; //пин концевика1
int kv2 = 3; //пин концевика2
int relay1 = 5; //реле1
int relay2 = 1; //реле2
int but1 = 7; //конпка1
int but2 = 8; //кнопка2
unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате
/* --------ДАННЫЕ ДЛЯ ВВОДА-----------*/
int x=1; //количество карточек
unsigned long cards [ 2 /* ввести колво карточек вмемто 1*/]{3230407588, 2643501689};
void setup() {
SPI.begin(); // инициализация SPI
mfrc522.PCD_Init(); // инициализация MFRC522
Serial.begin(9600);
}
void loop() {
/* проограмма работы с первым концевиком*/
int kv1_sost = digitalRead(kv1);
if(kv1_sost){
for (byte i = 0; i < mfrc522.uid.size; i++) //считывание UID карты
{
uidDecTemp = mfrc522.uid.uidByte[i];
uidDec = uidDec * 256 + uidDecTemp;
}
for(int a=0; a<=x; a++){
if(uidDec == cards[a]){
digitalWrite(relay1, HIGH);
}
else digitalWrite(relay1, LOW);
}
}
}
/*Программа работы со вторым концевиком*
int kv2_sost = digitalRead(kv2);
if(kv2_sost){
digitalWrite(relay2, HIGH);
}
else digitalWrite(relay2, LOW);
Что не работает-то - реле не щелкает? Так pinMode() полагается куда-нить всунуть...
/**/ #include <SPI.h> #include <MFRC522.h> // библиотека "RFID" MFRC522 mfrc522(/*SS пин*/10, /*RST пин*/9); bool perenos = false; // ----РАСПИНОВКА----- const byte kv1Pin = 2; //пин концевика1 const byte kv2Pin = 3; //пин концевика2 const byte relay1Pin = 5; //реле1 const byte relay2Pin = 1; //реле2 const byte but1Pin = 7; //кнопка1 const byte but2Pin = 8; //кнопка2 unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате /* --------ДАННЫЕ ДЛЯ ВВОДА-----------*/ int x = 1; //количество карточек unsigned long cards [ 2 /* ввести колво карточек вмемто 1*/] {3230407588, 2643501689}; void setup() { SPI.begin(); // инициализация SPI mfrc522.PCD_Init(); // инициализация MFRC522 Serial.begin(9600); pinMode(kv1Pin, INPUT); pinMode(kv2Pin, INPUT); pinMode(relay1Pin, OUTPUT); pinMode(relay2Pin, OUTPUT); pinMode(but1Pin, INPUT); pinMode(but2Pin, INPUT); } void loop() { /* проограмма работы с первым концевиком*/ int kv1_sost = digitalRead(kv1Pin); if (kv1_sost) { for (byte i = 0; i < mfrc522.uid.size; i++) //считывание UID карты { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } digitalWrite(relay1Pin, LOW); for (int a = 0; a <= x; a++) { if (uidDec == cards[a]) digitalWrite(relay1Pin, HIGH); } } /*Программа работы со вторым концевиком*/ int kv2_sost = digitalRead(kv2Pin); if (kv2_sost) { digitalWrite(relay2Pin, HIGH); } else digitalWrite(relay2Pin, LOW); }Про pinMode() я и забыл.
пин мод я уже поставил. Спасибо. Только теперь реле сразу включается и остается включенным, на кнопку и карту не реагирует.
Квон там что-то зафиксил в строках 41-44
А на модуле реле, на пине in, должно быть напряжение...если подключить только VCC и GND?
Да должно быть.
Не помогло. Реле включается и все. Не риагирует больше ни на что.
Если убираю метки в строке
unsigned long cards [ 1 /* ввести колво карточек вмемто 1*/] {}реле отключается...соответственно карта не читается. Значит дело в данных ввода карты. Куда копать? Ткните носом.
Натыкайте Serial.println() около всех digitalWrite(). Так поймёте, какой срабатывает не по уставу.
А то, может, реле-то у вас инвертированное вообще...
Реле проверил блинком...работает. Попробую с сериалом, что покажет.
Возникла другая проблема. Как сделать, чтобы пока карта приложена к считывателю, реле включено, как убрал карту, реле отключается?
valiant, опять играете в угадай-ку. Пошло не пошло. Программы перед тем как писать код надо проектировать.
#27
Често говоря не понял к чему это. Проекты рождаются в процессе. За ссылку спасибо. Только там нет ответа на мой вопрос.
Реализовываются в процессе. А сначало идет задумка и методы ее реализации. Так считыватель может определить что карта приложена и какой код на ней. Но считыватель никак не может определить что карта только что убрана. Потому что железо это ну очень тупое. По крайней мере так в библиотеке "написано". Вы хотите написать свою библиотеку для умного RFID. Есть другой подход - сделать "умное реле". Пока приходит команды -"держать включеным", то разумеется быть включеным . А если команды прекратились закрыть. Так и реализовано в том скетче что я предложил.
ПС: Не нравится , то продолжайте "рожать в процессе".
Получается монитор порта будет бесконечно считывать карту? Т.е. в мониторе UID карты будет читать и отправлять бесконечно, пока карту не убрали?
В бесконечном чтении карты ниче плохого. В конце концев именно так ридер убеждается что в поле именно та карта.
А Вы не задумывались какая воще длина UID прежде чем в лонг его запихивать? Заметте, внутри либки он не в лонге лежит. И кроме mfrc522.PCD_Init(); с ридером вобще ниче делать не собираетесь? А как понять
intx=1;//количество карточеки тут жеunsignedlongcards [ 2. Шизофрения? Ваш код огорчает меня. Не пишите больше.Вот как определить что предмет исчез. Вот предмет есть, есть, есть , нет. Вам надо на него смотреть и тогда вы увидете его "исчезновение". Можно конечно закрыть глаза. Но тогда исчезновение его не увидете. Точнее все исчезнет и предмет тоже. Но ведь надо определить время исчезновения именно предмета, а не всего . Программирование это прежде всего умение работать с абстракциями, переходить с одного уровня абстракций на другой. А искать тупо решение в синтаксе языка Си или в методах кем-то написаной библиотеки не очень продуктивно. Поэтому я написал что вы играете в угадай-ку.
Чтоб определить что предмет исчез можна не смотреть а положить на него .. руку например. Тогда даже заснуть можна, а исчезновение почувствуется. Чип модуля RFID может почувствовать исчезновение карты по изменению поля. Но интерфейса к внутренним возможностям 522-го нету. Да и сам метод - не гуд, мало ли кто там в поле появился и потребляет. И опять же опрашивать пришлось бы всеравно, если прерывания не настроить;) Но нету- значить нету. Сделать select и получить UID - самое оно. А то что valiant тычет в слепую и копипастит шонипопаде - ага. И это плохо.
Ребят я же учусь еще. Че нападаете? Знал бы все, не задавал бы здесь вопросы. По поводу того, что монитор будет бесконечно считывать, я спросил потому, что мне нужно брать данные с монитор порта и отправлять в exel...получается мне в проге нужно будет отфильтровывать повторяющиеся данные.
valiant. Похоже вы не учитесь. Нет у вас данных, что бы отправлять в монитор .
В смысле нет данных? Любые данные можно снять, если есть какая либо информация. Я имел ввиду данные по UID карте, время, дата. К тому же данные, уже на этом этапе разработки, я уже считываю и отправляю в exel.
Есть данные, а есть мусор . Есть такое выражение . Человек смотрит глазами, а видит умом. Вы в скетче должны именно получить данные, а не то что сенсор показывает. Конечно курс доллара или температура в Сахаре это тоже "данные". Но зачем эти "данные " отправлять в Serial, а потом уже фильтровать Exel. ПС: Да и RFID вроде не показывает дату и время. Просто код карточки и все @_@
Rfid не показывает ,а exel показывает. Вам программу скинуть?
Нашел ответ на мой вопрос на стороннем ресурсе. Все оказалось очень просто.
Для "qwone"---РОДИЛ(!) скетч...(для qwone слово только родил).
Родил, потому, что мы (начинающие)--именно рождаем в муках скетчи и "программы"....а вы, спецы, реализовываете...потому как для вас это легко и рутина.
Думаю и этот мой скетч "обос...нуете" по своему...не важно...главное он рабочий, собран из кусков, в "муках", с добавлением моих дилетанских решений.
Железо:
RFID522, модуль реле одноканальный, кнопка, АРДУ-нано.
Логика:
1.если кнопка нажата, поднесли карту/брелок к считывателю и UID карты или брелка валидный, то реле вкл/выкл(зависит от предпочтений). Если кнопка отжата, то реле выкл/вкл.
2. если UID карты или брелка не валидный, или нет считываения(не поднесен к считывателю) при нажатии кнопки реле не работает.
3. если нажали кнопку, поднесли карту/брелок к считывателю и не убираем, кнопка включает и выключает реле, пока не уберем карту/брелок(UID обнуляется).
Собссстна код:
#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; // для храниения номера метки в десятичном формате int Relay = 6; int knc = 5; int buttonState = 0; void setup() { Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. pinMode(Relay, OUTPUT); // устанавливаем реле pinMode(knc, INPUT_PULLUP); } void loop() { buttonState = digitalRead(knc); if ((buttonState == HIGH) && (uidDec == 3230407588, 2643501689)) // Сравниваем Uid метки { digitalWrite(Relay, HIGH);//реле включено } if (buttonState == LOW) { digitalWrite(Relay, LOW); } if ((uidDec != 3230407588) && (uidDec != 2643501689)) { digitalWrite(Relay, LOW); } if (buttonState == LOW) { uidDec = 0; } // Поиск новой метки 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 метки в консоль. }valiant, я конечно понимаю все. рабатает и ладно. Но что это за бред в коде
22if((buttonState == HIGH) && (uidDec == 3230407588, 2643501689))// Сравниваем Uid меткизапятая как не работает.
Работает. Вот сижу с железом перед компом, специально удалил второй UID после запятой...не работатет брелок....вернул, работает. Нету у меня больше UID меток...так бы проверил. У брата "Ляо" заказал...скоро придут 10 штук...добавлю через зпт, проверю.
тогда и так будет работать.Как вариант можно вытряхнуть все что до запятой включая и запятую
Хм..и так работает. Просто если "вытряхнуть", то мне как начинающему, будет трудно(в будущем) распределять UID-ы для разных целей...этот скетч основа...там еще будет шаговик, серва, матричная клава, кнопки, концевики...вообщем много чего еще. Однако спасибо за экономию байтов. Конечно же я знаю, что скетч можно "ужать" с разными миллисами, форами, массивами...но пока это для меня далеко.
valiant, вы про ужать не сильно думайте. А ..там еще будет шаговик, серва, матричная клава, кнопки, концевики... могут привести к тому что программа работать не будет. Ведь не всегда работающий скетч это сумма маленьких работающих скетчей.
Кстати ща подумал...если не вытряхивать и кол-во UID-ов будет 100500, то если нужно будет исключить какой то UID, можно просто стереть из строки, не ковыряя остальной код...и, если его же, потом нужно будет добавить, просто вернуть. Сейчас протестировал. Стер второй UID, а из условия
не удалял... скетч работает.
Хм..и так работает. Просто если "вытряхнуть", то мне как начинающему, будет трудно(в будущем) распределять UID-ы для разных целей...этот скетч основа...там еще будет шаговик, серва, матричная клава, кнопки, концевики...вообщем много чего еще. Однако спасибо за экономию байтов.
Валиант, вы вообще чтоль в программировании не шарите? - Какая "экномия байтов"? то, что предложил qwone - это была ИРОНИЯ. Он вам предложил выкинуть вовсе проверку на валидный UID. потому что вот в этом коде:
-ПРОВЕРКА НЕ РАБОТАЕТ. Чтобы убедится в этом - просто поменяйте UID-ы на любые левые - только не один, а оба - условие так же будет срабатывать, как и с правильными.Валиант, вы вообще чтоль в программировании не шарите?
В чем я шарю нужно будет учить 15 лет, а потом упорно работать 20 лет.
Прежде чем задавать такие вопросы, читать надо все посты.