Большие часы на адресных светодиодах WS2812B

Большие часы на адресных светодиодах WS2812B
Всем привет, хочу рассказать о том как я попробовал повторить проект, но столкнулся с некоторыми проблемами.

Как-то раз на просторах зарубежного интернета я нашел вот такой проект часов на базе светодиодной ленты WS2812B: Big, Auto Dim, Room Clock, и мне захотелось его повторить. Часы устроены как семи сегментный циферблат и работают на RTC модуле DS3231 . Часы умеют показывать температуру, имеют кнопки для настройки и перевода на зимнее время и обратно, позже я добавил датчик влажности DHT11. Температура уже вместе с влажностью считывалась с этого датчика и выводилась раз в минуту. Хоть и в модуле часов есть температурный датчик, но похоже он показывал температуру не корректно из-за самонагрева (ИМХО).




Untitled Sketch_МП.png
И главное нанести много горячих соплей

IMG_20180907_120755.jpg


Когда все было собрано, повозившись с библиотеками, все заработало. И тут возникло одно большое НО: положения яркости в только в двух позициях меня не устраивало. Тем более на границе значений происходило мерцание. Установка яркости на статичном значении меня тоже не очень устраивала ибо днем при установленном тусклом свете ничего не было видно, а ночью даже со значениями близким к минимуму можно было осветить всю Москву. Поинтересовавшись как в других проектах с этим справляется Alex было решено заменить такой код настройки яркости.

C:
void BrightnessCheck(){
  const byte sensorPin = BRI_PIN; // light sensor pin
  const byte brightnessLow = 1; // Low brightness value
  const byte brightnessHigh = 50; // High brightness value
  int sensorValue = analogRead(sensorPin); // Read sensor
  Serial.print("Sensor is: ");Serial.println(sensorValue);
  sensorValue = map(sensorValue, 0, 255, 1, 100);
  LEDS.setBrightness(sensorValue);
  };
вот такими строчками:
C:
void BrightnessCheck() {

  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сброить таймер
      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, min_bright, max_bright);   // считать показания с фоторезистора, перевести диапазон
      new_bright = constrain(new_bright, min_bright, max_bright);
      new_bright_f = new_bright_f * coef + new_bright * (1 - coef);
      LEDS.setBrightness(new_bright_f);      // установить новую яркость
    }
  }
};

Тут стоит упомянуть что программистом я не являюсь и большинство проблем я пытаюсь решить методом тыка и перебора.

И тут все заработало, моей радости не было придела, пока не наступила ночь. Появилась проблема с отключением ленты при полной темноте. Иногда это было только на минуту, а иногда на целую ночь. Еще есть проблема со слабим мерцанием светодиодов если освещения в комнате было мало (например когда работал телик), но это было редко и длилось это одну минуту.

Что касается кода вот сылка на GitHub. Кое-что я перевел для лучшего понимания.

Давно хотел поделиться готовым и работоспособным проектом в кругах аудитории Алекса, но вышло так что собственно нормальной работоспособностью тут не пахнет. Буду благодарени, если у кто сможет помочь.
 
Изменено:

Комментарии

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@Navigator,
Это WS2811
Можете скинуть фото вашего табло, как расположены диоды
У вас расположение диодов должно быть как на фото(это один диод на сегмент для ленты WS2811)
 

Вложения

  • 17.9 KB Просмотры: 7
Изменено:

k.subin

✩✩✩✩✩✩✩
9 Дек 2021
2
0
@kym13,

Схема сегментов такая. Один сегмент 3 светодиода. А в скетче два сегмента секундных, а у меня он один сегмент.
 

Вложения

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@k.subin,
Вот поэтому на ленте WS2811 отключая одну точку мы физически отключаем три светодиода, а на ленте WS2812 мы физически отключаем один светодиод. Поэтому проще припаять ещё один пиксель(три LED) и заклеить его чем нибудь, чем править код.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Поэтому проще припаять ещё один пиксель(три LED) и заклеить его чем нибудь, чем править код.
Либо купить в любом магазине радиодеталей один светодиод WS2812 и впаять его на место разделительных точек.
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
резистором можно ограничить ток а не питание, кроме того чипу нужно стабилизированное питание, ну и кол-во светодиодов умножаем на ток свечения каждого светодиода 20....60 и более мА и делаем выводы не случайно ведь во всех темах про светодиодные ленты фигурирует акцент на мощные блоки питания 8....16 ампер
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
резистором можно ограничить ток а не питание, кроме того чипу нужно стабилизированное питание, ну и кол-во светодиодов умножаем на ток свечения каждого светодиода 20....60 и более мА и делаем выводы
я имел ввиду на отдельно взятом диоде, а не на всей ленте. А питание уже приходит стабилизированное на всю ленту-значит и на отдельно взятый диод.
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
...в скетче видно +2 .. не трогайте иначе в минутах будет абракатабра.
В Вашем случае я поменял местами значения "d_color" и "0x000000" в строке 246.
ой , что-то вы намудрили...
Вам надо было везде по коду вместо +2 поставить + "числоТочек", а потом можно было бы присваивать этому "числуТочек" нужное значение, не переписывая каждый раз код.

Хотя конечно если у одного лента 2811, а у другого 2812 - ничего не поможет:)
 
  • Лойс +1
Реакции: kym13

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@bort707,
Я же скинул фото выше у меня всё работает(на WS2812) и не надо по всему коду менять. А у него лента другая поэтому и не работает
 

Navigator

✩✩✩✩✩✩✩
12 Апр 2021
12
2
Не думал что такая проблема , тем более для знающих. Я выше скидывал у человека в коде можно прописать количество точек. Этот скетч работает. Всем спасибо за помощь будем думать!!!

Хотя конечно если у одного лента 2811, а у другого 2812 - ничего не поможет:)
Так в скетче же есть выбор ленты.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@Navigator,
Если я правильно понял Вы хотите на сегменте который точка отключить два крайних светодиода и оставить один по середине или отключить один по середине и оставить два крайних.
Как Вы не поймете, что согласно Вашей схемы из поста 1,284 у Вас подключено 29 сегментов(это 29 отрезков ленты WS2811 по 3 светодиода), а в скетче указаны 30 диодов(это 30 отрезков ленты WS2811 по 3 светодиода). У Вас уже не хватает одной точки, а мы ещё отключаем в скетче точку(1 точка это 3 LED) и получается что гаснет один сегмент в цифровом блоке, поскольку вторая точка не припаяна(отсутствует физически). На этой ленте нельзя отключить один из 3 светодиодов на отрезке ленты.
 

k.subin

✩✩✩✩✩✩✩
9 Дек 2021
2
0
Хорошо. Как сделать выбор сегментов в скетче? Т. е. у вас у прошивке 2 секундных сегмента , у меня в часах он один по факту и фактически. Прошу если это возможно, сделать выбор сегментов секунд если это возможно без вреда для прошивки. ( 1 сегмент , 2 сегмента, 3 сегмента или вообще без секундных сегментов)
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@k.subin,
Количество точек в этом скетче программно не настраивается. И на ленте WS2811 нельзя отключить один из 3 светодиодов на отрезке ленты (один чип 2811 управляет тремя светодиодами одновременно). Выше постом я же всё объяснил. В схеме должно быть две точки физически (2 по 3=6 Led) тогда можно отключить одну точку, останется одна, но это будут гореть три светодиода. Или заменить ленту WS2811 на ленту WS2812. Проще заклеить ненужные светодиоды.
....выбор сегментов в скетче? строка 49 #define SEGMENT_LEDS 1 (1 в данном случае с лентой WS2811 означает что в каждом сегменте будет 3 светодиода), если SEGMENT_LEDS 2 то каждом сегменте будет по 6 светодиодов ит.д.
 
Изменено:
  • Лойс +1
Реакции: k.subin

balent

✩✩✩✩✩✩✩
29 Ноя 2021
53
7
@Leon111_09,Добрый вечер, пока меня админ заблокировал, взял другую ардуино , мо дуль, все равно не устанавливается время, так все корректно работает, только вот причем на D4 D5 нет синхроимпульсов как на других рабочих скетчах. Железо, лента, все в исправности. Даже из ранних скетчей с библиотекой DS3232 работает, а что с этим, мысли есть? Может не в том Ардуино ID 1.8.1 работаю?
 

balent

✩✩✩✩✩✩✩
29 Ноя 2021
53
7
@kym13, не в подключении дело, все подключено тип-топ.Сейчас прошил скетч поста 46-работает!.А этот -нет.Что за ерунда? значит что-то в скетче? Голова кругом.

@Leon111_09,очепятка!
 
Изменено:

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Сейчас прошил скетч поста 46-работает!.
в нашем скетче, в отличие от 46-го, выставляется только кол-во светодиодов на сегмент, а не количество пикселей. В том скетче есть дополнительная настройка: кол-во светодиодов на пиксель. В этом разница. И ,по ходу, причина того,что этот скетч у вас не работает.
 

balent

✩✩✩✩✩✩✩
29 Ноя 2021
53
7
@Leon111_09, а что надо сделать в скетче? Где сделать установку, не вижу, лента 2812, обозначена, а что еще? Нашел раннюю версию 1,6 прошил Xloader, все работает ????
 
Изменено: