Большие часы на адресных светодиодах 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
@начинающий,
Достаточно и одного резистора, но по феншую(по правилам) лучше на каждое табло(ленту) свой резистор.
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
А будет ли такой "чертеж" работать адекватно, т.е. два циферблата спаянных по одной схеме (G B A F E D C) вход DIN которых будет припаян к одному резистору припаянному к назначенному выходу Dout?
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@начинающий,
Допустим у вас 144 диода на табло значит 144шт.*0,06А=8,64А (один диод кушает 60мА или 0,06А при условии что светит белым и на максимально яркости что маловероятно) вот и считайте.
Блок питания должен быть с запасом хотя бы 25%.
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
@начинающий,
Допустим у вас 144 диода на табло значит 144шт.*0,06А=8,64А (один диод кушает 60мА или 0,06А при условии что светит белым) вот и считайте.
да тут вопрос не про потребление и амперы, а про возможные "артефакты" проявляющиеся при "незадокументированных" возможностях "паралелинья" двух циферблатов на один выход дуни, кто нибудь пробовал, работает ли два циферблата от одного источника?
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@начинающий,
Я подключал две 2 метровые ленты в параллель, работали.

@начинающий,
...xxx М ленты, сколько то ампер кушает...,
одного БП хватит на два табло...., а это про что?
Вы же всё равно будете второе табло делать вот и проверите сразу. Должно работать.
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
да с амперами проблем нет, можем хоть "сварочник" подключить, главное что бы "потребитель" адекватно соображал что от него хотят, ладно думаю через пару недель попробую, о результатах отпишусь, если не забуду.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
Я подключал ленты по несколько метров в параллель. И по 3 куска местами. Все работало часов по 12 ( это для теста) без сбоев. Я резисторы не использовал. Но у меня 5в логика вся была
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Избыточное цитирование
Я подключал ленты по несколько метров в параллель. И по 3 куска местами. Все работало часов по 12 ( это для теста) без сбоев. Я резисторы не использовал. Но у меня 5в логика вся была
Понял, прием. На следующей неделе попробую создать "дублирующее табло", если получицца, то отпишусь тут.

продолжаю опыты на макете, прилепил озвучку времени: ВИДЕО
 
  • Лойс +1
Реакции: Divin и kym13

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
в скетче указывается путь к файлу и комнда управляющая проигрыванием заданного файла в назначенный момент времени, аудиофайлы лежат на карте памяти а та воткнута в df player mini
C++:
......
    Serial.println(Now.Hour);

  if(Now.Minute == 59 && Now.Second == 48) {
  switch (Now.Hour)                                          // Каждый час кукушка будет куковать

{
   case 7:
   mp3_play(1);                                       // проигрываем файл mp3/0001.mp3 (08:00)
   break;

   case 8:
   mp3_play(2);                                       // проигрываем файл mp3/0002.mp3 (09:00)
   break;
          .......
 
Изменено:

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
а если такой DY-SV17F прикрутить ? там память можно на 8мб поставить
 

начинающий

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

if(Now.Minute == 59 && Now.Second == 48)
По параметру "секунды" есть одно условие, пока сам не разобрался много всего перепробовал. Значит указанное значение секунд должно находится в том интервале времени во время которого отображаются именно часы, если к примеру указать значение секунд в момент которого отображаются метеопараметры или дата то - тишина, озвучки нет. В моем случае первоначально в настройках было выбрано три цикла отображения метеопараметров с датой, а джингл маяка должен стартовать на 48-й секунде, тогда 6-ой сигнал точного времени совпадает с обнулением секунд и сменой часа в часах, так при условии трехкратного показа метеопараметров 48-ая секунда как раз находилась где то в середине интервала времени третьего показа метеопараметров. Пришлось выбрать режим "два раза в минуту", тогда второй показ метеопараметров заканчивается где то на 42-ой секунде, на 48-й стартует джингл радио маяк, и в момент начала 60-ой секунды обновляется картинка и звучит 6-й сигнал точного времени. но еще раз повторюсь, если длинна выбранной мелодии иная, то нужно вычислять и изменять время ее старта, что бы к финишу пришли одновременно и часы и мелодия, но если в назначенное время старта мелодии отображаются не часы а что то еще, то "кина не будет" часы будут немыми.
А еще можно вот так: if(Now.Minute == 0 && Now.Second == 0)
тогда если применить мелодию без сигналов точного времени, то время произносится по началу нового часа, т.е. обнулились минуты в часах и тут же прозвучала фраза ХХ часов УУ минут.
 
Изменено:

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Пока такой вариант: За основу был взят скетч от Вячеслав_45 пост #970 стр.39. Благодаря неоценимой помощи и поддержке Вячеслава был заменен датчик BMP280 на BME280, добавлена озвучка в 8, 9, 10, 11, 11:45, 12, 12:30, 13, 14, 15, 16, 16:25, 16:30 часов. Аудиофайлы не прикладываю т.к. сайт ругается на их размер, и они сюда не загружаются.
В связи с тем что не удалось сделать цвет температуры "как часы" настройками в строках 82, 83
82 #define TEMP_1_COLOR 0
83 #define TEMP_2_COLOR 0
температура все равно почему-то всегда красная, чтоб сделать цвет "как часы" заменил в строках 524, 525, 575, 576, значения
параметра : ........SYMBOL, 1, temp_color); на такое значение: ........SYMBOL, 1, led_color);
да еще в BME280 температуру сделал без десятых долей, чтоб знак минус вместился, в связи с планами использовать БМЕ для замеров уличных параметров, при желании в двух окнах arduino ide прокручивая версии 1.9 и 1.98 каждый может сравнить и увидеть отличия. было бы не плохо, если бы кто либо "причесал" получившийся скетч к читабельному и эстетичному виду.
 

