После беглого знакомства с Arduino, настала пора двигаться в сторону того, ради чего и был приобретен стартовый набор: построение домашний сигнализации. Что же я хочу от сигнализации? В идеале это должна быть автономная система работающая по RFID меткам, с оповещением о проникновении по SMS (или звонку) и Email. Это минимум. А дальше зависит только от фантазии и умений - удаленное управление, логирование событий (можно даже с фото или видео). 

Представляю я себе это так - возле входной двери в квартиру должен висеть считыватель RFID меток с индикацией светодиодами и звуком. Минимальный функционал таков: вышел из квартиры, закрыл дверь, провел чипом по считывателю, получил сигнал о том, что сигнализация активирована, пошел по своим делам; пришел, увидел что сигнализация активна (никто другой из домочадцев не снял), провел чипом, получил сигнал что сигнализация деактивирована. Пока что без датчиков, оповещений о проникновении, сирены и т.д.

В стартовом наборе был модуль RC522, и, как человек далекий от всего этого, я начал думать как же его оформить в корпус, туда же добавить светодиод и пищалку, но быстро понял что так лучше не делать.

RC522

модуль RC522

Методом гугления было обнаружено, что существует стандарт Wiegand. А на ebay и aliexpress полно готовых считывателей. Так же для arduino есть библиотека для работы с этим протоколом, а для подключения к arduino нужно всего 2 пина. Замечательно. На али за ~$10 был куплен вот такой считыватель, заявлен как водонепроницаемый, но проверять не собираюсь (:

Wiegand

Wiegand 26 RFID ридер

Как можно заметить проводов больше чем 2: два отвечают за питание, еще два за передачу данных, один за управление LED, еще один за управление пищалкой. Один остался неопознанным. 

Так как питается это дело от 12В, был приобретен преобразователь 5В -> 12В. Мультиметр показал на выходе 12.4В.

преобразователь напряжения

преобразователь напряжения

Подключается очень просто: от arduino 5V и GND красным и черным проводом идут соответственно на вход преобразователя IN+ и IN-. С выхода преобразователя OUT идет соединение на красный и черный провода считывателя. Когда на преобразователь подано напряжение, он оповещает об этом красным диодом. После подключения ридер издает писк и включается синий LED. Уже можно подносить карту или брелок и наблюдать реакцию считывателя.

Подключаем data провода: для arduino uno 2-ой пин соединяется с зеленым и 3-ий пин с белым проводами считывателя. 

8-ой пин я соединил с желтым проводом ридера (пищалка), 7-ой пин с синим (управление LED)

в сборе

все в сборе

Кстати про LED, я был уверен что он на 3 цвета - синий, зеленый и красный, но оказалось, что цвета 2 - только синий и зеленый.

Библиотека в arduino IDE ставится как и любая другая, подробности есть по ссылке на гитхабе.

Как запустить IDE и залить скетч не буду, на эту тему хватает мануалов в сети. Вот исходник (скетч) того, что у меня получилось:

#include <EEPROM.h>
#include <Wiegand.h>

WIEGAND wg;

// состояние сигнализации в нулевом байте EEPROM
// 0 - выключена, 1 - включена
int eeepromAddr = 0;

// пин на пищалку (желтый)
int buzzerPin = 8;
// пин на LED (синий). 0 - зеленый, 1 - синий
int ledPin = 7;

// массив с ключами
long keys[] = { 1234567 };
// количество ключей
int keysCount = 1;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  // определяем состояние сигнализации
  // включена. включаем синий LED
  if(EEPROM.read(eeepromAddr) == 1){
    digitalWrite(ledPin, HIGH);
  }
  // выключена или состояние неопределено
  else {
    digitalWrite(ledPin, LOW);
  }
  digitalWrite(buzzerPin, HIGH);
  Serial.begin(9600);  
  wg.begin();
}

void loop() {
  if(wg.available()){
    Serial.println(EEPROM.read(eeepromAddr));
    long currentKey = wg.getCode();
    Serial.println(currentKey);
    // если сигнализация включена
    if(EEPROM.read(eeepromAddr) == 1) {
      // поднесен известный ключ - выключить сигнализацию
      if(keyCheck(currentKey)) {
        EEPROM.write(eeepromAddr, 0);
        digitalWrite(ledPin, LOW);
      }
      // неизвестный ключ (тут можно сделать оповещение, что кто-то пытался открыть)
      else {
        unknownKey();
      }
    }  
    // если сигнализация выключена и поднесен известный ключ - включить сигнализацию
    else {
      if(keyCheck(currentKey)) {
        EEPROM.write(eeepromAddr, 1);
        digitalWrite(ledPin, HIGH);
      }
      // неизвестный ключ (тут можно сделать оповещение, что кто-то пытался открыть)
      else {
        unknownKey();
      }
    }
  }
}

// функция проверки совпадения ключа
boolean keyCheck(long currentKey) {
  for (int i = 0; i < keysCount; i++) {
    if(keys[i] == currentKey){
      Serial.println("COMPARE!");
      return true;
    }
  }
  return false;
}

// функция для неизвестного ключа
void unknownKey() {
  digitalWrite(buzzerPin, LOW);
  delay(1500);
  digitalWrite(buzzerPin, HIGH);
}

Думаю особых пояснений не требуется, код вроде бы понятен. Текущее состояние сигнализации хранится в EEPROM. Пищалка инверсная, работает при подаче на нее 0. 1234567 - ключ чипа или карты, обычно написан на нем (ней). Если нет, то можно запустить из примеров библиотеки простой считыватель и посмотреть последовательный порт.

Есть и непонятные для меня вещи: например если задать массив ключей и не вводить их количество в отдельную переменную, в массиве откуда-то появляются лишние элементы. Возможно в этом есть какая-то логика или я сделал что-то не так, но т.к. я в этом деле профан, оставил так. 

Видео работы:

Сначала подношу брелок ключ которого прописан, потом неизвестный брелок. 

Продолжение будет дальше по мере наличия свободного времени (: