Авторизация
Зарегистрироваться

Светодиодная лента на WS2812 и пластиковый таз.


Главным героем данного обзора я решил сделать светодиодную ленту. Просто потому, что она является самым дорогим элементом конструкции. Но, если учитывать сложность покупки и муки выбора — честнее было сделать главным элементом обычный пластиковый таз.
Итак. ТАЗ + светодиодная лента + кусок оргстекла + arduino nano + DS3231 + немного барахла из загашников = устройство, о полезности которого можно спорить, но моим домашним оно очень нравится! Кому интересно, тот сам знает куда нужно заглянуть.
Постараюсь быть краток, как никогда.

С чего всё началось
Увидел это и прямо влюбился.

Хочу, хочу, хочу!

Часть первая. Обломная.
Это был тот редкий случай, когда описания конструкции я не нашел. Впрочем, не особо и искал. В общем, долго не думал, схватил жменю 74H595, жменю диодов и на крышке от пресерв сотворил макет прадеда моего устройства…
Слабонервным не смотреть!

Светодиоды разного цвета для простоты отслеживания сектора, в котором находятся «стрелки».

Поиграл немного с этим ужасом и решил, что конструкцию нужно упростить. Самого главного я тогда не «ущучил». Результатом стала замена кучи 74H595 на MAX7219. Управлять 60-ю диодами с ее помощью просто пара пустяков. И тут я «ущучил» главную мысль! Светодиоды светят с одинаковой яркостью, а без управления яркостью светодиодов, я не смогу отличить часовую «стрелку» от минутной. Это был облом. Ни чего подходящего с ШИМ у меня в загашниках не имелось, и на некоторое время работа над мечтой была заброшена.

Часть вторая. Свето-в-конце-туннельная.
Мысль об использовании светодиодной ленты пришла случайно. Узнал, что она продается с разным количеством диодов на метр. Когда среди этих цифр мелькнуло число 60 диодов/метр, меня прямо как током ударило! 60, это же моё любимое число (в данном проекте)! А метр, это неплохая длина окружности для моих часов! Итог: лента была срочно-пресрочно заказана. Ехала чуть больше месяца, но приехала без повреждений. Заказал 5 метров просто из жадности для других безумных идей.
Фото ленты

И понеслось!!!
Комплектующие
Ардуино валялось давно. Брал здесь.
Часы реального времени тоже скучали без дела. Отсюда.

Сенсор расстояния до препятствия был заказан специально для этого проекта такой. По факту пришел другой Но я не обиделся.
До него я вдоволь наигрался с ультразвуковым датчиком HC-SR04, но из-за его капризности и сложности настройки в моем проекте, а также из-за размеров, решил его не использовать.
Кольцо из оргстекла мне вырезал знакомый на хорошем станке. И из хооорошего оргстекла, толщиной 4мм. Светопропусканием 60% и высокой светорассеиваемостью (теперь я знаю, что это было не правильно). Во всяком случае, я хотел не так.
Блок питания от роутера D-Link, с параметрами 5V-2.5A валялся с таких давних времен, когда еще деревья были большими.

Кнопки с куском платы не стоят серьезного упоминания — любые подойдут.

Сырой прототип я собрал достаточно быстро. Запустил, поиграл и понял — нет удовольствия от завершенности конструкции. Всему виною было круглое основание, на котором крепилась лента. Из чего я его только не делал: картон, оргстекло+фен, мягкий пластик. Всё было не то. Получить идеально круглую форму не удавалось. В режиме часов, это и не особо важно, но в режиме светильника — малейшая кривизна видна в виде кривой границы света и тени. Тут вылезла еще одна ошибка — светопропускание оргстекла для кольца должно быть ниже. Значительно ниже.
В итоге, проект, который уже работал, опять лег на полку((( Поиски готового кольца, или вариантов его изготовления велись долго. Придумано было много вариантов, большинство из которых нуждались в применении промышленного оборудования. Решение же искалось максимально простое и доступное. И тут, можно сказать, меня осенило!
Неужели промышленность не выпускает ни чего такого круглого, белого и ровного, с диаметром, который меня устроит?
Главное - ТАЗ!
Представьте себе человека, который ходит по хозмагам и меряет внутренний диаметр тазов, бочонков и т.п. Это был я. Одни раз продавец решил мне помочь с выбором таза: про хорошую цену из старой поставки рассказал, не хрупкую пластмассу и т.п. Но, когда я сказал, что мне крайне важен внутренний диаметр, малая конусность стенок и не очень подходит бледно красный, а нужен белый цвет, продавец замолк, и было ясно видно на его лице, как он меня жалеет. Нет, он не смеялся — грех смеяться над убогим.
И таз я нашел! Какой красавец, а?
Куплен в оффлайновом хозмаге за ~$2,8.

Особенно доставило название таза – «Ориджинал». А мне копия или подделка и не нужна была! Онли ориджинал, браза!
Для тех, кто желает повторить, привожу техпаспорт таза
Это на случай того, что в ваших хозмагах может и не попасться понимающий продавец;)

Кратко остановлюсь на процессе вырезания кольца из таза. Он прост, до безобразия. На боковых поверхностях таза есть еле заметные кольцевые следы от штампа. От них я и отложил нужные расстояния, чтобы получить кольцо, шириной 5 см. Затем, с помощью гибкой металлической линейки, соединил точки в линию. Таз тонкостенный, и если в массе он кажется и ощущается толстым и прочным, то лишенный бортика с ручками, стал очень хлипкий. Резал я его острым канцелярским ножом. Аккуратно вел лезвием по линии разреза, а потом аккуратно сгибал край, и пластмасса трескалась ровно по линии надреза.
Затем по краям прошелся наждачкой на бруске.
Пытливые умы спросят, а как быть с некоторой конусностью получившегося кольца? Да, она ощущается. И просто так ленту не наклеить. Но я взял тонкий двусторонний скотч, и полоску из него, шириной 2 мм, наклеил на существующий скотч ленты со стороны, которая располагается ближе к большему диаметру кольца.
Она вполне компенсировала конусность.

Для крепления кольца к кольцу (игра слов) был использован клей «Момент гель прозрачный». Просто потому, что он у меня был. В целом, его прозрачность роли не играет. Остальные части склеены либо с помощью клеевого пистолета, либо двусторонним скотчем. Им же заклеены светодиоды на часах реального времени и ардуино — лишняя цветомузыка мне ни к чему.
Проводники питания в светодиодной ленте закольцевал. Ток все-таки по ним идет не маленький. Управляющий проводник, естественно закольцовывать нельзя. Сигнал управления на ленту подал через резистор 240 ом.
Теперь перейдем к начинке и скетчу. Принципиальную схему устройства приводить не буду. Не из жадности, а потому, что скетч содержит огромное количество комментариев, и желающие повторить, могут все соединения делать по скетчу.
Код программы
#include <Bounce.h>                                              //библиотека для обработки кнопок
#include <RTC.h>                                                 //библиотека часов реального времени
#include <Adafruit_NeoPixel.h>                                   //библиотека светодиодной ленты
                                                                 //часы реального времени:SCL-A5, SDA-A4
RTC    time;
#define PIN            12                                        //этот пин управляет светодиодной лентой через резистор 200-400 Ом
#define NUMPIXELS      60                                        //количество светодиодов в ленте
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

uint8_t t_hour,t_min,t_sec;                                      //текущие значения часов, минут, секунд
uint8_t o_sec;                                                   //предыдущее значение часов, минут, секунд
uint8_t set_sec, set_hour, set_min;                              //переданные в светодиодную ленту значения часов, минут, секунд
uint8_t status=0;                                                //0-светильник, 1-часы
uint8_t l_status=0;                                              //статус светильника
unsigned int finger;                                             //переменная с значением данных от датчика приближения
#define BUTTON1 7                                                //кнопка + часов к пину 7
#define BUTTON2 8                                                //кнопка + минут к пину 8
#define BUTTON3 9                                                //кнопка - минут к пину 9

Bounce bouncer1 = Bounce(BUTTON1,30); 
Bounce bouncer2 = Bounce(BUTTON2,30); 
Bounce bouncer3 = Bounce(BUTTON3,30); 

void setup() {
   Serial.begin (9600); 
   time.begin(RTC_DS3231);
   pixels.begin();                                                // инициализация NeoPixel library.
   pixels.clear();                                                //очищаем данные ленты
   pixels.show();                                                 //разрешаем отображение
    
    pinMode(A0, INPUT);                                           //сигнал с датчика приближения, пин А0
    pinMode(BUTTON1,INPUT_PULLUP);                                //включаем подтягивающие резисторы на пинах кнопок
    pinMode(BUTTON2,INPUT_PULLUP);
    pinMode(BUTTON3,INPUT_PULLUP);
    finger=0;                                                     //таким образом инициируем при включении режим светильника
   }

void loop() { 

finger = analogRead(A0);                                          //обработка пальца)))
//Serial.println(finger);                                         //раскомментировать для подбора значения ниже
if (finger > 210) {                                               //значение подбирается экспериментальным путем
   status=1;
 } else {
   status=0;
 }

if (status == 1){                                                  //0-светильник, 1-часы
   time_ring();}
else
   light_on();
}                                                                  //конец loop (мне так удобнее, привычка из 1С)

void time_ring(){                                                  //функция отображения времени (режим часы)
time.gettime("d-m-Y, H:i:s, D");
t_min = time.minutes;                                              //получили минуты
t_hour = time.Hours;                                               //получили часы
set_hour = t_hour % 12;                                            //переведем часы в 12-часовой формат
set_hour = set_hour * 5 + t_min / 12;                              //определим положение часовой "стрелки". Двигаем ее каждые 12 минут на одно деление
t_sec = time.seconds;                                              //получили секунды

    set_sec = t_sec + 30;                                          //теперь переворачиваем часы на 180 градусов, у нас же тени - стрелки
    if (set_sec >= 60)
          set_sec = set_sec - 60;
    set_min = t_min + 30;
    if (set_min >= 60)
          set_min = set_min - 60;  
    set_hour = set_hour + 30;
    if (set_hour >= 60)
          set_hour = set_hour - 60;
            
    if (set_sec != o_sec) {                                         //обновляем индикацию раз в секунду, чтобы не мерцала

        //Serial.println(time.gettime("H:i:s"));                    //чисто-конкретно для контроля времени в мониторе порта (раскомментировать, если нужно)
        
        pixels.clear();
        pixels.setPixelColor(set_sec, pixels.Color(30,30,30));      // зажигаем светодиод секунд с яркостью 30 из 255
        pixels.setPixelColor(set_hour, pixels.Color(180,180,180));  // зажигаем светодиод часов с яркостью 180 из 255
        pixels.setPixelColor(set_min, pixels.Color(255,255,255));   // зажигаем светодиод минут с яркостью 255 из 255
        pixels.show();                                              // разрешаем индикацию времени
        o_sec = set_sec;
     }   
 
 if ( bouncer1.update() ) {                                         //установка часов +1
    if ( bouncer1.read() == 0) {
      if (t_hour == 23)
            t_hour = 0;
       else
            t_hour = t_hour + 1;
            time.settime(t_sec, t_min, t_hour);
     }
  }

 if ( bouncer2.update() ) {                                          //установка минут +1
    if ( bouncer2.read() == 0) {
       if (t_min == 59){
           t_min = 0;}
           t_min = t_min + 1;
           time.settime(t_sec, t_min, t_hour);
     }
  }

 if ( bouncer3.update() ) {                                          //установка минут -1
    if ( bouncer3.read() == 0) {
       if (t_min == 0){
           t_min = 59;}
           t_min = t_min - 1;
            time.settime(t_sec, t_min, t_hour);
     }
  }
  l_status = 0;
}                                                                    //конец time_ring()

void light_on() {                                                   //функция светильника
    delay(500);
 if (  l_status == 0){ 
        for (int i=0; i <= 51; i += 3){
        colorWipe(pixels.Color(i , i , i ), 0);                     // цвет белый
        delay(30);
        } 
 }
  l_status = 1;          
}                                                                   //конец light_on()


void colorWipe(uint32_t c, uint8_t wait) {                          //функция для работы light_on()
  for(uint16_t i=0; i<pixels.numPixels(); i++) {
    pixels.setPixelColor(i, c);
    }
    pixels.show();
}                                                                   //конец colorWipe() 

Библиотеки
Bounce.h
RTC.h
Adafruit_NeoPixel.h
Библиотеки я брал не отсюда, они у меня были давно, и за эти ссылки я ответственности нести не хочу. Просто приложил для тех, кому лень искать.

Для любителей препарирования
Некоторые технические моменты.
Стык двух колец.
Датчик приближения снаружи и внутри.


Подвес сделан из двух пластиковых п-образных скоб от какого-то светильника + клеевой пистолет. Ардуино приклеена им же.
Разъем питания — какой был.
Место пайки проводов питания ленты.

А ардуино запитал с противоположной стороны.

Вся конструкция с изнанки.

В интерьере

Ну и результат
В реале, тени видны лучше. Но мне пришлось использовать внешнее освещение для более светлой общей картинки. Естественно, от фоновой стены тоже многое зависит. На белом холодильнике, например, вообще всё идеально. Но в нем нет гвоздя))

Часть третья. Разбор полетов.
Теперь пройдусь сам по себе, чтобы другие не особо ходили.
Собственно, идеального повторения я не добивался. У меня был свой замысел, который не вполне удался, но дал мне некоторый опыт и большее понимание того, что я хочу. Поэтому буду делать эти часы еще раз.
Во-первых, откажусь от использования ленты. Поставлю одноцветные белые светодиоды, чтобы существенно снизить потребляемый ток. Все-таки получать белый свет из трех основных — энергозатратно. Да и тени в таком случае будут четче видны.
Есть идея применить индикацию не только внутри, но и снаружи часов, чтобы «стрелка» светила как бы навылет — внутри тень и снаружи луч. Обода буду делать два, чтобы спрятать начинку между ними.
Пытливый ум спросит, а почему кнопок четыре? Отвечу, есть идея навесить на четвертую кнопку выбор режимов в состоянии «светильник». Хочу добавить перебор вариантов освещения, в зависимости от времени суток. Все-таки, днем часы как светильник не актуальны. А в режиме светильник тоже не всегда нужен полный свет, например когда все спят, достаточно ночника. Светомузыку вполне возможно организовать…
Короче, идеи есть. На этом экземпляре я их и откатаю. Но это тогда, когда появится время. Пока же его нет, и часы-светильник поедут на дачу. Повешу их рядом с камином, где они будут напоминать мне о еще одной сбывшейся мечте)))
Котяра
Доча много снимает нашего кота, выпросил у нее зимнюю фотку.

