Вправляем мозги двери


Итак что имеем — не сильно умную дверь, много кипиша и как итог частенько открытая дверь. Дверь безмозглая могла бы и сигнализировать если не закрыли, но нет же, будет стоять и молчать. Неее, так не пойдет, будем вправлять ей мозги!

Желаемый функционал
1.Дверь открыта — зуммер не пищит т.к. неудобно с мелкими одеваться и выходить зимой. Дома жарко, пока оденешься без открытой двери вспотеешь весь.
2.Дверь закрыта, ригель не повернут — ждем 2 минуты и начинаем постоянно пищать и моргать диодом.
3.Возможность настроить расстояние до ригеля и в энергонезависимой памяти.

Для апгрейда будем использовать мой любимый ЦАРЪ мк attiny13.

Из обвязки пара резисторов, ик диоды, зуммер.

Материалы
1шт коробочка под наш девайс
1шт геркон+магнит
1шт мк Attiny13 (по желанию сокет dip 8)
1шт зуммер (он же пищалЪ)
5шт коннекторы
5шт резисторов разных номиналов: 160Rx2шт (для светодиодов),22Rx1шт. 160 (расчетных) не нашлось — поставил 220R, 4,7к,100r
1шт кнопка с длинной пипкой
п.с. если световая индикация работы не нужна — не берем светодиоды и резисторы, зуммер садим напрямую на порт без резистора.

Первым делом измеряем глубину полости где ходит ригель, а так же длину ригеля. У нас должно быть не меньше 1см свободного места.
Итак паяем ик диоды на кусочек платы, подключение по схеме- 2 резистора (4,7к и 100r).




Засунул в кусочек короб канала мелкого чтобы плата железа на двери не касалась, можно просто посадить на 2х сторонний скотч.

Примеряем наш датчик внутри полости двери.

п.с. на фото один из первых вариантов датчика, позже переделал компоновку на ту что выше.

П.с. добавил фото последней версии датчика.

Крепим геркон и магнит


Делаем вторую плату — мк с обвязкой по схеме.
Схема сделана максимально просто, деталей минимум.
Вывел порты на коннекторы для подключения ик диода, геркона, светодиода.
Длинная кнопка сделана на обратной стороне из-за установки внутри коробки.
Красная спереди — первый вариант, отпаивать ее было лень, просто перевесил контакты на новую.





Диоды бывают разные тут я использовал 2х цветный красный/зеленый с общим анодом.

Можно использовать любой.

Питание — от 5в зарядки от телефона.
Потребление диода при указанном резисторе 15ма, зуммера примерно столько же. Итого нагрузка на порт ~30ма, что вполне допустимо (max 40ma на порт). Без резистора при питании от 5в зуммер потребляет в пике 25ма, диод 20ма =45ма=выгоревший порт.

Подключение
У тиньки всего 8 ног, 3 из которых по умолчанию заняты (rst,vcc,gnd трогать rst я не буду — при перепрошивке нужен будет 12в программатор, которого у меня нет). Итак 5 ног в остатке.

Начинаем прикидывать что куда подключаем:
геркон (порт 2)
кнопка (порт 0)
датчик tcrt5000 (порт 3)
диод индикации что все хорошо (порт 4) (у меня зеленый)
зуммер+совмещенный сигнал для диода, что дверь не закрыта (порт 1)(у меня красный)

Хотел сделать отдельный порт для индикации что дверь закрыта, но ног уже не хватило.
Порты можно расширить дешевой микросхемой 74hc597.
Но ради одного порта не стал заморачиваться, решил совместить зумер с красным диодом.

Зуммер можно запитать отдельно через транзистор(мелкий типа bc547 в TO-92), но и с текущим резистором он звучит довольно громко — во всех комнатах слышно, кроме того писк постоянный.

Итак все спаиваем и подключаем, засовываем в корпус и делаем дырки под зуммер и кнопку.
У меня получилось вот так.