Вложения

Изменено:
  • Лойс +1
Реакции: kym13

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
сегодня после 2 месяцев упорной работы (мегакодер Sergo_ST, а я тестер в железе) над беспроводным интерфейсом для DS18B20 были запущены в работу часы на скетче Вячеслава v1.9 (доработка отображения проблем с датчиком @Sergo_ST ).
в личной переписке настрочили 837 сообщений в процессе отладки. Датчик побывал и в морозилке и на улице и на солнце и под луной и ... в общем настрадался.
IMG_20211112_131810.jpgIMG_20211112_131859.jpg IMG_20211112_131910.jpg
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
всем привет. Пробовал сегодня на работе подключать "дублирующее табло" к "базовым/основным" часам. Схема "циферблата" в обеих вариантах идентичная. припаял для экспиремента ко "второму" циферблату кусок кабеля 1,5 метра, воткнул в заранее установленный в базовых часах разъем для подключения дублирующего табло, и ура , все заработало. Но самое интересное дальше. Подключил в разрыв этого соединения 30-ти метровый кабель, не работает, на индикации один сегмент в старшем разряде горит очень ярко, остальные в половину обычной яркости, но светятся везде одни восьмерки, уменьшил длинну кабеля до 10-ти метров, тот же "хищник" на табло (одним словом глюки какие то и паразитная емкость на большой длине) Постепенно уменьшая длинну кабеля между базовым и дублирующим табло адекватно заработали оба при длине от двух и менее метров.p.s. пробовал с витой парой, таже история, экранированный МКЭШ 5Х0,35 тот же эффект. Итог с кабелем длиннее двух метров ничего не получилось, даже когда просто один конец кабеля ни к чему не подключен а другой подключаю к базовым часам, на дисплее сразу висяк и "хищник" с сегментами разных цветов и яркостью. При "одностороннем" подключении (один конец не подключен ни к чему, а другой воткнут в разъем для подключения дублирующего табло на базовых часах) к базовым часам куска кабеля любой марки короче 2-х метров все работает, длиньше двух метров -- висяк и хищник с разными цветами и яркостями. Вопрос: есть ли возможность подключить к выходу ардуины второй дисплей но на растоянии от "базы" 40...50 метров и как это реализовать без глюков?
 
Изменено:

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
может быть между базовыми часами и "вторым" дисплеем возможно реализовать передачу данных по радиоканалу с помощью китайских 433 мГц, радиомодулей но как это реализовать в рамках данного проекта с минимальными переделками? Можно ли просто входом передатчика управлять сигналом подаваемым на вход ленты, можно ли выходом приемника управлять входом второй ленты? Или же нужно сочинять дополнение к скетчу для управления передатчиком, и вешать вторую дуню на второй дисплей для преобразования сигнала с приемника, опять же нужно сочинять еще один скетч, почти вторые часы (по себестоимости) за исключением датчиков получатся, а хотелось просто дублирующее табло (одна лента).
 

Leon111_09

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