Большие часы на адресных светодиодах 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. Кое-что я перевел для лучшего понимания.

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

Комментарии

bort707

★★★★★★✩
21 Сен 2020
3,046
909
сначала думал-баг. потом дошло: все нормально. просто часы висят под экраном светомузыки
это потому что автояркость у Вячеслава напрямую вычисляется от показаний датчика. Правильнее было бы смешивать старую и новую яркость. тогда часы будут менять ее плавно и не будут мигать при смене
 

Leon111_09

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

bort707

★★★★★★✩
21 Сен 2020
3,046
909
смена автояркости происходит плавно
ну не рассказывайте. я вроде код еще не разучился читать :) Пусть Вячеслав поправит, но никакой "плавности" я в коде не вижу, что с датчика прочитали - то сразу в map и на ленту
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
Вячеслав_45
Не могу понять как работает ночной режим?
Я так понимаю: часы должны переключаться в ночной режим в установленное в скетче время например в 22 часа не зависимо от внешнего освещения, яркость должна упасть до минимальной установленной и светиться синим?
Но при наступлении 22 часов ничего не происходит, а если закрыть фоторезистор то часы переходят в ночной режим. Так и должно быть или нужно вносить коррективы в параметры: "#define LIGHT_NIGHT 100 " и "#define SET_LIGHT 0" ч
 
Изменено:

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
Избыточное цитирование
Вячеслав_45
Не могу понять как работает ночной режим?
Я так понимаю: часы должны переключаться в ночной режим в установленное в скетче время например в 22 часа не зависимо т внешнего освещения, яркость должна упасть до минимальной и светиться синим?
Но при наступлении 22 часов ничего не происходит, а если закрыть фоторезистор то часы переходят в ночной режим. Так и должно быть или нужно вносить коррективы в параметры: "#define LIGHT_NIGHT 100 " и "#define SET_LIGHT 0" ч
да так и должно быть.
рассчитано что SET_LIGHT 0 (то есть в настройках часов стоит автоматическая яркость 8. (L) настройка яркости (если 00 то автоматическая) 0...25) а LIGHT_NIGHT нужно установить требуемую освещенность если поставить 255 то на освещенность не будет реагировать для перехода в ночной режим, будет учитываться только время
 

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
if (setups[4] == 0) brightness = map(analogRead(LIGHT_PIN), 0, 1023, LIGHT_MIN, LIGHT_MAX); нижний порог яркости вместо 0 ставим ?
 

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
в коде править ничего не требуется я старался все значимые настройки вынести в раздел настроек.
LIGHT_MIN, LIGHT_MAX это мин и мах настройки яркости
 
  • Лойс +1
Реакции: maksland

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
нет
здесь 0-1023 - это показания датчика, а не яркость
По уму, конечно, надо не 0 и 1023 ставить, а сначала померить реальные цифры, которые датчик выдает
по поводу 0-1023 я пробовал показания идут с датчика от 0 до 1023. я максимально изолировал датчик от постороннего света (стоит в корпусе на верхней крышке я небольшим глазком, внутри приклеен на горячие сопли, сопли покрашены черным маркером и замотаны кинолентой) т. ч. работает четко
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
показания идут с датчика от 0 до 1023. я максимально изолировал датчик от постороннего света
по нижне границе - у других может быть не такая хорошая изоляция и показания начинаться не с нуля, а по верхней - 1023 вообще-то датчик должен выдать только при освещении киловаттным прожектором :)
У моего датчика диапазон всего примерно 100-500
Тем не менее, думаю можно оставить так - кому надо, поправит сам
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
в коде править ничего не требуется я старался все значимые настройки вынести в раздел настроек.
LIGHT_MIN, LIGHT_MAX это мин и мах настройки яркости
Это я в курсе, сразу поменял MIN и MAX местами(у меня модуль фоторезистора, плечо поменять нельзя).
...255 то на освещенность не будет реагировать для перехода в ночной режим..... Ставил 255, при наступлении установленного времени ни чего не происходит.
Я установил 22 ночь, 8 день.

Проверил фоторезистор, минимальное значение 14, максимальное на солнце 976
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
Проверил фоторезистор, минимальное значение 14, максимальное на солнце 976
теперь можете вставить это в код вместо 0 и 1023. Только лучше не цифрами, а оформить так же как другие параметры настройки.
И да максимум лучше брать не на солнце, а в том конкретном месте, где будут висеть часы
 
  • Лойс +1
Реакции: Вячеслав_45

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
Избыточное цитирование
Это я в курсе, сразу поменял MIN и MAX местами(у меня модуль фоторезистора, плечо поменять нельзя).
...255 то на освещенность не будет реагировать для перехода в ночной режим..... Ставил 255, при наступлении установленного времени ни чего не происходит.
Я установил 22 ночь, 8 день.
13. (SH) установка отображениея анимации при смене минут (0 - отк. 1 - вкл. 2 - вкл. ночной режим) в часах выставить 2
 
  • Лойс +1
Реакции: kym13

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
ребят,все элементарно делается: в строке #define LIGHT_NIGHT 100 измените сотку на нужное вам число и все,ночной режим будет включаться в более темное время суток.
 
  • Лойс +1
Реакции: Вячеслав_45

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
#define LIGHT_NIGHT 100 измените сотку на нужное вам число....
Делал не помогает.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
Ночной режим работает, отображается только время без даты, температуры и прочих показаний. То что надо. Вячеслав_45 ещё раз большое спасибо.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
я поэкспериментировал с этим числом: при 150 ночной режим включился в небольших сумерках. сейчас выставил ноль,проверю как по таймеру сработает.
Я хотел чтобы от установленного времени плясало. Мне не важно темно или светло. Утром проверю окончание ночного режима.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Я хотел чтобы от установленного времени плясало.
я тоже. в прошивке выставил с полуночи до пяти утра,но включалось по автояркости гораздо раньше. вот и экспериментирую с этой строкой.
 
  • Лойс +1
Реакции: kym13

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
Вячеслав_45
"13. (SH) установка........ 2 - вкл. ночной режим) в часах выставить 2 "
При установке этого режима часы при наступлении дня должны выходить в обычный режим(смена цвета, дата и т.д.)?
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
Изменено: