RFID и реле

valiant
Offline
Зарегистрирован: 06.03.2018

Помогите с кодом. Не работает.

Логика: если концевик 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);

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Что не работает-то - реле не щелкает? Так pinMode() полагается куда-нить всунуть...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
#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);
}
valiant
Offline
Зарегистрирован: 06.03.2018

Про pinMode() я и забыл.

valiant
Offline
Зарегистрирован: 06.03.2018

пин мод я уже поставил. Спасибо. Только теперь реле сразу включается и остается включенным, на кнопку и карту не реагирует.

sadman41
Offline
Зарегистрирован: 19.10.2016

Квон там что-то зафиксил в строках 41-44

valiant
Offline
Зарегистрирован: 06.03.2018

А на модуле реле, на пине in, должно быть напряжение...если подключить только VCC и GND?

Да должно быть.

valiant
Offline
Зарегистрирован: 06.03.2018

Не помогло. Реле включается и все. Не риагирует больше ни на что.

valiant
Offline
Зарегистрирован: 06.03.2018

Если убираю метки в строке 

unsigned long cards [ 1 /* ввести колво карточек вмемто 1*/] {}

реле отключается...соответственно карта не читается. Значит дело в данных ввода карты. Куда копать? Ткните носом.

sadman41
Offline
Зарегистрирован: 19.10.2016

Натыкайте Serial.println() около всех digitalWrite(). Так поймёте, какой срабатывает не по уставу.

А то, может, реле-то у вас инвертированное вообще...

valiant
Offline
Зарегистрирован: 06.03.2018

Реле проверил блинком...работает. Попробую с сериалом, что покажет.

valiant
Offline
Зарегистрирован: 06.03.2018

Возникла другая проблема. Как сделать, чтобы пока карта приложена к считывателю, реле включено, как убрал карту, реле отключается?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

valiant, опять играете в угадай-ку. Пошло не пошло. Программы перед тем как писать код надо проектировать.

#27

valiant
Offline
Зарегистрирован: 06.03.2018

Често говоря не понял к чему это. Проекты рождаются в процессе. За ссылку спасибо. Только там нет ответа на мой вопрос. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Реализовываются в процессе. А сначало идет задумка и методы ее реализации.  Так считыватель может определить что карта приложена и какой код на ней. Но считыватель никак не может определить что карта только что убрана. Потому что железо это ну очень тупое. По крайней мере так в библиотеке "написано". Вы хотите написать свою библиотеку для умного RFID. Есть другой подход - сделать "умное реле". Пока приходит команды -"держать включеным", то разумеется быть включеным . А если команды прекратились закрыть. Так и реализовано в том скетче что я предложил.

ПС: Не нравится , то продолжайте "рожать в процессе".

valiant
Offline
Зарегистрирован: 06.03.2018

Получается монитор порта будет бесконечно считывать карту? Т.е. в мониторе UID карты будет читать и отправлять бесконечно, пока карту не убрали? 

Logik
Offline
Зарегистрирован: 05.08.2014

В бесконечном чтении карты ниче плохого. В конце концев именно так ридер убеждается что в поле именно та карта.

А Вы не задумывались какая воще длина UID прежде чем в лонг его запихивать? Заметте, внутри либки он не в лонге лежит. И кроме mfrc522.PCD_Init(); с ридером вобще ниче делать не собираетесь? А как понять int x=1; //количество карточек и тут же unsigned long cards [ 2  . Шизофрения? Ваш код огорчает меня. Не пишите больше.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот как определить что предмет исчез. Вот предмет есть, есть, есть , нет. Вам надо на него смотреть и тогда вы увидете его "исчезновение".  Можно конечно закрыть глаза. Но тогда исчезновение его не увидете. Точнее все исчезнет и предмет тоже. Но ведь надо определить время исчезновения именно предмета, а не всего .  Программирование это прежде всего умение работать с абстракциями, переходить с одного уровня абстракций на другой.  А искать тупо решение в синтаксе языка Си или в методах кем-то написаной библиотеки не очень продуктивно. Поэтому я написал что вы играете в угадай-ку.

Logik
Offline
Зарегистрирован: 05.08.2014

Чтоб определить что предмет исчез можна не смотреть а положить на него .. руку например. Тогда даже заснуть можна, а исчезновение почувствуется. Чип модуля RFID может почувствовать исчезновение карты по изменению поля. Но интерфейса к внутренним возможностям 522-го нету. Да и сам метод - не гуд, мало ли кто там в поле появился и потребляет. И опять же опрашивать пришлось бы всеравно, если прерывания не настроить;) Но нету- значить нету. Сделать select и получить UID - самое оно. А то что valiant тычет в слепую и копипастит шонипопаде - ага. И это плохо.