Диод поставил изнутри стенки шкафа купе и закрыл кругляшком которым дырки прячут.




Видео работы (п.с. пропустил 2 минуты занудства до срабатывания зуммера)

BOM (список материалов)
1.Мк Attiny13~85р 2шт
2.Светодиод можно взять одноцветный (1-2шт)/(2х цветный (1шт)/rgb(1шт) с общим катодом) я взял 2х цветный красный/зеленый рассеяный diffused 5mm 30шт ~60р
3.Buzzer зуммер ~82р 10шт
4.Коннекторы~95р 10шт
5.Сокет dip 8 по желанию ~43р 10шт
6.tcrt5000 ~60р 10шт
7.Геркон +магнитя брал, но сейчас они дороги Meder mk04 ~115р Подойдет любой, нормально разомкнутый геркон, например ~51р геркон+магнит
8.Кнопка без фиксации, нормально разомкнутая, с длинной пипкой — чтобы можно было выставить ее наружу из коробки. 10шт 43р
9 Коробочка под наш девайс, я брал в местном магазине электротоваров

Принцип работы
При нажатии на кнопку делает 10 замеров с ик диодов, берется наименьшее значение, позже оно дополнительно уменьшается на поправочный коэффициент(-100). Полученное число записывается в энергонезависимую память.
Далее идет вечный цикл — анализируется открыта ли дверь и повернут ригель(на основе сравнения текущего показания ик диода и значения полученного ранее и записаного в память).
Если в течении 2х минут дверь закрыта, но ригель не повернут — начинаем пищать ПОСТОЯННО.
Если все хорошо — горит зеленый диод.

Размер когда 922 б из 1024 возможных — запас еще есть :)
Код

/*
 5 сигналов - показания датчиков записаны в eeprom
 */
#include <EEPROM2.h>

#define  SENSOR_1_PIN 3
#define  BUZZER_PIN  1
#define  BUTTON_PIN  0
#define  REED_SWITCH_PIN 2
#define  OK_STATE_PIN 4

#define ITERATION_DELAY 1000 // 1 sec
#define ITERACTION_COUNT_BEFORE_ALARM  120 //2 min

#define DOOR_CLOSE_SENSOR_1_ADDRESS 4

int gCurrentIteration = 0;
int gDoorClose1Value = 550;

void setup(  )
{
  EEPROM_read(DOOR_CLOSE_SENSOR_1_ADDRESS, gDoorClose1Value);//--- считываем из памяти значение 1-го датчика при закрытой двери

  pinMode(BUZZER_PIN, OUTPUT); 
  pinMode(OK_STATE_PIN, OUTPUT); 

  pinMode(BUTTON_PIN, INPUT); 
  digitalWrite(BUTTON_PIN, HIGH);

  pinMode(REED_SWITCH_PIN, INPUT); 
  digitalWrite(REED_SWITCH_PIN, HIGH);

  Alarm(3);
  digitalWrite(OK_STATE_PIN,HIGH);
  delay(2000);
  digitalWrite(OK_STATE_PIN,LOW);   
}

boolean is_lock_open()
{
  return analogRead(SENSOR_1_PIN) > gDoorClose1Value;
}

boolean is_door_closed()
{
  return !digitalRead(REED_SWITCH_PIN);
}

void loop()
{
  if (!digitalRead(BUTTON_PIN))//--- если нажата кнопка - записываем показатели датчиков
  {
    delay(50);
    if (!digitalRead(BUTTON_PIN))
    {

      gDoorClose1Value = analogRead(SENSOR_1_PIN);
      for(int x = 0 ; x < 10 ; x++)//--- take MIN value 10 times ---
      {
        int tmp_val = analogRead(SENSOR_1_PIN);
        if (tmp_val<gDoorClose1Value) gDoorClose1Value=tmp_val;//--- take minimal value from 10 iteration

        delay(50);
      }
      gDoorClose1Value -=100;

      Alarm(1);  

      EEPROM_write(DOOR_CLOSE_SENSOR_1_ADDRESS, gDoorClose1Value);


      delay(5000);
      Alarm(5);  
    }
  }
  if (is_door_closed())// если дверь закрыта начать проверки
  {
    if (is_lock_open())
      gCurrentIteration++;
    else
      gCurrentIteration = 0;

    if (gCurrentIteration > ITERACTION_COUNT_BEFORE_ALARM)

      Alarm(3);
  }
  else
    gCurrentIteration = 0;

  digitalWrite(OK_STATE_PIN,gCurrentIteration==0);//--- light up green led when door is closed and gCurrentIteration==0
 
  delay(ITERATION_DELAY);
}