P.S. Быть кратким не получилось.
Планирую купить +27 Добавить в избранное +99 +177
свернуть развернуть
Комментарии (44)
RSS
+
avatar
  • Kartus
  • 01 июня 2016, 20:48
+1
На белом холодильнике, например, вообще всё идеально. Но в нем нет гвоздя
Есть повод заняться приобретением магнитов)))
+
avatar
+18
Магнитов наприобретался — гвоздь забить некуда.
+
avatar
+3
Это не предел:
+
avatar
  • skif31
  • 13 августа 2016, 15:19
0
а если забить?
+
avatar
+1
Увидел это и прямо влюбился.
Спасибо за идею! Тоже давно мечтаю повторить подобное. Видел вариант со штырём в центре. Если сделать 2 окружности со светодиодами на разной высоте для часовой и минутной стрелки, то тени будут разной длины.
+
avatar
+1
Вы правы. Все новое это хорошо забытое старое. Эдак года 4 назад наткнулся на похожую конструкцию. В ней не было датчика, не нужно было пальцем мусолить стену. Но как раз было три яруса светодиодов, что позволяло организовать три тени разной длинны при одинаковой яркости светодиодов(тык). Кстати автору статьи может приглянутся на будущее другая модель этих светодиодов, а точнее драйверов для них. именуется WS2811S

