Diy

Проект Arduino Night Light и Sunrise Alarm

Проект Arduino Night Light и Sunrise Alarm

Люди естественно запрограммированы просыпаться с восходом солнца; к сожалению, современная жизнь продиктована произвольными часами, которые часто заставляют нас просыпаться, когда нет естественного света. Сегодня мы будем делать будильник на рассвете, который будет осторожно и медленно будить вас, не прибегая к оскорбительной шумовой машине.

Если создание восходящего будильника вам не по карману, ознакомьтесь с этими приложениями для iPhone и Android. которые определяют, когда лучше разбудить вас движениями тела. , гарантируя, что вы не оторвитесь от этого удивительного сна, а вместо этого проснетесь с ярким и свежим настроением — они действительно работают.

План проекта

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

Сроки будут проблемой — так как это прототип, я буду устанавливать Arduino для обратного отсчета всякий раз, когда он сбрасывается. Теоретически, мы должны терять только одну или две секунды каждый день, но в идеале мы должны включить чип «часов реального времени», чтобы сделать это более надежно. Тревога при восходе солнца будет срабатывать за 30 минут до времени пробуждения и постепенно увеличивать уровень выходного сигнала до тех пор, пока он не достигнет 100% яркости — этого должно быть достаточно, чтобы разбудить нас, хотя это хорошая идея, чтобы продолжать использовать обычный будильник, пока ваше тело не будет привык к этому.

Я также включу ночной свет в этот проект, который обнаруживает движение и активирует незаметный низкоуровневый свет под кроватью с 3-минутным интервалом, отдельно от светодиодного освещения, так как это заставит меня и мою жену проснуться , Освещение под кроватью будет коммерческим блоком питания, поэтому я включу реле внутри штепсельной розетки, чтобы включать и выключать его. Если вам неудобно работать при питании от сети переменного тока 110-240 В при любых обстоятельствах (и это, как правило, хорошее правило), подключите беспроводной передатчик 433 МГц с переключающими розетками, как описано в проекте домашней автоматизации Raspberry Pi Arduino. .

Список деталей и схема

  • Arduino
  • Набор светодиодных лент RGB
  • 12 вольт
  • 3 x МОП-транзистора N (я использую тип STP16NF06FP)
  • Реле и розетка питания, или розетки с беспроводным управлением и подходящий передатчик
  • Ваш выбор ночника (обычный источник питания с вилкой в ​​порядке)
  • ИК-датчик движения (HC-SR501) или гидролокатор SC-04 (не такой эффективный)
  • Световой датчик
  • Код проекта — но читайте дальше, чтобы убедиться, что вы понимаете, как все настроить.

Вот полная схема.

Восход сигнализации замыкания

Подключение реле

Примечание . Пропустите этот раздел, если вы хотите использовать огни RGB и в качестве ночного освещения — это специально для включения отдельного источника питания от сети.

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

реле проводки

Заземляющий и нейтральный кабели должны идти прямо в розетку и не касаться реле. У вас может не быть земной линии в США. Вы обязаны знать цветовую кодировку проводов в вашем регионе — если вы не можете подключить обычную розетку в вашем доме или подключить новую розетку, не пытайтесь встроить реле в одну!

Для проверки подключите сигнальный контакт реле к 12, затем запустите простую программу мигания, модифицированную для работы с контактом 12, а не 13, как по умолчанию. Ваша розетка должна включаться и выключаться каждые несколько секунд. Причина, по которой я не использую контакт 13, заключается в том, что во время процесса загрузки встроенный светодиодный индикатор срабатывает быстро, указывая на последовательную активность, что также приводит к активации реле.

Правильный выбор времени

Функции синхронизации и синхронизации затруднены без доступа к сетевому соединению или выделенных часов реального времени (они включают в себя собственные батареи для поддержания часов в рабочем состоянии, даже когда основной Arduino не имеет питания). Чтобы снизить расходы, я собираюсь обмануть. Я буду жестко задавать время начала для Arduino, чтобы начать отсчет времени; поэтому время будет зависеть от этого времени начала. Каждые 24 часа часы будут сбрасываться. Приведенный ниже код функции часов обеспечивает правильность глобальных переменных currentMillis и currentMinutes каждый день. Arduino не должен терять больше нескольких секунд каждые 45 дней; однако этот жестко запрограммированный стиль синхронизации весьма ограничен в том смысле, что отключение питания или случайный сброс повредят все, так что это, безусловно, одна область, которую можно улучшить. Если время не синхронизировано, просто сбросьте Arduino в установленное время запуска.

Код должен быть легким для понимания.

