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

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

Комментарии

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
DS3231SN тоже в цене взлетели, хоть модули покупай и сдувай феном
"
Почему сейчас это так дорого?
С 2021 года существует Глобальный недостаток чипов, и нам трудно купить чипы у агентов. Как только цена снизится, мы немедленно обновим цену.

"
очень ощущается недостаток
ссылки есть у кого на проверенных продавцов ? а то 600 рублей за одну как то дорого
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@maksland, ищи местных продавцов на Авито, или ищи группу радиолюбителей своего города и там можно подешевке взять запасы участников)
 

poty

★★★★★★✩
19 Фев 2020
3,223
937
В Чип и Дип, если не ошибаюсь, 150 руб.
 
Изменено:

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
"На чипе " это что ?
я в деревне, на 6к один такой...не у кого брать :)
в городе (Омск) в ЧиД под заказ 600-800 и "дан" под заказ 680
с авито доставка +200-300р
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,602
311

Advent

✩✩✩✩✩✩✩
21 Июн 2020
5
2
При компиляции выходит ошибка датчика температуру
библиотека стоит
отчего такое может быть
 

Вложения

Zubec98

✩✩✩✩✩✩✩
22 Апр 2019
7
0
всем привет а подскажите кто-то делал такие часы на ленте c 120 светодиодов по 8 светодиодов в один сегмент? если да, то можете помочь, я сделал просто увеличив матрицу в коде, но память слишком мало оказалось и часы зависают. код прилагаю. заранее спасибо)
 

Вложения

Zubec98

✩✩✩✩✩✩✩
22 Апр 2019
7
0
@ASM,
но я уже задумался использовать код Вячеслава, с этого форума, но там датчик используется другой. у него DS18B20, а у меня dht22
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Zubec98, без форматирования глаза сломаешь, могу посоветовать найти мой последний вариант, там сделано под любое количество светодиодов и их количество в сегменте... На его основе и сделать как нужно. Датчик заменишь под свой, со своей библиотекой)
 

Zubec98

✩✩✩✩✩✩✩
22 Апр 2019
7
0
@ASM,
за форматирование извиняюсь, здесь на форуме первый раз пишу. а за скетч, я Вячеслава скетч наверное буду брать за снову, но если у тебя лучше будет, то буду очень благодарен. и если будет возможность подключить отдельного 7-ми сегментного дисплея tm1637, ибо часы уличные и настраивать неудобно будет
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Zubec98, Вячеслава код не помню, просто советую посмотреть реализацию. А лучше перейти на esp8266, при наличии WiFi сам будет настраивать время. Можно и показания собирать. В соседней теме у меня проект, загляни)
 

Zubec98

✩✩✩✩✩✩✩
22 Апр 2019
7
0
@ASM,
я бы тоже на esp8266 перешёл, но там где они будут стоять могут быть проблемы с сетью.

@Вячеслав_45,
а можно в вашем коде заменить датчик температуры DS18B20 на dht22, и добавить дополнительный дисплей на tm1637. а то смотрю на ваш код и не полностью понимаю куда сунуться😅
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
ибо часы уличные
этот датчик НЕ предназначен для улицы. будет работать до первой влаги. DS18B20 как раз и есть уличный. и разница только в том,что он не измеряет влажность. заменить его на dht22 не тяжело: заменяете одну библиотеку на другую,объявляете его вместо DS18B20 и все. с экраном тяжелее в том плане,что надо дописывать в кетч дополнительно строчки,а вы писали что у вас дефицит памяти.
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Leon111_09, нужен оптимизированный код, с матрицей очень накручено) дисплей прикрутить думаю сложности быть не должно, код простой. Переменные есть)
 

Leon111_09

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

bort707

★★★★★★✩
21 Сен 2020
3,046
909
подскажите кто-то делал такие часы на ленте c 120 светодиодов по 8 светодиодов в один сегмент?
ну а в чем проблема?
8 светодиодов на сегмент это 4 * 7 * 8 = 224 светодиода плюс 2-4 диода на точки
Такое число диодов должно легко влезать в Уно - нано
Универсальный код часов, где число светодиодов меняется одной строчкой в коде - ищите примерно на 3-5 странице ветки.

но память слишком мало оказалось и часы зависают.
@Zubec98, открыл ваш код - и сразу видно, куда девается память
Вот этот вот массив - - это глупость несусветная.
C++:
                  // 1  2  3  4 /5  6  7  8 /9  10 11 12/13 14 15 16/17 18 19 20/21 22 23 24/25 26 27 28/29 30 31 32/33 34 35 36/37 38 39 40/41 42 43 44/45 46 47 48/49 50 51 52/53 54 55 56 //
byte digits[13][56] = {{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},   // Digit 0
                       {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1},   // Digit 1
                       {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},   // Digit 2
                       {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},   // Digit 3
                       {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1},   // Digit 4
                       {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},   // Digit 5
                       {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},   // Digit 6
                       {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1},   // Digit 7
                       {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},   // Digit 8
                       {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},   // Digit 9 | 2D Array for numbers on 7 segment,
                       {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},   // ° char
                       {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},   // C char
                       {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};  // % char
Конфигурация символов должна задаваться 1 битом на весь сегмент, а не целым байтом на каждый светодиод в отдельности. И эта конфигурация НЕ ЗАВИСИТ от числа светиков в сегменте.
В итоге таблица символов будет иметь размер всего 13 байт, а не 13*56 = 700 с лишком. как у вас. Тогда и памяти хватит и на часы и на дисплей.

Битовую таблицу я показывал в сообщении #223 этой темы
 
Изменено:
  • Лойс +1
Реакции: Boroda22

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
с Вячеславом общался - в сентябре как из отпуска выйдет так займётся часами и давление прикрутит
а потом и в ветку @ASM на esp8266 , хотя я и там и там уже
сейчас из Китая платы едут и те и те (уже по второму разу... из за ошибок в разводке :( ) надеюсь без косяков уже :)
кстати...хочу собрать радиоудлинитель для уличного DS18B20, как вам ?
 

Вложения

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
да, без исходников.. и автор точно их не даст :(
на Коте ветка по часам проснулась и там будет беспроводной с модулем на 2.4 Ггц
но пока альтернативы нет беспроводной ... только UTP для уличной прокладки :) у меня метров 190 осталось :)
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
на Коте ветка по часам тоже и там тоже будут делать беспроводной с модулем на 2.4 Ггц
если не делать прям-таки "эмулятор Ds-ки", то просто подключить выносной датчик через любой радиомодуль - несложно, код элементарный. Хошь на тех. что по ссылке, хошь на НРФ24. или любом другом... Я к примеру делал на HC-12 с аттини85, работал несколько лет
 

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
В тех что по ссылке не устраивает время спячки /работы. С перемычками максимум 44 сек. Думаю надо по реже работать а то уличной батарейки не надолго хватит. Открытие для себя сделал - батарейки LiSOCl2, у нас как раз морозы до -40 и есть и размер как у AA

P.S. только что привезли это чудо инженерной мысли, саморазряд 1% в год и срок работы лет 20 при температуре от -55
И 190 рублей думаю недорого если её на пару лет хватит.
 

Вложения

Изменено: