Большие часы на адресных светодиодах 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,067
915
Вы резистор на плате модуля 3231 выпаяли? Тот что батарейку с питанием соединяет?
 

konan38

✩✩✩✩✩✩✩
19 Мар 2022
2
0
Все замечательно, идут точно. да резистор выпаял. Спасибо всем помогающим.

Конденсатор на модуль часов 100mF по питанию поставил
 

Serzh2000

✩✩✩✩✩✩✩
8 Фев 2021
10
5
добрый вечер.
собрал пока циферблат и электронику на коленке. возникли два вопроса.
1. какое стекло-рассеиватель кто ставил? попробовал оргстекло матовое как то не очень... мутно. простое стекло с тонировкой пятерочкой... цвета меняет тоже не очень... посоветуйте пожалуйста.
2. в шапке прошивки написано
ВОЗМОЖНОСТИ:
// В режиме часов нажатие на "+" отображает температуру, а на "-" дату
нажимаю на минус
да, высвечивается дата (число, месяц)
нажимаю на плюс... ничего как шли часы так и идут ( в настройках кнопка работает)
https://rutube.ru/video/dec9ee0a00cf768957b58bfe3a9e7b7a/
 

BOT_Zilla

✩✩✩✩✩✩✩
1 Апр 2022
15
8
@Serzh2000, под оргстекло можно подложить пленку-рассеиватель от старого ЖК телевизора или монитора. Под матрицей их там три или четыре штуки лежит. Та что белая матовая, она и нужна.
 
  • Лойс +1
Реакции: Serzh2000

kym13

★★✩✩✩✩✩
14 Ноя 2020
529
74

Serzh2000