void clock(){ if(millis() >= previousMillis+86400000){ // a full day has elapsed, reset the clock; previousMillis +=86400000; } currentMillis = millis() - previousMillis; // this keeps our currentMillis the same each day currentMinutes = (currentMillis/1000)/60; } 

Функция ночного света

Я разделил основные циклы на отдельные функции, чтобы их было легче читать, удалять или настраивать. Функция nightLight () работает только между часами, когда Arduino был сброшен (я предполагаю, что вы, вероятно, будете делать это перед сном или около него, когда темно), и до тех пор, пока не начнется тревога восхода. Сначала я пытался использовать резистор, зависящий от света, но он не очень чувствителен к синему свету (это цвет, который я использую для ночного освещения), и его трудно откалибровать правильно. В любом случае, использование часов имеет больше смысла. Мы будем использовать глобальную переменную currentMinutes , которая сбрасывается каждый день.

PIR-датчик может быть немного странным, если вы никогда не использовали его раньше, хотя его подключение не сложно — вы найдете VCC , GND и OUT с четкой маркировкой на задней панели. У тебя тоже есть два переменных резистора; один с меткой RX определяет дальность (до 7 м), а другой с меткой TX определяет задержку. Задержка составляет 5 секунд при самом низком значении (полностью против часовой стрелки), и это означает, что любое мгновенное движение сработает как минимум на 5 секунд после включения датчика. Тем не менее, он также определяет задержку между активными состояниями — поэтому, если прошло 5 секунд, а движение не обнаружено, датчик отправит сигнал низкого уровня в течение не менее 5 секунд, даже если в течение этого периода будет движение. Если вы установили очень большую задержку около 30 секунд, может показаться, что датчик неисправен.

PIR-датчик

Если вы спите в одиночестве и не возражаете против использования одних и тех же полосовых RGB-ламп для сигнализации восхода и ночного освещения, вы сможете достаточно легко настроить код.

 void nightlight(){ // Only work between the hours of reset -> sunrise. if(currentMinutes < minutesUntilSunrise){ if(digitalRead(trigger) == 1){ nightLightTimeOff = millis()+nightLightTimeOut; // activate, or extend the time until turning off the light Serial.println("Activating nightlight"); } } //Turn light on if needed if(millis() < nightLightTimeOff){ digitalWrite(nightLight,HIGH); } else{ digitalWrite(nightLight,LOW); } } 

Тревога восхода солнца

Для простоты я буду использовать значение цвета RGB 255,255,0 для глубокого желтого восхода — таким образом, приращение на обоих цветовых каналах будет одинаковым. Если вы обнаружите, что он слишком рано разбудил вас, подумайте о том, чтобы начать с темно-красного и постепенно переходить в желтый или белый цвет. Увеличение, которое я использовал, было просто линейным — вы можете исследовать использование более естественной кривой для значений яркости.

Функция проста — она ​​определяет, сколько света следует увеличивать на каждую секунду, так что это происходит на полной яркости через 30 минут; затем умножает это на сколько секунд это в настоящее время в восходе солнца. Если он уже на полной яркости, он будет включен еще на 10 минут, чтобы убедиться, что вы в рабочем состоянии (и если вы все еще не в сети, вам, вероятно, следует включить резервный аварийный сигнал).

 void sunrisealarm(){ //each second during the 30 minite period should increase the colour value by: float increment = (float) 255/(30*60); //red 255 , green 255 gives us full brightness yellow if(currentMinutes >= minutesUntilSunrise){ //sunrise begins! float currentVal = (float)((currentMillis/1000) - (minutesUntilSunrise*60)) * increment; Serial.print("Current value for sunrise:"); Serial.println(currentVal); //during ramp up, write the current value of minutes X brightness increment if(currentVal < 255){ analogWrite(RED,currentVal); analogWrite(GREEN,currentVal); } else if(currentMinutes - minutesUntilSunrise < 40){ // once we're at full brightness, keep the lights on for 10 minutes longer analogWrite(RED,255); analogWrite(GREEN,255); } else{ //after that, we're nuking them back to off state analogWrite(RED,0); analogWrite(GREEN,0); } } } 

Подводные камни и будущие обновления

Я использую это в течение последних нескольких недель, и это действительно помогает проснуться, чувствуя себя более свежим и в приличном времени; ночник тоже работает очень хорошо. Это не идеально, так что вот несколько вещей, которые требуют работы и уроков, извлеченных во время строительства.

Восход сигнализации

При создании этого проекта я столкнулся с множеством проблем, связанных с большими числами, поэтому, если вы планируете модифицировать код, помните об этом. В языке Си очень важен набор переменных: число не всегда просто число. Например, длинные переменные без знака должны использоваться для хранения сверхбольших чисел, с которыми мы имеем дело, говоря о миллисекундах, но даже такое маленькое число, как 60 000, не может быть сохранено как обычное целое число ( целое число без знака было бы приемлемо для значений до 68 000). ) Суть в том, что читайте о типах переменных, когда используете большие числа, и если вы находите странные ошибки, это возможно потому, что у одной из ваших переменных недостаточно битов!

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

Свет утечки

Для будущей работы я надеюсь добавить ИК-приемник и продублировать некоторые функции оригинального контроллера — по крайней мере, возможность изменять цвета в качестве общего источника света, поскольку сейчас этот проект превращает полосу в выделенную ночь светлый. Я могу даже добавить автоматическую 30-минутную функцию тайм-аута.

Вы пробовали это, делали улучшения или получили другие идеи? Дай мне знать в комментариях!

Похожие посты
Diy

Вещи, которые вы должны иметь в виду, прежде чем брать ноутбук или смартфон в службу технической поддержки

Diy

Как использовать Arduino для съемки красивой скоростной фотографии

DiyLinux

Пять великолепных расширений Raspberry Pi, которые делают его еще более полезным

Diy

Первые шаги с Arduino: пристальный взгляд на печатную плату и структуру программы