http://habrahabr.ru/post/229713/
Думаю, что многие из вас знают про разные фазы сна и существование умных будильников, про это было уже много статей. Суть в том, что на протяжении ночи происходит смена фаз быстрого и медленного сна. В зависимости от того, в какую из фаз вы проснулись, утро может быть как добрым, так и весьма серым. Во время медленного сна человек постепенно засыпает всё крепче и крепче, будить его в этот момент не стоит, проснуться будет тяжело. Во время быстрой фазы человек спит не так крепко, может ворочаться и переворачиваться с боку на бок. Именно в этот момент легче всего проснуться.
На этом принципе построены многие умные будильники. Они бывают как в виде настольных гаджетов или наручных часов, так и в виде приложений для смартфона. Принцип их работы весьма прост. Будят они не в строго заданный момент, а в промежуток времени, когда желательно проснуться, ожидая при этом какое-либо движение. Если человек начал шевелиться, значит началась фаза быстрого сна, и его пора будить.
У меня в комнате один из датчиков движения висит прямо над кроватью. Об этом я немного рассказывал в своей
статье про мой умный дом.
Недавно я просматривал логи и заметил, что на истории движения с этого датчика очень чётко видны фазы моего сна, когда я сплю один. Это не удивительно, он очень хорошо фиксирует любое моё движение, даже если я лежу под одеялом. Сразу же возникла мысль — почему бы не сделать мой будильник «умным»?
Датчик движения
Многие спрашивали меня, как же устроены мои датчики, просили дать схему. На самом деле всё проще некуда. Я пошёл в ближайший электромонтажный магазин и купил обычный бытовой датчик движения для включения света, обошлось мне это примерно в 200 рублей. У него было три вывода: общий, питание 220В и выход. Однако, для моих целей коммутация такого напряжения была совсем ни к чему. Я разобрал датчик и обнаружил внутри две платы: мозги и питание. Первая питалась от напряжения около 9В и давала на выходе логическую единицу при наличии движения. Вторая же предоставляла эти самые 9 вольт за счёт конденсаторного питания и коммутировала нагрузку электромагнитным реле. В результате плата с конденсаторным питанием была заменена на мою плату с микроконтроллером:
Задача микроконтроллера предельно проста: ждать логическую единицу от датчика движения и посылать в сеть умного дома информацию об этом, но делать это не чаще, чем раз в минуту. Питается же всё это теперь от 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 скрипт, поэтому будильник можно устанавливать через веб-интерфейс:
Или через приложение для Android:
На самом деле такой будильник можно было сделать и без роутера с Linux, ведь датчик движения и ДУ-передатчик соединены напрямую, но для этого пришлось бы как-то научить их считать время, на что они изначально не были рассчитаны.
Использование IP-камеры
Теоретически для умного будильника можно использовать и IP-камеру с инфракрасной подсветкой, если направить её на кровать.
Практически в любой такой камере есть возможность отслеживать движение. Админка моей камеры выглядит так:
Да, корявый английский от китайцев :) Как видите, можно указать URL, который запрашивается при обнаружении движения. Дело за малым — написать PHP скрипт, при вызове которого будет создаваться флаг.
Плюс камеры в том, что теоретически она может увидеть движение и под одеялом, ведь оно изолирует тепло, на перемещение которого реагирует обычный датчик. Однако, практика показывает, что общая чувствительность и надёжность гораздо ниже.
Итог
Такие будильники действительно помогают сделать утро добрым. Ощущения бывают весьма своеобразными. Например, я могу во сне переворачиваться с боку на бок, и во время этого включается будильник, в результате чего я просыпаюсь скорее над кроватью, а не на ней :)
Увы, такой подход к созданию умного будильника подходит только для людей, которые спят в гордом одиночестве.
Надо сказать, что отдельный будильник в виде радио, которое постепенно увеличивает громкость, тоже очень приятный. Во время крепкого сна он не будит мгновенно, тихая музыка начинает пробиваться сквозь сон и постепенно нарастать. Однако, чаще я всё-таки просыпаюсь от звука включения ресивера.
Пока писал статью, пошёл седьмой час утра. Доброе утро, Хабр :)