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

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

Комментарии

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
@kym13, я не настоящий сварщик - то бишь электронщик, я больше в коде разбираюсь.
...Не забудьте только читать контрольную сумму с датчика - в этом случае вы будете уверенны, что обмен по кабелю идет без ошибок.
О кстати нужная тема, не подскажете как это делается, а то в будущем тоже предстоит вынос датчика метров на 15...20 сначала временно в качестве эксперимента, если получится хочу у себя на работе замутить "метеочасы" на стене цеха, ближайшее по периметру окно как раз не ближе 15 метров, при положительном результате сверлим отверстие в стене, но так, чтобы можно было "из окна" вывесить на улицу экран стивенсона с bme280 внутри.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
@kym13, я бы не советовал витую на уличный, проблема с пайкой) себе заменил на ксвв 4*0,5
 

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
@kym13, паяется хорошо и не ломается, с витой от телефона замучался паять, постоянно ломался, сбои были в чтении))
На три не было подходящего, поэтому и 4)
 

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
Появилась идея, реализовать предсказатель погоды.
Надо придумать как лучше отобразить.
Скетч можно взять из проекта с предсказанием погоды.
 

bort707

★★★★★★✩
21 Сен 2020
2,927
868
Выводить что-либо на семи-сегментные индикаторы, кроме цифр - весьма затруднительно. Если очень хочется напихать в обычные часы кучу новых функций - я бы задумался о другом дисплее
 

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
Можно сымитировать, например солнце в левом верхнем углу, жёлтым цветом, тучу, 3 и 4 сегмент верхняя часть синим цветом, грозу можно тёмно-синим цветом, или что-то аналогичное)
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
Погонял пару дней скетч из 442 поста, всё отлично, при отрицательной температуре высвечивается (-) минус (положил кусок замороженного теста на датчик), цвета в скетче зашиты красивые. Делаю часы не себе и по просьбе "заказчика" отключил: 1) точки чтобы не моргали(говорят раздражают); 2) температуру с DS3231(а то масло масляное, два датчика в одном месте перебор). Выглядеть будут примерно так, называется "паспарту" рамка А4 для фото, при отключённых часах просто чистый белый фон, не видно цифр.
 

Вложения

  • 55.8 KB Просмотры: 20
  • 59 KB Просмотры: 22
  • 58.5 KB Просмотры: 17
Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
@kym13, так телефонный такой же, как и витая пара, только 4 жилы. Можешь попробовать, цена не кусается, разница небольшая у них. Но после замены на моножил, проблемы с чтением пропали. Припаялся на улице превосходно) до сих пор не было сбоя в отсутствии сигнала с датчика...
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Люди добрые научите пожалуйста, как комментировать, отключать ненужные функции в #442 на примерах: 1. отключения "радуги" при смене минут, и на примере 2. исключения из датчиков и показа температуры с датчика ds18b20 ?
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
Люди добрые научите пожалуйста, как комментировать, отключать ненужные функции в #442 на примерах: 1. отключения "радуги" при смене минут, и на примере 2. исключения из датчиков и показа температуры с датчика ds18b20 ?
// cylon (); // Эффект "Радуга" при каждом изменении цвета, если нужно раскоментируйте, у меня это 213 строка

в этом скетче посмотри, в нем отключена радуга и 18b20, отключение точек 181 строка(ставишь 1 точки отключаются но часы идут, 2 -раз в сек, 3 раз в 2 сек т.д.)
 

Вложения

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

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
А вот тут созрела мысль, а нельзя ли отключить верхнюю точку в двоеточии при отображении даты? получилось бы вполне наглядно, например вместо 09:03 светилось бы 09.03
 

bort707

★★★★★★✩
21 Сен 2020
2,927
868
это же лента, каждая точка из двоеточия управляется отдельно. Надо в процедуру показа даты дописать функцию , которая будет зажигать нужную вам точку. Еще важно не забыть при выходе из режима поменять работу точек на обычную

я с нуля примеры кода не пишу :) Попробуйте написать сами - если будут проблемы. помогу.
 

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

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
@bort707, На сколько я помню (хотя все могло и поменяться) есть отдельная процедура вывода точек. Так вот в ней надо смотреть если выводить время, то надо оставить штатную процедуру, а если дату то просто зажечь нижнюю точку, а верхнюю погасить.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
Сегодня собрал родителям часы, вот что получилось. 14 градусов это на улице. Я собственно почему выложил. Хочу спросить какая читаемость лучше?

Или вот эта?
 

Вложения

Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
@kym13, так вставь в том месте, где нужно выключить точки) я так делал у себя)
Люди добрые научите пожалуйста, как комментировать, отключать ненужные функции
C++:
/*
тут закомментирован код
*/

//эта строка закомментирована
 
  • Лойс +1
Реакции: начинающий

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
leds[56] = 0x000000; //56 диод, начиная с нуля будет выключен, делай аналогично, как будет у тебя
Вывод даты и месяца в скетче. у меня строка 373 BrightDots(1); //разделительные точки включены этот параметр отвечает за отображение точек, если поставить "0" то при показе даты точки светится не будут, а как сделать чтобы одна только тухла пока не знаю.

@kym13, так вставь в том месте, где нужно выключить точки) я так делал у себя)

C++:
/*
тут закомментирован код
*/

//эта строка закомментирована
Если тебе надо много строк закоментировать то в начале ставишь /* затем пишешь то что хочешь и в конце ставишь */ - это называется многострочный коментарий. Если надо закоментировать какую либо одну строку то в самом начале строки ставишь "//" без кавычек

У меня есть модуль RTC_pcf_8563, как бы его вставить в скетч вместо DS3231?

@kym13, я бы не советовал витую на уличный, проблема с пайкой) себе заменил на ксвв 4*0,5
Взял 5 метров ксвв 4*0,5, а он ничё такой аккуратненький. Датчик 18b20(не модуль) припаял, подтягивающий резистор разместил практически на ногах ардуины и всё прекрасно работает.
 

bort707

★★★★★★✩
21 Сен 2020
2,927
868
Вывод даты и месяца в скетче. у меня строка 373 BrightDots(1); //разделительные точки включены этот параметр отвечает за отображение точек, если поставить "0" то при показе даты точки светится не будут, а как сделать чтобы одна только тухла пока не знаю.
тут вариантов куча - можно просто погасить одну точку по ее номеру, как сказал @ASM - но это плохое решение, потому что привязано к конкретному номеру диода. Поменяете число диодов на сегмент - и все посыпется.
Лучше, как советует @Старик Похабыч, найти код процедуры BrightDots(). посмотреть как внутри нее зажигаются точки и сделать по аналогии, только для одной точки, а не для двух
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
Вот этот параметр в скетче:
//новые координаты точек
void BrightDots (boolean Dot_On) {
for (uint8_t i = 0; i < DOTS_NUM; i++) {
leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
}
}

void BrightDigit (uint8_t digit, uint8_t cursor)
{
for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
{
for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
{
leds[cursor] = (digit & mask) ? ledColor : 0;
cursor ++;
}
}
}
 

poty

★★★★★★✩
19 Фев 2020
3,046
905
Ещё бы понять где начало ленты, выводящей точки: снизу или сверху?