Рекламное объявление
Люди естественно запрограммированы просыпаться с восходом солнца; к сожалению, современная жизнь продиктована произвольными часами, которые часто заставляют нас просыпаться, когда нет естественного света. Сегодня мы будем делать будильник на рассвете, который будет медленно и медленно будить вас, не прибегая к оскорбительной машине, производящей шум.
Если создание восходящего будильника - это слишком много для вас, проверьте эти iPhone и Приложения для Android Используйте эти приложения, чтобы помочь вам лучше спать [Android и iOS]После напряженного дня лучшее, что вы можете сделать, - это выспаться. Всегда появляются новые исследования, которые доказывают, насколько важен сон для человека, улучшая ... Подробнее которые обнаруживают когда лучше разбудить вас движениями тела Может ли приложение действительно помочь вам лучше спать?Я всегда был немного экспериментатором сна, большую часть своей жизни вел тщательный дневник снов и учился как можно больше спать во время сна. Есть ... Подробнее
гарантируя, что вы не оторвались от этого удивительного сна, а проснулись, чувствуя себя бодрыми и свежими - они действительно работают.План проекта
Основной частью проекта будет 5-метровая светодиодная лента, уложенная вокруг кровати. Мы запитаем их с помощью внешнего источника питания 12 В, переключаемого с помощью некоторых транзисторов MOSFET N. Настройка для этой части будет идентична динамическая система освещения Создайте свое собственное динамическое окружающее освещение для медиацентраЕсли вы смотрите много фильмов на своем компьютере или в медиацентре, я уверен, что вы столкнулись с дилеммой освещения; Вы полностью выключаете все огни? Вы держите их на полную мощность? Или же... Подробнее Я построил раньше.
Сроки будут проблемой - так как это прототип, я буду устанавливать Arduino для обратного отсчета всякий раз, когда он сбрасывается. Теоретически, мы должны терять только одну или две секунды каждый день, но в идеале мы должны включить чип «часов реального времени», чтобы сделать это более надежно. Сигнал восхода солнца включается за 30 минут до времени пробуждения и медленно увеличивает уровень выходного сигнала до тех пор, пока он не достигнет 100% яркости - этого должно быть достаточно, чтобы разбудить нас, хотя было бы неплохо продолжать использовать обычный будильник, пока ваше тело не привыкнет к Это.
Я также включу ночной свет в этот проект, который обнаруживает движение и активирует сдержанный низкий уровень свет под кроватью с 3-минутным тайм-аутом, отдельно от светодиодов, так как они могут разбудить меня и мою жену вверх. Освещение под кроватью будет коммерческим блоком питания, поэтому я включу реле внутри штепсельной розетки, чтобы включать и выключать его. Если вам неудобно работать при питании от сети переменного тока 110-240 В при любых обстоятельствах (и это обычно хорошее правило), затем подключите беспроводной передатчик 433 МГц с переключающими розетками, как указано на Raspberry Pi Arduino проект домашней автоматизации Руководство по домашней автоматизации с Raspberry Pi и ArduinoРынок домашней автоматизации наводнен дорогими потребительскими системами, несовместимыми друг с другом и дорогостоящими в установке. Если у вас есть Raspberry Pi и Arduino, вы можете добиться того же в ... Подробнее .
Список деталей и схема
- Arduino
- Набор светодиодных лент RGB
- 12 вольт
- 3 x МОП-транзистора N-транзистора (я использую тип STP16NF06FP)
- Реле и розетка питания, или розетки с беспроводным управлением и подходящий передатчик
- Ваш выбор ночника (обычный источник питания с вилкой в порядке)
- ИК-датчик движения (HC-SR501) или гидролокатор SC-04 (не такой эффективный)
- Световой датчик
- Код проекта - но читайте дальше, чтобы убедиться, что вы понимаете, как все настроить.
Вот полная схема.