valiant
Offline
Зарегистрирован: 06.03.2018

Ребят я же учусь еще. Че нападаете? Знал бы все, не задавал бы здесь вопросы. По поводу того, что монитор будет бесконечно считывать, я спросил потому, что мне нужно брать данные с монитор порта и отправлять в exel...получается мне в проге нужно будет отфильтровывать повторяющиеся данные.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

valiant. Похоже вы не учитесь. Нет у вас данных, что бы отправлять в монитор .

valiant
Offline
Зарегистрирован: 06.03.2018

В смысле нет данных? Любые данные можно снять, если есть какая либо информация. Я имел ввиду данные по UID карте, время, дата. К тому же данные, уже на этом этапе разработки, я уже считываю и отправляю в exel.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Есть данные, а есть мусор . Есть такое выражение . Человек смотрит глазами, а видит умом. Вы в скетче должны именно получить данные, а не то что сенсор показывает.  Конечно курс доллара или температура в Сахаре это тоже "данные". Но зачем эти "данные " отправлять в Serial, а потом уже фильтровать Exel. ПС: Да и RFID вроде не показывает дату и время. Просто код карточки и все @_@

valiant
Offline
Зарегистрирован: 06.03.2018

Rfid не показывает ,а exel показывает. Вам программу скинуть?

valiant
Offline
Зарегистрирован: 06.03.2018

Нашел ответ на мой вопрос на стороннем ресурсе. Все оказалось очень просто. 

valiant
Offline
Зарегистрирован: 06.03.2018

Для "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 метки в консоль.

}

 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

valiant, я конечно понимаю все. рабатает и ладно. Но что это за бред в коде

22   if ((buttonState == HIGH) && (uidDec == 3230407588, 2643501689)) // Сравниваем Uid метки

запятая как не работает.

valiant
Offline
Зарегистрирован: 06.03.2018

Работает. Вот сижу с железом перед компом, специально удалил  второй UID после запятой...не работатет брелок....вернул, работает. Нету у меня больше UID меток...так бы проверил. У  брата "Ляо" заказал...скоро придут 10 штук...добавлю через зпт, проверю.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
 if ((buttonState == HIGH))  

тогда и так будет работать.Как вариант можно вытряхнуть все что до запятой включая и запятую

 

valiant
Offline
Зарегистрирован: 06.03.2018

Хм..и так работает. Просто если "вытряхнуть", то мне как начинающему, будет трудно(в будущем) распределять UID-ы для разных целей...этот скетч основа...там еще будет шаговик, серва, матричная клава, кнопки, концевики...вообщем много чего еще. Однако спасибо за экономию байтов. Конечно же я знаю, что скетч можно "ужать" с разными миллисами, форами, массивами...но пока это для меня далеко. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

valiant, вы про ужать не сильно думайте. А ..там еще будет шаговик, серва, матричная клава, кнопки, концевики... могут привести к тому что программа работать не будет.  Ведь не всегда работающий скетч это сумма маленьких работающих скетчей. 

valiant
Offline
Зарегистрирован: 06.03.2018

Кстати ща подумал...если не вытряхивать и кол-во UID-ов будет 100500, то если нужно будет исключить какой то UID, можно просто стереть из строки, не ковыряя остальной код...и, если его же, потом нужно будет добавить, просто вернуть. Сейчас протестировал. Стер второй UID, а из условия 

 if ((uidDec != 3230407588) && (uidDec != 2643501689))

не удалял... скетч работает.

b707
Offline
Зарегистрирован: 26.05.2017

valiant пишет:

Хм..и так работает. Просто если "вытряхнуть", то мне как начинающему, будет трудно(в будущем) распределять UID-ы для разных целей...этот скетч основа...там еще будет шаговик, серва, матричная клава, кнопки, концевики...вообщем много чего еще. Однако спасибо за экономию байтов.

Валиант, вы вообще чтоль в программировании не шарите? - Какая "экномия байтов"? то, что предложил qwone - это была ИРОНИЯ. Он вам предложил выкинуть вовсе проверку на валидный UID. потому что  вот в этом коде:

if ((buttonState == HIGH) && (uidDec == 3230407588, 2643501689))

- ПРОВЕРКА НЕ РАБОТАЕТ. Чтобы убедится в этом - просто поменяйте UID-ы  на любые левые - только не один, а оба - условие так же будет срабатывать, как и с правильными.

valiant
Offline
Зарегистрирован: 06.03.2018

b707 пишет:

Валиант, вы вообще чтоль в программировании не шарите? 

В чем я шарю нужно будет учить 15 лет, а потом упорно работать 20 лет.

Прежде чем задавать такие вопросы, читать надо все посты.