Умный будильник на основе датчика движения или IP-камеры

в 2:47, , рубрики: diy или сделай сам, linux, будильник, датчик движения, сон, умный будильник, умный дом

Думаю, что многие из вас знают про разные фазы сна и существование умных будильников, про это было уже много статей. Суть в том, что на протяжении ночи происходит смена фаз быстрого и медленного сна. В зависимости от того, в какую из фаз вы проснулись, утро может быть как добрым, так и весьма серым. Во время медленного сна человек постепенно засыпает всё крепче и крепче, будить его в этот момент не стоит, проснуться будет тяжело. Во время быстрой фазы человек спит не так крепко, может ворочаться и переворачиваться с боку на бок. Именно в этот момент легче всего проснуться.

На этом принципе построены многие умные будильники. Они бывают как в виде настольных гаджетов или наручных часов, так и в виде приложений для смартфона. Принцип их работы весьма прост. Будят они не в строго заданный момент, а в промежуток времени, когда желательно проснуться, ожидая при этом какое-либо движение. Если человек начал шевелиться, значит началась фаза быстрого сна, и его пора будить.

У меня в комнате один из датчиков движения висит прямо над кроватью. Об этом я немного рассказывал в своей статье про мой умный дом.

image

Недавно я просматривал логи и заметил, что на истории движения с этого датчика очень чётко видны фазы моего сна, когда я сплю один. Это не удивительно, он очень хорошо фиксирует любое моё движение, даже если я лежу под одеялом. Сразу же возникла мысль — почему бы не сделать мой будильник «умным»?

Датчик движения

Многие спрашивали меня, как же устроены мои датчики, просили дать схему. На самом деле всё проще некуда. Я пошёл в ближайший электромонтажный магазин и купил обычный бытовой датчик движения для включения света, обошлось мне это примерно в 200 рублей. У него было три вывода: общий, питание 220В и выход. Однако, для моих целей коммутация такого напряжения была совсем ни к чему. Я разобрал датчик и обнаружил внутри две платы: мозги и питание. Первая питалась от напряжения около 9В и давала на выходе логическую единицу при наличии движения. Вторая же предоставляла эти самые 9 вольт за счёт конденсаторного питания и коммутировала нагрузку электромагнитным реле. В результате плата с конденсаторным питанием была заменена на мою плату с микроконтроллером:

Умный будильник на основе датчика движения или IP камеры

Задача микроконтроллера предельно проста: ждать логическую единицу от датчика движения и посылать в сеть умного дома информацию об этом, но делать это не чаще, чем раз в минуту. Питается же всё это теперь от 12 вольт, которые протянуты у меня ко всем устройствам.

Скрипты будильника

Так как все устройства в доме у меня связаны с моим роутером на базе Linux, и именно он занимается пробуждением, вся оставшиеся махинации сводятся к написанию shell-скриптов.

За будильник у меня отвечает alarm.sh, который в нужный момент запускается через cron, при этом в параметрах передаётся — как именно надо будить. Теперь этот скрипт должен запускаться, когда начинается тот интервал, в течении которого я должен проснуться. Пускай он будет длиться 30 минут. Получается, что если мне надо проснуться не позже 9:30, то будильник надо ставить на 9:00.
Скрипт получился таким:

#!/bin/sh
# Максимальное время ожидания движения в секундах
MAX_TIME=1800
# Путь к флагу
FLAG_FILE=/tmp/motion.flag

# Убираем себя из кронтаба
crontab -l | grep -v alarm.sh | crontab -

# Если файл-флаг, который сообщает о движении уже существует, то удаляем его
if [ -f $FLAG_FILE ];
then
    rm $FLAG_FILE
fi

# Ждём в течении заданного времени
for i in `seq 1 $MAX_TIME`;
do
# Если появился флаг, значит есть движение, больше не надо ждать
    if [ -f $FLAG_FILE ];
    then
        break
    fi
    sleep 1
done

# Если надо, включаем радио
if [ "$1" -eq 1 ]
then
    radio.sh &
fi

# Если надо, включаем заданное количество ламп на люстре
if [ "$2" -ge 1 ]
then
    sleep 1
    light.sh $2 &
fi

# Если надо, включаем компьютер
if [ "$3" -eq 1 ]
then
    /usr/local/sbin/wakemypc
fi

# TODO: управление оконными шторами

В скрипте, который реагирует на пакеты от устройств умного дома, я сделал создание флага:

# $3 - тип команды, 21 - код информации о движении
if [ "$3" -eq 21 ]
then
    touch /tmp/motion.flag
fi

Если интересно, вот так происходит включение радио через radio.sh:

#!/bin/sh
# Имитируем нажатие кнопки включения ресивера на пульте-ДУ
echo "04040C017A850976">/tmp/clunet.fifo
sleep 10
for i in `seq 1 80`;
do
    # Увеличение громкости на 0.5 dB, имитируем нажатие кнопки увеличения громкости
    echo "04040C017A851AE5">/tmp/clunet.fifo
    sleep 6
done

Добавлением alarm.sh в crontab занимается PHP скрипт, поэтому будильник можно устанавливать через веб-интерфейс:

image

Или через приложение для Android:

Умный будильник на основе датчика движения или IP камеры

На самом деле такой будильник можно было сделать и без роутера с Linux, ведь датчик движения и ДУ-передатчик соединены напрямую, но для этого пришлось бы как-то научить их считать время, на что они изначально не были рассчитаны.

Использование IP-камеры

Теоретически для умного будильника можно использовать и IP-камеру с инфракрасной подсветкой, если направить её на кровать.

Умный будильник на основе датчика движения или IP камеры

Практически в любой такой камере есть возможность отслеживать движение. Админка моей камеры выглядит так:

Умный будильник на основе датчика движения или IP камеры

Да, корявый английский от китайцев :) Как видите, можно указать URL, который запрашивается при обнаружении движения. Дело за малым — написать PHP скрипт, при вызове которого будет создаваться флаг.

Плюс камеры в том, что теоретически она может увидеть движение и под одеялом, ведь оно изолирует тепло, на перемещение которого реагирует обычный датчик. Однако, практика показывает, что общая чувствительность и надёжность гораздо ниже.

Итог

Такие будильники действительно помогают сделать утро добрым. Ощущения бывают весьма своеобразными. Например, я могу во сне переворачиваться с боку на бок, и во время этого включается будильник, в результате чего я просыпаюсь скорее над кроватью, а не на ней :)
Увы, такой подход к созданию умного будильника подходит только для людей, которые спят в гордом одиночестве.

Надо сказать, что отдельный будильник в виде радио, которое постепенно увеличивает громкость, тоже очень приятный. Во время крепкого сна он не будит мгновенно, тихая музыка начинает пробиваться сквозь сон и постепенно нарастать. Однако, чаще я всё-таки просыпаюсь от звука включения ресивера.

Пока писал статью, пошёл седьмой час утра. Доброе утро, Хабр :)

Автор: ClusterM

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js