Проект 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 и в качестве ночного освещения — это специально для включения отдельного источника питания от сети.

Для переключения сетевого питания ваше реле должно быть рассчитано на напряжение — 110V или же 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 переменная, которая сбрасывается каждый день.

ИК-датчик может быть немного странным, если вы никогда не использовали его раньше, хотя его подключение не сложно — вы найдете VCC, GND, а также ИЗ четко обозначены на спине. У тебя тоже есть два переменных резистора; один с меткой 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 (КРАСНЫЙ, 0) сигнал испускается - я не думаю, что это аппаратная проблема с полосами, так как они отлично работают с официальными контроллерами. Если кто-то может решить эту проблему, изображенную ниже, я был бы очень признателен. Я попробовал снять резисторы и ограничить выходное напряжение на выводах Arduino. Возможно, мне понадобится добавить простую схему переключения питания, чтобы напряжение питания на светодиодной полосе использовалось только при необходимости; или это могут быть неисправные МОП-транзисторы.

Свет утечки

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

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

Ссылка на основную публикацию
Adblock
detector