Как стать автором
Обновить

Arduino-сигнализация с 2-кнопочной идентификацией

Доброго времени суток, дорогой %username%!

Эта статья посвящена созданию универсальной arduino-сигнализации, с очень интересной системой управления и ввода ключа.
После включения она даёт предупреждение (3 сигнала) после чего ждёт указанное время для того, чтобы вы успели выйти, а затем включается индикатор, обозначающий, что система готова к работе. Пока система ждёт чего-то интересного, мы разберёмся, как она определяет появление кого-то. Я уже говорил, что она универсальная, а это заключается в том, что к ней можно присоединить много типов датчиков, а не только один, но всё же, она ориентирована на лазерный луч. Можно, конечное, сделать так, что она просто смотрит, есть ли луч, но тогда можно было бы посветить указкой в датчик и пройти мимо. У меня была задача сделать хорошую сигнализацию, а не хорошую жизнь ворам, так что я сделал так, что она то включает лазер, то выключает, и запоминает значение с датчика в одну из 2 секций, в зависимости от состояния лазера, а потом, просто сравнивает показания. Пока я вам тут всё подробно описывал, система кого-то засекла. подождала несколько секунд, и сняла показания кнопок. Потом она подождала ещё чуть-чуть и считала их опять. Так она сделала 4 раза, а затем сравнила показания с тем, сто хранится во внутренней памяти EEPROM, но оказалось — ложная тревога. Это хозяин, и сигнализации надо выключаться. Хозяин поработал-поработал и собрался уходить, но перед этим захотел сменить ключ. Для того, чтобы ему это сделать, ему надо нажать на 2 кнопку и ввести новый ключ также, как он ввел старый при входе в комнату. Он собрался уходить, и нажал на 1 кнопку, чтобы система опять подождала и включилась, как в самом начале. Пока система ловит воров, у вас есть возможность насладиться прочтением кода и просмотром схемы:

