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

Опа! кто-то опять вошёл, но не стал вводить пароль (это равно ключу 00000000) и похоже, это вор! сигнал идёт на специальный динамик, прибегает охрана и воришка пойман! Осталось только перезагрузить плату, чтобы она перестала орать.
Когда-нибудь, я думаю добавить сюда ещё и ethernet, но пока, это только планы.
P.S. В схеме и в коде информационный и тревожный динамики объединены, но код спроектирован так, что можно сделать 2 динамика: для предупреждений и для тревоги
Эта статья посвящена созданию универсальной 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 динамика: для предупреждений и для тревоги