Подключение реле
Заметка: Пропустите этот раздел, если вы хотите использовать лампы RGB и в качестве ночного освещения - это специально для включения отдельного источника питания от сети.
Для переключения сетевого питания ваше реле должно быть рассчитано на напряжение - 110V или же 240 В переменного тока в зависимости от того, где вы живете - и больше, чем общая сила тока вы будете переключаться. Тот, который я использовал из этого пакета датчиков (отказ от ответственности: это мой магазин) является 250 В переменного тока / 10 Атак что мы должны быть в безопасности. Реле имеют ком порт, как правило, в центре, который должен быть подключен к проводу под напряжением, идущему в вилку; затем подключите терминал сокета к НЕТ (нормально открытый). Я не должен был говорить вам не делать этого, если он подключен к розетке, иначе вы умрете. Если вы боитесь возиться с питанием от сети, используйте вместо этого розетки с беспроводным переключением.

Кабели заземления и нейтрали должны идти прямо к розетке и не касаться реле. У вас может не быть земной линии в США. Это ваша ответственность, чтобы узнать цветовое кодирование проводов в вашем районе - если вы не можете подключить обычную розетку в вашем доме или подключить новую розетку, не пытайтесь встроить реле в одну!
Для проверки подключите сигнальный контакт реле к 12, затем запустите простую программу мигания, модифицированную для работы с контактом 12, а не 13, как по умолчанию. Ваша розетка должна включаться и выключаться каждые несколько секунд. Причина, по которой я не использую контакт 13, заключается в том, что во время процесса загрузки встроенный светодиодный индикатор срабатывает быстро, указывая на последовательную активность, что также приводит к активации реле.
Правильный выбор времени
Функции синхронизации и синхронизации затруднены без доступа к сетевому соединению или выделенного Часы реального времени (к ним относятся их собственные батареи, чтобы часы работали, даже когда основной Arduino не имеет питания). Чтобы снизить расходы, я собираюсь обмануть. Я буду жестко задавать время начала для Arduino, чтобы начать обратный отсчет; поэтому время будет зависеть от этого времени начала. Каждые 24 часа часы будут сбрасываться. Приведенный ниже код функции часов проверяет глобальные переменные currentMillis и currentMinutes верны каждый день. Arduino не должен терять больше нескольких секунд каждые 45 дней; однако этот жестко запрограммированный стиль синхронизации весьма ограничен в том смысле, что отключение питания или случайный сброс повредят все, так что это, безусловно, одна область, которую можно улучшить. Если время не синхронизировано, просто сбросьте Arduino в установленное время запуска.
Код должен быть легким для понимания.
void clock () {if (millis ()> = previousMillis + 86400000) {// истек полный день, сбросить часы; previousMillis + = 86400000; } currentMillis = millis () - previousMillis; // это сохраняет наш currentMillis каждый день currentMinutes = (currentMillis / 1000) / 60; }
Функция ночного света
Я разделил основные циклы на отдельные функции, чтобы их было легче читать, удалять или настраивать. Nightlight () функция работает только между часами, когда Arduino был сброшен (я предполагаю, что вы, вероятно, сделаете это перед сном или около него, когда темно), и до тех пор, пока не начнется тревога восхода. Первоначально я пытался использовать резистор, зависящий от света, но он не очень чувствителен к синему свету (это цвет, который я использую для ночного света), и его трудно откалибровать правильно. В любом случае, использование часов имеет больше смысла. Мы будем использовать глобальный currentMinutes переменная, которая сбрасывается каждый день.
PIR-датчик может быть немного странным, если вы никогда не использовали его раньше, хотя подключить его не сложно - вы найдете VCC, GND, и ВНЕ четко обозначены на спине. У тебя тоже есть два переменных резистора; один с меткой RX определяет диапазон (до 7 м), а другой с меткой TX определяет задержку. Задержка составляет 5 секунд при самом низком значении (полностью против часовой стрелки), и это означает, что любое кратковременное движение приведет к срабатыванию датчика не менее чем на 5 секунд. Тем не менее, он также определяет задержку между активными состояниями - так, если истекает 5 секунд, и нет движения датчик обнаружит сигнал низкого уровня в течение не менее 5 секунд, даже если в течение этого времени период. Если вы установили очень большую задержку около 30 секунд, может показаться, что датчик неисправен.

Если вы спите в одиночестве и не возражаете против использования одних и тех же RGB-ламп для подсветки будильника и ночной подсветки, вы сможете достаточно легко настроить код.
void nightlight () {// Работает только между часами сброса -> восход. if (currentMinutes
Тревога восхода солнца
Для простоты я буду использовать значение цвета RGB 255,255,0 для глубокого желтого восхода - таким образом, приращение на обоих цветовых каналах будет одинаковым. Если вы обнаружите, что он слишком рано разбудил вас, подумайте о том, чтобы начать с темно-красного и постепенно переходить в желтый или белый цвет. Увеличение, которое я использовал, было просто линейным - вы можете исследовать использование более естественной кривой для значений яркости.
Функция проста - она определяет, сколько света следует увеличивать на каждую секунду, например, при полной яркости через 30 минут; затем умножает это на сколько секунд это в настоящее время в восходе солнца. Если он уже работает на полной яркости, он остается включенным еще 10 минут, чтобы убедиться, что вы в рабочем состоянии (и если вы все еще не в нем, вам, вероятно, следует включить резервный аварийный сигнал).
void sunrisealarm () {// каждую секунду в течение 30-минутного периода следует увеличивать значение цвета на: float increment = (float) 255 / (30 * 60); // красный 255, зеленый 255 дает нам полную яркость желтый if (currentMinutes> = minutesUntilSunrise) {// восход начинается! float currentVal = (float) ((currentMillis / 1000) - (minutesUntilSunrise * 60)) * приращение; Serial.print («Текущее значение для восхода солнца»); Serial.println (currentVal); // во время разгона записываем текущее значение в минутах при увеличении яркости if (currentVal <255) {analogWrite (RED, currentVal); analogWrite (ЗЕЛЕНЫЙ, currentVal); } else if (currentMinutes - minutesUntilSunrise <40) {// как только мы достигнем полной яркости, оставьте свет включенным на 10 минут дольше analogWrite (RED, 255); analogWrite (ЗЕЛЕНЫЙ, 255); } else {// после этого мы возвращаем их в нерабочее состояние analogWrite (RED, 0); analogWrite (ЗЕЛЕНЫЙ, 0); } } }
Подводные камни и будущие обновления
Я использую это в течение последних нескольких недель, и это действительно помогает проснуться, чувствуя себя более свежим и в приличном времени; ночник тоже работает очень хорошо. Это не идеально, так что вот несколько вещей, которые требуют работы и уроков, извлеченных во время строительства.

При создании этого проекта я столкнулся с множеством проблем, связанных с большими числами, поэтому, если вы планируете модифицировать код, помните об этом. На языке Си типизация ваших переменных очень важна - число не всегда просто число. Например, без знака долго переменные должны использоваться для хранения сверхбольших чисел, с которыми мы имеем дело, говоря о миллисекундах, но даже такое маленькое число, как 60 000, не может быть сохранено как обычное целое число (без знака int было бы приемлемо для до 68 000). Дело в том, читать о ваших переменных типов при использовании больших чисел, и если вы находите странные ошибки, это возможно потому, что одной из ваших переменных не хватает битов!
Я также обнаружил проблему с утечками напряжения очень низкой яркости, которые приводят к малейшему количеству испускаемого света, даже когда digitalWrite (RED, 0) сигнал испускается - я не думаю, что это аппаратная проблема с полосами, так как они отлично работают с официальными контроллерами. Если кто-то может решить эту проблему, изображенную ниже, я был бы очень признателен. Я попробовал снять резисторы и ограничить выходное напряжение на выводах Arduino. Возможно, мне понадобится добавить простую схему переключения питания, чтобы напряжение питания на светодиодной полосе использовалось только тогда, когда это действительно необходимо; или это могут быть неисправные МОП-транзисторы.

Для дальнейшей работы я надеюсь добавить ИК-приемник и продублировать некоторые функции оригинального контроллера - по адресу по крайней мере, возможность менять цвета как свет общего назначения, так как сейчас этот проект превращает полосу в специальную ночь свет. Я могу даже добавить автоматическую 30-минутную функцию тайм-аута.
Вы пробовали это, делали улучшения или получили другие идеи? Дай мне знать в комментариях!
Джеймс имеет степень бакалавра в области искусственного интеллекта и сертифицирован CompTIA A + и Network +. Он является ведущим разработчиком MakeUseOf и проводит свое свободное время за игрой в VR-пейнтбол и настольные игры. Он строит компьютеры с детства.