/*
buttonIDalarm. programm for alarm system.
Copyright (C) 2012  Anton Tsyganenko <anton-tsyganenko@yandex.ru>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <EEPROM.h>

#define BUTTON_1                2
#define BUTTON_2                3
#define INFORMATION_BUZZER      9
#define ALARM_BUZZER            9
#define SENSOR                  0
#define SECURITY_PIN            7
#define LED                     8
#define DELAY_BEFORE_INPUT      2000
#define DELAY_IN_INPUT          1500
#define DELAY_BEFORE_ON      	10000
#define THRESHOLD               15

void setup()
{
  pinMode(BUTTON_1, INPUT);
  pinMode(BUTTON_2, INPUT);
  pinMode(INFORMATION_BUZZER, OUTPUT);
  pinMode(LED, OUTPUT);
  randomSeed(analogRead(1));
}

void loop()
{
  watch();
  warning();
  if (inpkey() == true) alarm();
  else
  {
    digitalWrite(LED, HIGH);
    tone(INFORMATION_BUZZER, 500, 500);
    delay(500);
    digitalWrite(LED, LOW);
    delay(2000);
    while(true)
    {
      if (digitalRead(BUTTON_1) == HIGH)
      {
        break;
      }
      if (digitalRead(BUTTON_2) == HIGH) change();
    }
  }
}

boolean inpkey()
{
  boolean b1i1;
  boolean b2i1;
  boolean b1i2;
  boolean b2i2;
  boolean b1i3;
  boolean b2i3;
  boolean b1i4;
  boolean b2i4;
  delay(DELAY_BEFORE_INPUT);
  b1i1 = digitalRead(BUTTON_1);
  b2i1 = digitalRead(BUTTON_2);
  tone(INFORMATION_BUZZER, 1500, 50);
  delay(DELAY_IN_INPUT);
  b1i2 = digitalRead(BUTTON_1);
  b2i2 = digitalRead(BUTTON_2);
  tone(INFORMATION_BUZZER, 1500, 50);
  delay(DELAY_IN_INPUT);
  b1i3 = digitalRead(BUTTON_1);
  b2i3 = digitalRead(BUTTON_2);
  tone(INFORMATION_BUZZER, 1500, 50);
  delay(DELAY_IN_INPUT);
  b1i4 = digitalRead(BUTTON_1);
  b2i4 = digitalRead(BUTTON_2);
  if (  b1i1 == EEPROM.read(0)
  && b2i1 == EEPROM.read(1)
  && b1i2 == EEPROM.read(2)
  && b2i2 == EEPROM.read(3)
  && b1i3 == EEPROM.read(4)
  && b2i3 == EEPROM.read(5)
  && b1i4 == EEPROM.read(6)
  && b2i4 == EEPROM.read(7)) return false;
  else return true;
}

void warning()
{
  for(int i = 3; i > 0; i--)
  {
    digitalWrite(LED, HIGH);
    tone(INFORMATION_BUZZER, 500, 125);
    delay(125);
    digitalWrite(LED, LOW);
    delay(125);
  }
}

void alarm()
{
  while(true)
  {
    digitalWrite(LED, HIGH);
    tone(ALARM_BUZZER, 1500, 125);
    delay(125);
    digitalWrite(LED, LOW);
    delay(125);
  }
}

void watch()
{
  warning();
  delay(DELAY_BEFORE_ON);
  boolean sequrityPinValue;
  int last;
  digitalWrite(LED, HIGH);
  digitalWrite(SECURITY_PIN,HIGH);
  int lastHigh = analogRead(SENSOR);
  digitalWrite(SECURITY_PIN,LOW);
  int lastLow = analogRead(SENSOR);
  while(true)
  {
    sequrityPinValue = random(0,2);
    digitalWrite(SECURITY_PIN, sequrityPinValue);
    if (sequrityPinValue == HIGH)last = lastHigh;
    else last = lastLow;
    int now = analogRead(SENSOR);
    delay(3);
    if (now > last + THRESHOLD || now < last - THRESHOLD) break;
    if (sequrityPinValue == HIGH)now = lastHigh;
    else last = lastLow;
    delay(2);
  }
  digitalWrite(LED, LOW);
  digitalWrite(SECURITY_PIN, LOW);
}

void change()
{
  warning();
  boolean b1i1;
  boolean b2i1;
  boolean b1i2;
  boolean b2i2;
  boolean b1i3;
  boolean b2i3;
  boolean b1i4;
  boolean b2i4;
  delay(DELAY_BEFORE_INPUT);
  b1i1 = digitalRead(BUTTON_1);
  b2i1 = digitalRead(BUTTON_2);
  tone(INFORMATION_BUZZER, 1500, 50);
  delay(DELAY_IN_INPUT);
  b1i2 = digitalRead(BUTTON_1);
  b2i2 = digitalRead(BUTTON_2);
  tone(INFORMATION_BUZZER, 1500, 50);
  delay(DELAY_IN_INPUT);
  b1i3 = digitalRead(BUTTON_1);
  b2i3 = digitalRead(BUTTON_2);
  tone(INFORMATION_BUZZER, 1500, 50);
  delay(DELAY_IN_INPUT);
  b1i4 = digitalRead(BUTTON_1);
  b2i4 = digitalRead(BUTTON_2);
  EEPROM.write(0,byte(b1i1));
  EEPROM.write(1,byte(b2i1));
  EEPROM.write(2,byte(b1i2));
  EEPROM.write(3,byte(b2i2));
  EEPROM.write(4,byte(b1i3));
  EEPROM.write(5,byte(b2i3));
  EEPROM.write(6,byte(b1i4));
  EEPROM.write(7,byte(b2i4));
  digitalWrite(LED, HIGH);
  tone(INFORMATION_BUZZER, 500, 500);
  delay(500);
  digitalWrite(LED, LOW);digitalWrite(LED, HIGH);
}




Опа! кто-то опять вошёл, но не стал вводить пароль (это равно ключу 00000000) и похоже, это вор! сигнал идёт на специальный динамик, прибегает охрана и воришка пойман! Осталось только перезагрузить плату, чтобы она перестала орать.
Когда-нибудь, я думаю добавить сюда ещё и ethernet, но пока, это только планы.

P.S. В схеме и в коде информационный и тревожный динамики объединены, но код спроектирован так, что можно сделать 2 динамика: для предупреждений и для тревоги
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.