Как видно из схемы, светодиоды подключаются отдельно, с внешним питание до 12 вольт. Так что можно оставить решение автора обзора, и использовать на драйвере светодиоды одного цвета. И тут уже будет программная регулировка яркости каждого светодиода. Драйверов понадобится 20 штук. А если добавить второй ярус, то можно уже играться как длинной тени так и яркостью каждого яруса. Вообще китайцы выпускали разные ревизии как светодиодов(4 пиновые и 6 пиновые) таки и отдельных драйверов. Около года назад брал себе на пробу такие драйвера, но у меня они были в корпусе soic16. Ждут на полке своего часа.
+
avatar
  • top2
  • 01 июня 2016, 20:59
0
Оригинально и в оригинальном тазике. )) Главное — необычно!
+
avatar
-3
ну и зачем это? купи сразу датчик присутствия, а потолок/стены обклей светодиодным сплошным светом.
+
avatar
+5
Ждем обзор в вашем исполнении!
+
avatar
  • SAIRUS
  • 01 июня 2016, 21:07
+46

А почему Вы всё одним цветом сделали? (минуты часы секунды)
лента позволяет сделать разные цвета + разную яркость
и ещё можно было 12 часовых отметок добавить
+
avatar
  • Demz
  • 01 июня 2016, 21:43
+4
вот это тема!!!
Только зачем вы ее на стенку повесили? на исходном месте интересней должно быть. На стенке палец всовывать надо а там — сел и все сразу видно, плюс можно замутить вариативность подсветки в зависимости от длинны или результата.
+
avatar
+12
А девочкам что, время и не узнать?
+
avatar
+3
ну результат есть и у девочек — пока не отпал. ну или в полете успеть рассмотреть
+
avatar
  • Demz
  • 02 июня 2016, 10:38
+1
ну что вы так грубо?
для подсчета бабочек и спектра радуги прийдется допилить пару датчиков, но там ардуинка уже есть, дело за малым, на гиктаймсе на днях раз был обзор девайса для измерения скорости, можно воспользоваться…
+
avatar
  • skif31
  • 13 августа 2016, 15:21
0
а у кого пока не висит на полшестого?
+
avatar
+2
А можно фото 12:30:30?
+
avatar
0
И что? «Стрелки» смотрят в разные стороны. И даже не идеально в противоподожные, т.к. часовая передвинулась на два деления. Тени видны. Тени исчезают в 12:32:02 или в 12:32:32. А в 12:00:00 — горит только один светодиод, как и в еще много других моментов времени.
+
avatar
0
Ладно, хотелось увидеть просто это.
Могу подкинуть идеек что можно улучшить:
1) Светящиеся СИДы видно лучше, чем тени, но вы захотели тени, хозяин — барин.
2) Попробуйте сделать разделения по цветам, например, часовой СИД — красным, минутный — синий, секундный блёкло-зелёным. А ещё лучше подсвечивать так, как вы, но вместо белого тенесоздающего СИДа зажигать его цветом на вроде Белый- (минус) зелёный, а с противоположной стороны зелёным. Так у вас получится более контрастная картинка. Для предотвращения эффекта зеркальной стрелки можно слегка подсветить (продолжу с теми же цветами) чуть зелёным светом около тенесоздающего СИДа.
+
avatar
  • sainer
  • 01 июня 2016, 21:42
0
поправьте ссылку на «Сенсор расстояния до препятствия»
+
avatar
0
Поправил, спасибо.
+
avatar
  • EngelS
  • 01 июня 2016, 21:55
+3
А мне одному показалось, что видео во что влюбился и видео результата одно и то же?
+
avatar
0
Все аццки круто, идея конечно шикарная, как и реализация, не надо умалять собственное мастерство. По поводу допила — я б от ргб не отказывался, можно не играться с яркостью стрелок, а слегка изменить оттенки для каждого типа стрелки. Ну и яркость бы повыше, как насчет светодиодов в два ряда, или динамически во время показа времени напояжение питания повышать?
+
avatar
0
Для минутной «стрелки» и так самое яркое свечение установлено. Повышать питание я бы не стал. Что касается разного цвета свечения, то на стадии проектирования, я именно так и отлаживал работу — разный цвет на разные «стрелки». Но яркость только у белого цвета максимальна на этой ленте.
+
avatar
  • chaloc
  • 01 июня 2016, 22:40
