Прерывание и геркон

xsash
Offline
Зарегистрирован: 31.08.2016

Добрый! Ну что ж, прошла неделя с доставки кит набора и пробы "пера", появились вопросы. Прошу помощи у сообщества, если вопросы глупые - дайте хоть вектор

Суть - пишу простую GMS сигнализацию (коих достаточно, но интересен сам процесс набивания шишек). Прикладываем ключ, система ставится под охрану. Второй раз прикладываем - снимается с охраны. Датчик пока один - геркон на двери.

Ардуино, RFID считыватель (RC522), простой геркон, пара LED (красный и зеленый).

 

Сразу столкнулся с тем, что поиск карты останавливает loop()

if ( ! mfrc522.PICC_IsNewCardPresent()) { return; }

и решил использовать прерывание. Но вот тут столкнулся с тем, что при срабатывании геркона всегда получаю "единицу" на пин 2. Приложил магнит, убрал магнит - всегда считывается 1. (Аппаратного или программного "анитдребезга нет")

 

Сам код полностью (он страшноват, вижу часть моментов, которые надо переделать)

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

#define SS_PIN 53
#define RST_PIN 9

// объект MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN);

// для отображения номера карточки в десятичном формате
unsigned long idKey, idKeyTemp;
byte bCounter, readBit;
unsigned long ticketNumber;

/* Переменные Pin */
int pinRed = 6;
int pinGreen = 7;
int pinDoor = 0;

/* Массив ключей */
char* myKeys[] = {"1111111111", "2222222222"};

String txtKey = "";

/**********************************************************/


void printInfo(String txt)
{
  Serial.println(txt);
}


boolean checkKey(String txt)
{
  boolean validKey = false;

  for (int i = 0; i < 2; i++)
    {
      if ((txtKey == myKeys[i]) && (!validKey))
        {
          validKey = true;
        }
    }

  if (validKey)
    {
      return true; //ключ найден в массиве
    }
  else
    {
      return false; //ключ не найден в массиве
    }
}


void setup()
{
  Serial.begin(9600);

  // инициализация SPI
  SPI.begin();

  // инициализация MFRC522
  mfrc522.PCD_Init();

  pinMode(pinRed, OUTPUT);
  pinMode(pinGreen, OUTPUT);

  pinMode(pinDoor, INPUT);
  attachInterrupt(pinDoor, swap, CHANGE );
}

void swap()
{
/*
  if (digitalRead(pinDoor) == LOW)
  {
    Serial.println("Door open");
  }
  else
  {
    Serial.println("Door close");
  }
*/

  Serial.println(digitalRead(pinDoor));
  //тут всегда единица
}


void loop()
{
  // Поиск новой карточки
  if ( ! mfrc522.PICC_IsNewCardPresent()) { return; }

  // Выбор карточки
  if ( ! mfrc522.PICC_ReadCardSerial()) { return; }

  idKey = 0;

  // Выдача серийного номера карточки
  printInfo("Card UID:");

  for (byte i = 0; i < mfrc522.uid.size; i++)
    {
      idKeyTemp = mfrc522.uid.uidByte[i];
      idKey = idKey*256+idKeyTemp;
    }
  txtKey = String(idKey);
  printInfo(txtKey);

  if (checkKey(txtKey))
    {
      digitalWrite(pinGreen, HIGH);
      digitalWrite(pinRed, LOW);
    }
  else
    {
      digitalWrite(pinRed, HIGH);
      digitalWrite(pinGreen, LOW);
    }

  // Halt PICC
  mfrc522.PICC_HaltA();
}

 

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

Второй вариант - сделать наоборот, в основном цикле идет проверка состояния датчиков, а вот считывание ключа вынести. Но пока ненагуглил хоть примерный код.

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

Я вам на амперке ответил.

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

Давайте схему подключения. Иначе, тут больше вопросов, чем ответов. Например:

xsash пишет:

и решил использовать прерывание. Но вот тут столкнулся с тем, что при срабатывании геркона всегда получаю "единицу" на пин 2. Приложил магнит, убрал магнит - всегда считывается 1. (Аппаратного или программного "анитдребезга нет")

Пин к чему-нибудь притянут или в воздухе болтается?

Кроме того, в 71 строке Вы вешаете прерывание на пин 2, а в 87 строке читаете пин 0. Это специально так?

toc
Offline
Зарегистрирован: 09.02.2013

не стоит использовать пин 0 и сериал одновременно.