Arduino+RFID+кнопка

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Доброго всем госпада.Такое дело имеем : Кнопку и RFID- считыватель. Так вот Можно ли сделать так, что бы метки сканировались не постоянно, и RFID включался только по нажатию на кнопку?

Код приблезительно такой "Стандартный"

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); 

void setup() {
 Serial.begin(9600); 
 SPI.begin();   
 mfrc522.PCD_Init(); 
 Serial.println("Scan PICC to see UID and type...");
}

void loop() {
  byte uidCard[4] = {0x93, 0x48, 0x67, 0x9A}; 
  
 if ( ! mfrc522.PICC_IsNewCardPresent()) {
  return;
 }

 // Select one of the cards
 if ( ! mfrc522.PICC_ReadCardSerial()) {
  return;
 }
          
        for (byte i = 0; i < 4; i++) {
          if (uidCard[i] != mfrc522.uid.uidByte[i])
            return;           
        }
        
  Serial.println("OPEN");
  // digitalWrite(); 
  delay(5000);
  // digitalWrite();      
}

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Именно включался, или просто считывание проходило после нажания кнопки?

dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Что бы считывание проходило, только после нажатия на кнопку

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN     10
#define RST_PIN    9
#define BUTTON_PIN 3   // кнопка между пином и GND через R=1k (это не подтяжка, а защита пина).
#define TIMEOUT    30  // период активности RFID после нажатия кнопки, сек

#define BUTTON_PRESSED (!digitalRead(BUTTON_PIN)) // макрос для удобства чтения кода

boolean buttonFlag = false;
byte uidCard[4] = {
  0x93, 0x48, 0x67, 0x9A }; 

MFRC522 mfrc522(SS_PIN, RST_PIN); 

void setup() 
{
  pinMode(BUTTON_PIN, INPUT_PULLUP); // активируем внутреннюю подтяжку
  pinMode(LED_BUILTIN, OUTPUT);      // активируем впаянный светодиод
  Serial.begin(9600); 
  SPI.begin();   
  mfrc522.PCD_Init(); 
  Serial.println("Please press a button.");
}

void loop() 
{
  if(BUTTON_PRESSED) // кнопка нажата
  {
    Serial.println("Scan PICC to see UID.");
    unsigned long prevButtonPressed = millis(); 
    while(millis() - prevButtonPressed < TIMEOUT * 1000L) // окно N сек, когда активен ридер
    {
      if (mfrc522.PICC_IsNewCardPresent()) // карта появилась в зоне ридера
      {
        Serial.println("Card found");
        //return; // возврат в loop

        // Select one of the cards
        if (mfrc522.PICC_ReadCardSerial()) // номер карты прочтен
        {
          Serial.println("Card number is readed");
          //return; // возврат в loop

          byte validCard = 0;
          for (byte i = 0; i < 4; i++) // проверка номера карты
          {
            if (uidCard[i] == mfrc522.uid.uidByte[i]) validCard++; // совпадение ячеек
          }
          if (validCard == 3) // номер карты подтвержден
          {
            Serial.println("OPEN");
            // digitalWrite(); 
            delay(5000);
            // digitalWrite();  
          }
          else // номер карты не совпадает с эталоном
          {           
            Serial.println("Bye-bye!");
            return;        // возврат в loop   
          }
        }
      }
      digitalWrite(LED_BUILTIN, millis()%2); // моргаем светиком, пока активен ридер
      delay(100);
    }

    Serial.println("Timeout! Press a button again.");
    digitalWrite(LED_BUILTIN, LOW);
  }
}

считыватель активен 30 сек после нажатия на кнопку.

 
dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Спасибо большое за помощь, Всех с Наступающим.