Anymous | Дата: Субботу, 29.11.2014, 21:47 | Сообщение # 1 |
|
Сообщений: 863 |
Репутация: 53 ± |
Награды: 24 +
|
|
|
Думаю, что многие из вас знают про разные фазы сна и существование умных будильников, про это было уже много статей. Суть в том, что на протяжении ночи происходит смена фаз быстрого и медленного сна. В зависимости от того, в какую из фаз вы проснулись, утро может быть как добрым, так и весьма серым. Во время медленного сна человек постепенно засыпает всё крепче и крепче, будить его в этот момент не стоит, проснуться будет тяжело. Во время быстрой фазы человек спит не так крепко, может ворочаться и переворачиваться с боку на бок. Именно в этот момент легче всего проснуться.
На этом принципе построены многие умные будильники. Они бывают как в виде настольных гаджетов или наручных часов, так и в виде приложений для смартфона. Принцип их работы весьма прост. Будят они не в строго заданный момент, а в промежуток времени, когда желательно проснуться, ожидая при этом какое-либо движение. Если человек начал шевелиться, значит началась фаза быстрого сна, и его пора будить.
Недавно я просматривал логи и заметил, что на истории движения с этого датчика очень чётко видны фазы моего сна, когда я сплю один. Это не удивительно, он очень хорошо фиксирует любое моё движение, даже если я лежу под одеялом. Сразу же возникла мысль — почему бы не сделать мой будильник «умным»?
Датчик движения Многие спрашивали меня, как же устроены мои датчики, просили дать схему. На самом деле всё проще некуда. Я пошёл в ближайший электромонтажный магазин и купил обычный бытовой датчик движения для включения света, обошлось мне это примерно в 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 скрипт, при вызове которого будет создаваться флаг.
Плюс камеры в том, что теоретически она может увидеть движение и под одеялом, ведь оно изолирует тепло, на перемещение которого реагирует обычный датчик. Однако, практика показывает, что общая чувствительность и надёжность гораздо ниже.
Итог Такие будильники действительно помогают сделать утро добрым. Ощущения бывают весьма своеобразными. Например, я могу во сне переворачиваться с боку на бок, и во время этого включается будильник, в результате чего я просыпаюсь скорее над кроватью, а не на ней Увы, такой подход к созданию умного будильника подходит только для людей, которые спят в гордом одиночестве.
Надо сказать, что отдельный будильник в виде радио, которое постепенно увеличивает громкость, тоже очень приятный. Во время крепкого сна он не будит мгновенно, тихая музыка начинает пробиваться сквозь сон и постепенно нарастать. Однако, чаще я всё-таки просыпаюсь от звука включения ресивера.
Пока писал статью, пошёл седьмой час утра. Доброе утро, Хабр
habrahabr.ru
Как создать скриншот? | Как создать лог файл HijackThis? Причины, по которым может тормозить компьютер | Правила сайта!
|
|
| |