Прерывание и геркон
- Войдите на сайт для отправки комментариев
Добрый! Ну что ж, прошла неделя с доставки кит набора и пробы "пера", появились вопросы. Прошу помощи у сообщества, если вопросы глупые - дайте хоть вектор
Суть - пишу простую 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 и сериал одновременно.