void Alarm(int cnt)
{
  digitalWrite(OK_STATE_PIN,LOW);

  for (int i=1; i <= cnt; i++){
    digitalWrite(BUZZER_PIN, HIGH);
    delay(100);

    digitalWrite(BUZZER_PIN, LOW);
    delay(100);
  }
}

п.с. собиралось в arduino ide 1.0.6 с attiny13 core (все ссылки есть в статье про скучную гирлянду)
тинька с заводскими настройками фьюз на 1Мгц

п.с. коллеги прошу прощения, днем набирал статью с телефона, ткнул видимо не туда — статья опубликовалась из 3х строчек :(
хорошо хоть ребята сразу поддержали в комментариях

от души :)
+
avatar
  • okela
  • 29 декабря 2016, 08:08
+7
содержательно, убедительно
+
avatar
  • 086dx66
  • 29 декабря 2016, 09:10
+1
;) Спасибо! Пишу с телефона, ткнул не туда -опубликовалось. Убрал в черновики
+
avatar
  • Yaroslav
  • 29 декабря 2016, 23:37
0
классно
+
avatar
+2
Спасибо, интересное чтиво!
.Для себя решил attiny13 не покупать, по деньгам одно и тоже с attiny85, а памяти больше.
+
avatar
  • sim31r
  • 30 декабря 2016, 03:52
0
Ну автор перфекционист минималист, это крутой подход ))) Для повторяемости, наверное, проще было бы на ардуино мини какой-нибудь скучной собрать.
// подписался и пошел читать автора еще ))
+
avatar
  • 086dx66
  • 30 декабря 2016, 05:19
0
Правильный подход
У меня просто остались 13е немного и 85х еще куча
Но когда все в 13ю влазит жалко 85 туда ставить
П.с. посмотри еще по цене атмегу8 или про мини возможно разница уже несущественная
+
avatar
  • 086dx66
  • 30 декабря 2016, 06:51
+1
Свел в таблицу текущие цены. Атмел в дипе
+
avatar
  • 086dx66
  • 30 декабря 2016, 08:22
0
Вообщем получается тиньку85 смысла нет брать т.к. за теже деньги можно взять про мини, а он на 3 головы выше и по объему памяти и портов
Тиньку имеет смысл брать если критичен размер
+
avatar
  • 086dx66
  • 31 декабря 2016, 14:48
0
Цены на тиньку 13ю выше в soic
В дипе ~1$
+
avatar
  • altzw
  • 30 декабря 2016, 07:38
0
Классно сделано.
Почему бы не поменять логику датчика, чтобы он отслеживал закрытую дверь? Тогда бы у него было 2 состояния: закрыто и открыто?
+
avatar
  • 086dx66
  • 30 декабря 2016, 08:19
+1
Датчиком tcrt5000 это не отследить. Он отслеживает только положение регеля. Дверь открыта/закрыта отслеживает геркон. У нас сейчас 3 состояния
Даерь закрыта, регель повернут
Дверь закрыта, регель не повернут
Дверь открыта, регель физически не может быть повернут
+
avatar
  • argelios
  • 30 декабря 2016, 10:35
+1
Автор молодец! Плюсую!
Была подобная идея, но руки так и не дошли.
В вашей статье не очень понял как происходит реакция на незакрытый регель. Не могли бы вы мне более популярно объяснить? Спасибо.
+
avatar
  • 086dx66
  • 30 декабря 2016, 11:13
