Прерывание и геркон
- Войдите на сайт для отправки комментариев
Добрый! Ну что ж, прошла неделя с доставки кит набора и пробы "пера", появились вопросы. Прошу помощи у сообщества, если вопросы глупые - дайте хоть вектор
Суть - пишу простую 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();
}
В перерывании менял режим обработки. Все равно при срабатывании на выходе единица, а хотелось бы считывания состояния геркона.
Второй вариант - сделать наоборот, в основном цикле идет проверка состояния датчиков, а вот считывание ключа вынести. Но пока ненагуглил хоть примерный код.
Я вам на амперке ответил.
Давайте схему подключения. Иначе, тут больше вопросов, чем ответов. Например:
и решил использовать прерывание. Но вот тут столкнулся с тем, что при срабатывании геркона всегда получаю "единицу" на пин 2. Приложил магнит, убрал магнит - всегда считывается 1. (Аппаратного или программного "анитдребезга нет")
Пин к чему-нибудь притянут или в воздухе болтается?
Кроме того, в 71 строке Вы вешаете прерывание на пин 2, а в 87 строке читаете пин 0. Это специально так?
не стоит использовать пин 0 и сериал одновременно.