Большие часы на адресных светодиодах 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
715
118

@xatler,
Количество светиков на сегмент никак не связано с выводом температуры, либо "косяк" с железом, либо попробовать перепрошить. Никогда такого не было.
 

xatler

✩✩✩✩✩✩✩
26 Сен 2023
2
0
так же думаю. но факт остается фактом. на одном железе и прошивка одна. только SEGMENT_LEDS ставлю 1 или 2.
 

IgorGrodno

✩✩✩✩✩✩✩
17 Авг 2021
4
1
35
Ребят доброго времени всем! Вопросик такой, что-то не получается у меня никак на скетче Clock_1.95_bme_final_patch_NEW добиться того, чтобы цвет часов менялся каждую минуту при включенной анимации, может кто подскажет что можно сделать? Работает в связке с BME280 и ws2812, 9 диодов на сегмент (плотная лента, там больше 60 светодиодов на метр), причем абсолютно все работает исправно. Как только в настройках выключаю анимацию, цвет часов меняется периодически, причем не зависит от ночного режима. Я простой электронщик, с БИОС могу поработать (я в основном по ремонту ноутов), а тут ну не силен мягко говоря. Заранее спасибо
 

kym13

★★★✩✩✩✩
14 Ноя 2020
715
118

@IgorGrodno, Это значение можно поменять в меню часов должен стоять ноль "0" фото 1 тогда цвет будет меняться каждую минуту, а ночной режим фото 2 значение "90" чтобы поменять его нужно перепрошить контроллер.
 

Вложения

  • 75.6 KB Просмотры: 5
  • 71.1 KB Просмотры: 5
  • Лойс +1
Реакции: IgorGrodno

IgorGrodno

✩✩✩✩✩✩✩
17 Авг 2021
4
1
35
@kym13, к сожалению все абсолютно так как Вы и написали, но ничего не происходит.
 

kym13

★★★✩✩✩✩
14 Ноя 2020
715
118

@IgorGrodno,
Значит где-то у вас косяк при сборке, проверьте может "сопля" где нибудь. специально достал собранные год назад часы из закромов включил и проверил, всё работает. Этот код 100500 раз повторен и проверен.
 
  • Лойс +1
Реакции: IgorGrodno

IgorGrodno

✩✩✩✩✩✩✩
17 Авг 2021
4
1
35

@IgorGrodno,
Значит где-то у вас косяк при сборке, проверьте может "сопля" где нибудь. специально достал собранные год назад часы из закромов включил и проверил, всё работает. Этот код 100500 раз повторен и проверен.
Хорошо, предположим дело в пайке, чего в принципе быть не может, тогда почему, если в настройках часов выбираешь режим SH - 0, тогда каждую минуту цвет часов меняется, а если SH - 1 или SH - 2, тогда цвет статичный? Салатовый что-ли, при подключении питания цвет красный, но как только наступает следующая минута, всё, салатовый постоянно, при этом естественно выбор цвета С - 0, то есть автоматический режим? В любом случае, спасибо что откликнулись) Предполагаю уже что с библиотеками что-то не то, и было бы хорошо если бы кто нибудь выложил архив с библиотеками и рабочим скетчем.

По сути имею такую конструкцию - WS2812B (большой плотности, 144 светика на метр), один сегмент = 9 светодиодов, BME280, rtc модуль DS3231, и датчик освещенности. Ну естественно Nano
 

kym13

★★★✩✩✩✩
14 Ноя 2020
715
118

@IgorGrodno,
Эти часы собирал года два назад если не больше, анимацию я вообще строку #define ANIME_DELAY 20 закоментировал, а SH установлен 2 (ночной режим) при SH2 если яркость ниже установленного порога то часы думают что ночь и светят только красным(или какой вы установите здесь #define COLOR_NIGHT 0xFF0000 // Цвет часов в ночном режиме ). Идём далее если бы библиотеки "косячили" вы бы не скомпилировали скетч, вот ссылка на библиотеки которые установлены у меня: https://disk.yandex.ru/d/aY8RvycDu8Gkow Поиграйтесь с настройками ночного режима у меня такие цифры "#define LIGHT_NIGHT 90 // 180 Яркость ниже которой включается ночной режим ", было 180 тоже всё работало. ....при подключении питания цвет красный.... Так и должно быть если при включении цвет не красный значит порядок вывода цветов на ленту не правильный имеется ввиду RGB, BRG и т.д. Ну и ....такую конструкцию - WS2812B (большой плотности, 144 светика на метр), один сегмент = 9 светодиодов.... Не имеет значения сколько на метр всё упирается в память ардуинки больше 600 светодиодов она не тянет, у вас 254 светика так что не в этом дело.
 
  • Лойс +1
Реакции: IgorGrodno

IgorGrodno

✩✩✩✩✩✩✩
17 Авг 2021
4
1
35
Ну мой косяк очевиден стал.

void Animate(int v) { // Функция анимации
static uint8_t hue = 0;
leds[v] = CHSV(hue++, 255, 255);
FastLED.show(); // раскоментировать блок если нужна анимация
for(byte m = 0; m < NUM_LEDS; m++) {
leds[m].nscale8(250);}
delay(ANIME_DELAY / SEGMENT_LEDS);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//=================== Фунция анимации при смене минуты ===============================

void Animation() { // Фунция анимации при смене минуты
//for(int i = 0; i < NUM_LEDS; i++) Animate(i); // раскоментировать блок если нужна анимация
for(int i = NUM_LEDS - 1; i >= 0; i--) Animate(i);
}

Эта строка должна быть закомментирована для того чтобы в режиме анимации менялся цвет часов каждую минуту, а я раскомментировал ее
//for(int i = 0; i < NUM_LEDS; i++) Animate(i);

@kym13, благодарю за то что помог, хоть как-то, спасибо
 
  • Лойс +1
Реакции: kym13