Сделай с нами: Smart-ночник!

Сегодняшнее устройство будет довольно простым, но это не будет его недостатком - мы подготовили для Вас основу, опираясь на которую вы сможете создать свой неповторимый светильник со своим неповторимым видом и функционалом. Итак - приступим к созданию "асферического коня в вакууме".

Для начала поймем с чего всё началось: это - корпус от самой обычной камеры видеонаблюдения, который у меня остался с одного из объектов, на котором я заменял камеры. Чутьё радиолюбителя подсказало, что это "прекрасный корпус для чего-то, что будет светиться и переливаться". И так он пролежал год в родной коробочке.

Собственно задача которая была поставлена перед разработкой проста и звучала приблизительно так:
На базе сборки светодиодов и Arduino Nano сделать USB светильник, который светился разным тоном света в зависимости от температуры в комнате. За измерение последней должен отвечать термометр DS18B20 и никакой другой.

Соответственно этому список необходимых деталей оказался совсем небольшим:

  1. Arduino Nano - 1шт.
  2. Светодиодная сборка диск или кольцо WS2812 - 1шт.
  3. Термометр DS18B20 - 1шт.
  4. резистор 4.7кОм -  1шт.
  5. Набор соединительных проводов мама-мама 20 шт - 1 комплект.
  6. Блок питания от мобильного телефона с разъёмом MicroUSB - 1шт

Для начала оговорюсь сразу - придется немного попаять, самую малость. Представим себе схему нашего устройства:

Схема, судя из картинки совсем простая (как и говорилось выше - это платформа): термометр питается от 3.3В со стабилизатора на Arduino Nano и подключен к выводу D3, а сигнальный пин светодиодной сборки подключен выводу D3 запитанной от 5В. Таким образом задействовано всего два вывода и это значит, что к этому контроллеру можно подключить всё, что угодно! Есть желание - подключай дисплей и выводи на него температуру или счетчик новых событий в FaceBook/VK. Есть желание - подключи RTC DS1307 и получи ночник, который сам знает когда включиться и когда выключиться. В общем дальнейшее развитие этого проекта зависит только от того, насколько развито ваше воображение.

Ниже представляю код:

Остановимся подробнее на коде программы: как описывалась исходная задача, этот светильник должен реагировать на температуру, соответственно этому выставляется различный цветовой тон (модель цвета "HSV"- тон-насыщенность-яркость, конвертируется в RGB средствами предложенной Arduino библиотекой), а для того, чтоб светильник не был столь скучным, добавили небольшую анимацию - в зависимости от температуры светильник может быть голубым, зеленым, желтым, красным и даже фиолетовым.
Термометр DS18B20 запитан от 3.3В неслучайно. поскольку он работает в режиме максимальной точности в 12бит, ему необходимо как можно более качественное питание, собственно для нас важна не сама точность, а её разрешение, чтоб переливы свечения были плавными.
Собственно основной цикл программы работает в следующем режиме:
  • Если идет анимация перехода между цветами свечения,то выводим на светодиоды следующий "кадр".
  • Если анимация завершена, замеряем температуру, формируем следующий набор цветов для светодиодов и запускаем анимацию снова
Отдельно стоит заострить внимание на этом участке кода:

const uint16_t PixelCount = 7; 
const uint8_t PixelPin = 2; 
const float coldTemp = 23.0f;
const float hotTemp = 28.0f;
const float coldColor = 0.17f;
const float hotColor = 1.0f;

С первыми двумя параметрами всё вполне ясно: количество светодиодов и с помощью какого вывода Arduino ими управлять. Но вот 4 последующие параметра более интересны: coldTemp и hotTemp указывают диапазон температур (от 23оС до 30оС), внутри которого светильник будет менять свой основной цвет, а coldColor и hotColor указывают на крайние состояния по спектру(в данном случае небесный голубой и огненно красный). Если же предположим температура будет ниже крайних значений, то светильник будет указывать именно крайние значения, за это отвечает функция rescale, которая делает линейный пересчет координаты цвета в зависимости от температуры.

float rescale(float x, float xmin, float xmax, float ymin, float ymax){
if (x <= xmin){return ymin;}
if (x >= xmax){return ymax;}
return ymin + (ymax - ymin) * ((x - xmin)/(xmax-xmin));
}

Собственно функции PickRandom и BlendAnimUpdate отвечают за подбор следующего цвета для анимации и формирование каждого нового кадра.
Теперь поговорим о самом интересном, процессе сборки. Для начала организуем подключение для светодиодного модуля, и тут, как я говорил раньше, придется взять в руки паяльник на 5 минут. Я сделал коннектор из запчастей от погибшего в борьбе со мной DVD-плеера, как это получилось можно увидеть на фото ниже.

Если у вас нет своего "ящичка с барахлом", то для этой цели придется пожертвовать 3-мя соединительными проводами, откусив один из концов (а вообще лучше резать по середине, тогда через разветвитель можно будет соединить этот модуль с последующими). Отдельно стоит сказать о подключении модуля. Сами светодиоды, если говорить довольно образно, это далекие аналоги "регистров-защелок" 74HC595, где за каждый цвет отвечает отдельная "защелка", а когда все три защелки узнали, какой цвет надо отображать - то выход последней начинает повторять то, что ему продолжают указывать на входе. Собственно, для передачи 0 или 1 надо отправлять пары импульсов 1 и 0 определенной длительности. Для того, чтоб начать сначала нужно просто подождать. Сигнал с управляющего контроллера должен прийти на вывод DI (см. фото ниже). Ну а питание - как обычно: на контакт V - подключаем +5В, а на контакт G - общий вывод.

Светодиодный модуль подготовили, теперь надо подготовить термометр DS18B20. Я поступил просто - воткнул его во всё те же соединительные провода вместе с подтягивающим резистором на 4.3К. Получилось не очень красиво, но я решил не мучить бедный термометр очередной пайкой.

Осталось дело за малым - подключить термодатчик и светодиодную сборку к управляющему контроллеру. Соединяем всё, прошиваем, проверяем и укладываем в дно бокса.

Подключаем USB-кабель к ардуинке, он у нас будет и как источник питания, и для вывода температуры через последовательный порт. Закрываем корпус и вуаля - получаем ночник. Ниже предоставлен вид собранного ночника и какой он в работе.