+1
Для снижения аппетита можно добавить кольцо из белой обычной ленты, которая создает основное освещение. При срабатывании датчика присутствия её гасить и зажигать 3 диода WS2812.
+
avatar
0
Повышать питание я бы не стал.
Только на момент показа времени, Вы же не будете там руку держать вечно
+
avatar
  • chaloc
  • 01 июня 2016, 23:39
+1
Нельзя повышать, драйвер встроен в корпус светодиода и по даташиту имеет мин/макс питания 3,5-5,3В. Есть вариант, что он испустит свой электронный дым.
+
avatar
+2
Если честно, смотрел-смотрел видео, так и не смог отличить часовую от минутной стрелки. Секундная — да, блеклая, а те две, как по мне, одинаковые :(
+
avatar
+2
Они отличаются. Не сильно, но отличаются. Я не призываю относиться к этим часам, как к часам. В первую очередь, это элемент интерьера, но с некоторым секретом.
+
avatar
0
Я же не критикую. Пытаюсь понять :)
Из видео этого, к сожалению, сделать невозможно :(
Значит просто остановлюсь на Ваших словах: они отличаются
+
avatar
0
огромное «благодарю» за обзор))) интересно и креативно
п.с. отзывы также подняли настроение)))
+
avatar
  • xealus
  • 01 июня 2016, 22:54
0
свет от каждого светодиода нужно фокусировать, тогда теневые стрелки будут четкими
+
avatar
0
Такой вариант рассматривал. Была мысль чем-то прозрачным (лаком, эпоксидкой) капнуть на светодиод и перевернуть. В теории, можно получить линзу почти правильной формы. Но опытов я не ставил. В идеале, применить обычные светодиоды в корпусе, с выпуклым верхом. Пробовал на одиночных светодиодах — луч яркий и тень хорошая.
+
avatar
+1
хороший юмор у вас. Прочитал на одном дыхании. Понравилось!
+
avatar
+1
А котяра уже старый. Мелкие передние зубы уже практически все отсутствуют…
+
avatar
0
металлокерамику надо ему вставить.
ну или подешевле — простой съемный протезик ..))
+
avatar
0
В свои 46 я имею право говорить то, что думаю. Стараюсь, тем не менее, сдерживаться. Но когда вижу… тут ляпнул, там перданул — готово 55 комментов. Еще один комментатор — 62 коммента и все ни о чем.
Давайте обзор того, к чему ни язык, а руки и голову нужно приложить. Там и постебемся.
А кота не трогать грязными руками!
Редкий проктолог специалист, по сильно ужатой фотографии, поставит коту такой диагноз.
Коту уже семь лет, но зубы у него в полном порядке. Питание и уход у кота такие, что можете позавидовать.
+
avatar
+1
Э деда тебя бомбануло.
Ну 7 лет, таки старый.
Завидовать питанию кота не буду, так как выпадение мелких передних зубов зависит не от питания, а от возраста:)
Да и как-то не обвинял я тебя в ненадлежащем уходе или в выбивании зубов котяре :)
+
avatar
  • uriy
  • 02 июня 2016, 10:31
0
А схема макета есть?
+
avatar
0
Принципиальная? Могу начертить, но в скетче всё подробно расписано.
+
avatar
  • uriy
  • 03 июня 2016, 11:04
0
Я начинающий, со схемой проще
+
avatar
  • bulyga
  • 02 июня 2016, 13:41
+2
Живо и с юмором написано, даже вспомнил пароль и залогинился, специально, что бы плюс поставить)
+
avatar
  • MACTEP
  • 02 июня 2016, 16:41
0
Уважаемый автор, почему не выложили фото своих трудов? У меня тьюб запрещен, и о том, что же вы сделали, остается лишь догадываться. По комментариям)) Похвалитесь, пожалуйста, фотографиями
+
avatar
+2
Специально для вас. Прошу прощения — фотографировал на мобилу.
На стене.

На холодильнике
+
avatar
  • smirta
  • 03 июня 2016, 04:59
0
Опять эта «жменя»…

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.