✩✩✩✩✩✩✩
8 Фев 2021
10
5
я скетч Clock_1.95_bme_final с 69 стр. скачал. мне очень понравилось как отрабатывается яркость фоторезистором,
а вот анимация при смене минуты нет:( изменил - отрисовка цифры минут, часов.
не понравилось , что только две разделительных точки:( изменил две точки для часов и третья(запятая) при показе температуры.
и расчет температуры только положительная и только целая отрицательная :( изменил оба датчика могут показывать отрицательную с точностью до десятых, причем если в десятых ноль то он не высвечивается.
можно посмотреть на видео https://rutube.ru/video/dec9ee0a00cf768957b58bfe3a9e7b7a/
подключены 2 датчика ds1820... Для уличной температуры у меня выведен на улицу кабель... это надежно и никаких батареек или аккумуляторов не надо.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
529
74
@Serzh2000, Этот скетч на 69 стр. я выкладывал он 100% рабочий и проверенный, специально сейчас проверил на часах при нажатии кнопок "+ -" всё выводится как и должно значит при правке вы где-то "накосячили". Радио удлинитель конечно по желанию, мне например не хотелось делать отверстие в раме под кабель и тянуть его на полкомнаты, батарея на нем литиевая одной зарядки хватает на год минимум. Свой скетч переделанный скиньте сюда, если не жалко конечно, интересно посмотреть.
См. фото их специально сделали чтобы не менять цифры по всему коду.
 

Вложения

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

Serzh2000

✩✩✩✩✩✩✩
8 Фев 2021
10
5
спасибо что уделили мне время. может что и накосячил, надо посмотреть по внимательнее.
скетч нет не жалко.

//================= Настраиваемые константы НЕ ИЗМЕНЯТЬ и НЕ РЕДАКТИРОВАТЬ !!!!! ==========================

#define NUM_LEDS ((SEGMENT_LEDS * 28)+ 3 ) //2
#define POINT_UP (14 * SEGMENT_LEDS)
#define POINT_DW ((14 * SEGMENT_LEDS) + 1)
#define POINT_comma ((14 * SEGMENT_LEDS) + 2)//

здесь нет ничего страшного
NUM_LEDS ((3светика в сегменте * 28(в каждом семи сегментном индикаторе 7 светиков их 4 индикатора)+3 точки = 87светиков в часах
POINT_UP (14(два первых семи сегмента "час") *3светика в сегменте) -----------это верхняя точка
POINT_DW (14(два первых семи сегмента "час") *3светика в сегменте) + 1верхняя точка----------это средняя точка
POINT_comma (14(два первых семи сегмента "час") *3светика в сегменте) +2верхняя точка и средняя точка ---------------это нижняя запятая


// добавлена отрисовка цифры минут, часов, смена экрана с эффектом сворачивания и последующем разворачивания.
// смена цвета от освещенности.
// коректировка хода часов с использованием Aging offset.
// новогодняя дискотека.
// оба датчика могут показывать отрицательную температуру с точностью до десятых, причем если в десятых ноль то он не высвечивается.
// добавлена третья точка. Две точки для часов и третья точка(запятая) при показе температуры и даты.
// при установки: часы, дата, год отображается полностью - Мигающий символ.
// минимальная яркость от фоторезистора добавлена в меню.
// Исправлено 10.12.2024
 

Вложения

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

seriy76

✩✩✩✩✩✩✩
18 Окт 2023
3
2
А нельзя сделать что бы двоеточие работала в режиме часов а в режиме отображения температуры светилася только нижний светодиод двоеточия. 2 вариант- не двоеточие. Только один светодиод. В режиме часов мигание посекундное. В режиме температуры постоянное свечение.
 

seriy76

✩✩✩✩✩✩✩
18 Окт 2023
3
2
По поводу рассеивателя. Любой рассеиватель дает размытость цифр. Мне нравиться вариант- прозрачный акрил или световод от жк тв( edge подсветка) с наклеенным на него тонировкой.Тонировка не очень сильная что бы не изменились цвета.
 

Serzh2000

✩✩✩✩✩✩✩
8 Фев 2021
10
5
сделал корпус из остатков ламината, стекло (оконное) на него автомобильная тонировка пятерочка, и по совету
BOT_Zilla пленку-рассеиватель от старого ЖК телевизора, в низу видно глазок под фото резистор. как по мне получилось супер!(y) щас прошивку еще подправлю под себя и можно закрывать заднюю крышку.

IMG_20241208_182802.jpg
IMG_20241208_182717.jpg
IMG_20241208_182729.jpg
IMG_20241208_182749.jpg
IMG_20241208_182802.jpg

 
  • Лойс +1
Реакции: zarogoza и Wan-Derer

Serzh2000

✩✩✩✩✩✩✩
8 Фев 2021
10
5
у меня яркость не меняется в ручную :( может кто зайти у себя в меню
// 8. (L) настройка яркости (если 00 то автоматическая) 0...25
и попробовать увеличить яркость, изменится ?;)
в коде я не нашёл где оно меняется вручную.
C++:
void BrightnessCheck() {

  if (auto_bright) {                         // если включена адаптивная яркость
  if (millis() - bright_timer > 100) {       // каждые 100 мс
     bright_timer = millis();                // сбросить таймер
     new_bright = map(analogRead(LIGHT_PIN), 0, 1020, LIGHT_MAX, LIGHT_MIN );     // когда темно тускло
                                                                                  // при 1023 в полной темноте мерцают диоды   
    // new_bright = map(analogRead(LIGHT_PIN), 0, 1023, LIGHT_MIN, LIGHT_MAX );     // когда темно ярко
      new_bright = constrain(new_bright, LIGHT_MIN, LIGHT_MAX);
      new_bright_f = new_bright_f * coef + new_bright * (1 - coef);
      LEDS.setBrightness(new_bright_f);                                            // установить новую яркость
     }
  }
}
наверно автор забыл дописать ...
C++:
void BrightnessCheck() {

  if (setups[4]==0) {                         // если включена адаптивная яркость
  if (millis() - bright_timer > 100) {       // каждые 100 мс
     bright_timer = millis();                // сбросить таймер
    // new_bright = map(analogRead(LIGHT_PIN), 0, 1020, LIGHT_MAX, LIGHT_MIN );     // когда темно тускло
                                                                                  // при 1023 в полной темноте мерцают диоды   
      new_bright = map(analogRead(LIGHT_PIN), 160, 940, LIGHT_MAX, LIGHT_MIN);     // когда темно ярко
      new_bright = constrain(new_bright, LIGHT_MIN, LIGHT_MAX);
      new_bright_f = new_bright_f * coef + new_bright * (1 - coef);
      LEDS.setBrightness(new_bright_f);                                            // установить новую яркость
     }
  }else {new_bright_f = setups[4] * 10;                                          // установить яркость ручную.
  LEDS.setBrightness(new_bright_f);}
}
}
а эту строчку вообще убрать,

#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
так как она вносит противоречие этому условию
#define SET_LIGHT 0 // Настройка яркости (если 0 то автоматическая) 0...25
 
  • Лойс +1
Реакции: kym13 и zarogoza

zarogoza

✩✩✩✩✩✩✩
29 Авг 2021
1
0
@Serzh2000, Посмотрел, у меня тоже в ручную яркость не меняется. Внес Вашу поправку, заработало, яркость теперь меняется в ручную.
Можно ли переделать Ваш проект Clock 2_1 под 2 светодиода на сегмент? Нужно изменить строчку
#define SEGMENT_LEDS 2 // Количество светодиодов на сегмент (точки по 1 светодиоду)
Или еще где-то нужно изменения вносить?
Спасибо.
 
Изменено: