Как известно человек стал человеком благодаря труду. Но ведь на этот труд его
толкает бесконечная лень. Когда-то давно, когда обезьяне надоело лазить на
дерево за бананами, она взяла в руки палку и начала сбивать их с земли. Вроде
прогресс, а двигатель - лень!
Впрочем речь идет не об обезьянах, а о той самой лени. Чтобы очеловечиться
еще чуть-чуть, ленивым открывателям дверей я предлагаю собрать небольшой
девайсик, который можно установить поверх дверного замка, а ключик от него будет
- обыкновенный flash-накопитель, который можно сделать универсальным на все
замки в квартире, а можно разработать целую политику безопасности с системой
разграничения доступа (например ключик от бара будет только у вас :)).
Для воплощения данной идеи нам необходима сама флешка, пара светодиодов (я
взял по стандарту зеленый и красный), пара метров удлинительного кабеля usb от
ПК до замка, сервомоторчик и сердцем всей нашей системе будет контроллер
Arduino
(в одном из журналов о нем написана довольно неплохая
статья, поэтому
рассказывать что это не буду).
Для начала нам необходимо написать небольшую программку для определения id
флешки. Писать будем на c++ в builder'е.
Собственно вот код:
GetVolumeInformation("h:", VolumeName.c_str() , 50, &SN, NULL, NULL,
FSName, 50);
VolumeName - имя нашего устройства, а вот SN - необходимый нам id (он не
физический, а назначается операционной системой при форматировании, поэтому для
большей безопасности можно также задействовать и VolumeName).
Дальше нам просто нужно записать вычисленный нами id в какую-то переменную и
сравнить его с тем, который мы получаем при очередном подключении флешки.
Эту задачку решим так: Кладем на форму таймер, а в нем пишем:
dtyp = GetDriveType("h:");
if (dtyp != 2)
{
Timer2->Enabled=0;
Button1Click (this);
}
Здесь мы проверяем диск h:\ на наличие в нем устройства, а результат кидаем в
dtyp.
dtyp != 2 означает, что в порту что-то есть. Тормозим таймер и запускаем
проверочную процедурку Button1Click в которой мы и проверим соответствие нашего
id тому, что получили:
unsigned long MySn=2797188077; // это номер моей флешки+
hCom = CreateFile("COM3", GENERIC_READ + GENERIC_WRITE, 3, NULL, CREATE_ALWAYS,
0, NULL);
if (SN==MySn) {
// проводим сравнение и если есть совпадение, то записываем в com-порт 1, в
//противном лучае - 0;
buf=1;
WriteFile(hCom, &buf, 1, &n, NULL);
access=1;
}
else {
buf=0;
WriteFile(hCom, &buf, 1, &n, NULL);
}
CloseHandle(hCom); //и естесственно не забываем закрыть порт
}
На этом первый шаг закончен, теперь нам нужно написать программку для
контроллера. Чтобы все это было хоть как-то анимировано мы и будем использовать
светодиоды.
Суть следующая.
Ситуация 1 - у нас есть закрытая дверь и "правильный" ключ. Тогда при
подключении флешки диод радостно загорается зеленым цветом, сервомоторчик
открывает дверь:
if (buf==254 && accsses) {
digitalWrite (red,HIGH);
digitalWrite (green,LOW);
accsses=0;
for(int pos = 0; pos < 180; pos += 1)
{
servo1.write(pos);
delay(5);
}
}
Ситуация 2 - у нас есть открытая дверь и "правильный" ключ. Тогда загорается
красный диод и сервопривод поворачивается в обратную сторону, тем самым
закрывает дверь:
if (buf==254 && !accsses) {
digitalWrite (red,LOW);
digitalWrite (green,HIGH);
accsses=1;
for(int pos = 180; pos>=1; pos-=1)
{
servo1.write(pos);
delay(5);
}
}
Ситуация 3 - у нас в руках оказался "неправильный" ключ. Что делать?! Дадим
понять, что в usb-вход попало что-то не то поморгав красным диодом:
if (buf==252 && accsses) {
digitalWrite (red,HIGH); digitalWrite (green,LOW);
delay (300);
digitalWrite (red,LOW);
delay (300);
digitalWrite (red,HIGH);
delay (300);
digitalWrite (red,LOW);
delay (300);
digitalWrite (red,LOW);
delay (300);
digitalWrite (red,LOW);
digitalWrite (green,HIGH);
}
В общем вот и все. Теперь осталось собрать все в
кучу, скомутировать и вешать на дверь - пугать
соседей.