+2
.Дверь закрыта, регель не повернут — ждем 2 минуты и начинаем постоянно пищать и моргать диодом.
Считывается показание с ик диодов и сравнивается с тем что было в момент калибровки (нажатие кнопки 1 раз при вводе прибора в эксплуатацию)
По видео видно как пищит и перестал при закрытии замка

П.с. сделай уже ;) делов на полчаса, а польза неоценима
+
avatar
  • bazis13
  • 30 декабря 2016, 11:25
0
Кто знает, как для Home Asssitant такую автоматизацию написать? Чтобы когда ригель долго находится в открытом положении, отправлялось уведомление?
+
avatar
  • Waver
  • 30 декабря 2016, 13:40
0
За две минуты не удается далеко уйти от двери, так что зуммер уже не слышен?
+
avatar
  • 086dx66
  • 30 декабря 2016, 14:23
0
Постоянный писк слышно по всей квартире
+
avatar
  • Waver
  • 31 декабря 2016, 17:53
+1
А, это чтоб войдя не забыть? Я бы больше переживал за выход из квартиры…
+
avatar
  • 086dx66
  • 02 января 2017, 21:47
0
Да когда внутри
А из квартиры то точно не слышно.
Тут ревун карабельный ставить надо;)))
Либо другой мк с вифи или жсм который будет оповещать что забыл закрыть
+
avatar
  • Erelesse
  • 31 декабря 2016, 14:12
-3
> Желаемый функционал

Срочно в школу! Функционал — понятие из математики и вряд ли вы его желали у двери. Скорее всего вы желали функциональность.
+
avatar
  • 086dx66
  • 31 декабря 2016, 14:47
+4
Нее
Я точно знаю чего желаю
Слово функционал давно применяется в ПО и железе
+
avatar
0
Я бы поставил два smd датчика холла. И всверлил бы два маленьких неодимовых магнита. Один в ригель, второй в планку. Ну а логика — как описано выше.
+
avatar
  • Aostspb
  • 03 января 2017, 15:33
0
И всверлил бы
В приличных замках ригель делается из достаточно прочной стали.
+
avatar
0
Сврелится всё. Тем более магнитик — цилиндр пару на пару мм.
+
avatar
+2
Плюс за минимализм и функциональность.
Но неужели мне одному режет слух слово рЕгель? По-русски ведь пишется рИгель.
+
avatar
  • 086dx66
  • 02 января 2017, 21:43
0
Блин я почему-то то думал регель
Спасибо
+
avatar
  • 086dx66
  • 04 января 2017, 14:31
0
исправил
+
avatar
  • sevenor
  • 10 января 2017, 05:59
0
Каким программатором пишете сейчас в Attiny13? Заранее спасибо.
+
avatar
  • 086dx66
  • 11 января 2017, 10:25
0
Через уно заливаю
mySKU.me/blog/aliexpress/47795.html
+
avatar
  • VLOD
  • 11 января 2017, 01:41
0
Светодид можно взять ws2812 один выход много цветов, но наверно, в Вашем случае, не хватит памяти. Я сейчас собираюсь делать «умной» ванну — надо семь сигнальных диодов, три трехцветных. Сперва хотел заморочится со сдвиговым регистром, но потом попались под руку эти диоды — удобно. А по поводу двери, раньше часто обнаруживали утром, что дверь открыта. Так как это было очень давно, то я поставил микрик ( с длинной проволочкой, раньше использовались в автоматах газвода ) на ригель и светодиод. Помогло.
+
avatar
  • 086dx66
  • 11 января 2017, 10:23
0
Такая ж фигня была
В 13ю не влезет управление wd2812
Писк эффективнее ;)
+
avatar
0
интересно, соседи не здохнут слушать зуммер когда хозяива уйдут и закроют двери на замок а не защелку?)))))