Проблема с условием

y680489
Offline
Зарегистрирован: 04.06.2019

Добрый день. Подскажите куда копать. Условие отрабатывает наполовину. При поднесении карточки ПК блокируется, но при поднесении карты к заблокированному не даёт никакого результата. 

// Подключаем библиотеку для управления клавиатурой
#include <Keyboard.h>
#include <SPI.h>
#include <MFRC522.h> // библиотека "RFID".
#define SS_PIN 10
#define RST_PIN 9
int a = 0;
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp;  // для хранения номера метки в десятичном формате
 
void setup() {
  Serial.begin(9600);
  SPI.begin();  //  инициализация SPI
  mfrc522.PCD_Init();     // инициализация MFRC522
  Keyboard.begin();
 
  delay(1000);
}
 
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 == 13654906) // Сравниваем Uid метки, если он равен заданому
  {
    if (a == 0)
    {
      Keyboard.press(KEY_LEFT_GUI);
      Keyboard.press('l');
      delay(500);
      Keyboard.releaseAll();
      a = 1;
    }
    else
    {
      delay(5000);
    }
  }
  else if (a == 1)
  {
    Keyboard.println("1");
    Keyboard.press(KEY_RETURN);
    Keyboard.releaseAll();
    a = 0;
  }
}
 
 
 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы бы пояснили, что означают if'ы в №№40 и 53, а то по сейчас мне кажется, что Вы блокируете, когда краточка совпала, а разьлокируете, когда не совпала (т.е. левой карточкой).

y680489
Offline
Зарегистрирован: 04.06.2019

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

Нуидела
Offline
Зарегистрирован: 31.01.2017

ЕвгенийП пишет:

Вы бы пояснили, что означают if'ы в №№40 и 53, а то по сейчас мне кажется, что Вы блокируете, когда краточка совпала, а разьлокируете, когда не совпала (т.е. левой карточкой).

Полностью соглашусь.
Чуток с else напутано. (Поменяйте их местами).

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

пишите комменты на свой код, а то код из инета прокомментирован, а ваш нет.

y680489
Offline
Зарегистрирован: 04.06.2019

Нуидела пишет:

ЕвгенийП пишет:

Вы бы пояснили, что означают if'ы в №№40 и 53, а то по сейчас мне кажется, что Вы блокируете, когда краточка совпала, а разьлокируете, когда не совпала (т.е. левой карточкой).

Полностью соглашусь.
Чуток с else напутано. (Поменяйте их местами).

Всем спасибо, ошибку нашёл.

 if (uidDec == 13654906) // Сравниваем Uid метки, если он не равен заданому
  {
    if (a == 0)
    {
      Keyboard.press(KEY_LEFT_GUI);
      Keyboard.press('l');
      delay(500);
      Keyboard.releaseAll();
      a = 1;
      delay(1000);
    }
    else
    {
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.releaseAll();
    delay (250);
    Keyboard.println("1");
    Keyboard.press(KEY_RETURN);
    Keyboard.releaseAll();
    a = 0;
    delay(1000);
  }
  }

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

y680489 пишет:

Всем спасибо, ошибку нашёл.

Я бы сказал, Нуидела с Петровичем нашли и ткнули носом, но всё равно, молодец! :)))

y680489
Offline
Зарегистрирован: 04.06.2019

Ворота пишет:

y680489 пишет:

Всем спасибо, ошибку нашёл.

Я бы сказал, Нуидела с Петровичем нашли и ткнули носом, но всё равно, молодец! :)))

так поэтому и нашёл, что ткнули

y680489
Offline
Зарегистрирован: 04.06.2019

Подскажите, как можно реализовать проверку наличия карты? то есть если карту убрали должны совершаться действия. проверка по uid карты такого эффекта не даёт. если карту не прикладывать - ничего не происходит.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

y680489 пишет:

Подскажите, как можно реализовать проверку наличия карты? то есть если карту убрали должны совершаться действия. проверка по uid карты такого эффекта не даёт. если карту не прикладывать - ничего не происходит.

Когда карту приложили - взводишь флаг "карта приложена", запоминаешь время прикладывания карты. И постоянно проверяешь: если взведён флаг "карта приложена", то: если карта ещё приложена - обновляешь время, если карты на считывателе нет, то проверяешь - если разница между текущим временем и временем последнего детектирования карты больше, чем определённый интервал - выполняешь определённые действия, и сбрасываешь флаг "карта приложена". В псевдокоде это выглядит примерно так:

bool isCardPresent = false;
uint32_t cardPresentTime = 0;

void loop()
{
	bool nowCardPresent = checkIfCardPresent();
	
	if(nowCardPresent)
	{
		cardPresentTime = millis();
		isCardPresent = true;
	}
	
	if(isCardPresent)
	{
		if(nowCardPresent)
		{
			cardPresentTime = millis();
		}
		else
		{
			if(millis() - cardPresentTime > INTERVAL)
			{
				isCardPresent = false;
				doSomeJob();
			}
		}
	}
}