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

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

Комментарии

Spectrum16

✩✩✩✩✩✩✩
22 Мар 2019
18
0
@ShevaLoL, Вы не подскажете как убрать первый ноль,чтоб было 1:27,а не 01:27. В вашем переписанном скетче есть код, который убирает ноль,но не работает! Врятли автор ответит,может кто уже разбирался, что подскажет?
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,251
1,297
Москва
Вот нашел, когда то переделывал полуготовое, должно быть похоже. Поможет разобраться.
C++:
          clock.read();
          clock.getTime(time_s);
          String s = time_s.substring(0, 5);
          if (s[0] == '0') s[0] = ' '
 

Spectrum16

✩✩✩✩✩✩✩
22 Мар 2019
18
0
Народ, один добрый человек поправил скетч, который универсальный от @ShevaLoL....теперь он без первого нуля...кому нужен, забирайте...
 

Вложения

antsanv

✩✩✩✩✩✩✩
15 Фев 2020
14
3
@maksland, Он на PLATFORMIO сделан, но я легко перенес на ардуино. Только там две библиотеки надо отдельно скачать.
 

antsanv

✩✩✩✩✩✩✩
15 Фев 2020
14
3
Прикольно, он еще через веб-интерфейс управляется и данные датчиков можно по MQTT получать!
 

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
Моя версия прошивки....
Светодиоды WS2812 - 30 шт
часы DS3231
температурный DS18B20

Последоватеольность соединения сигментов индикатора
{G B A F E D C} {G B A F E D C} {верхняя точка} {нижняя точка} {G B A F E D C} {G B A F E D C}

При первом запуске выбрать режим "StdF" для обнуления памяти

подключение кнопок к земле
"+" к 3 пину
"-" к 5 пину
"настройки" к 4 пину

датчик освещенности к А0 пину
температурный к 10 пину
светодиоды к 6 пину

остальное как и у всех!

ВОЗМОЖНОСТИ =====================================================================================

отображают время, температуру, дату, 20 цетов (смена каждую минуту)
сохранение настроек в память (через 15 секунд после последнего нажатия кнопок)

НАСТРОЙКИ (листаются кнопкой "настройки" по кругу):
менять кнопками "+" и "-"
1. настройка цвета (если 00 то автоматическая) 1-20
2. настройка яркости (если 00 то автоматическая) 1-25
3. установка часов
4. установка минут
5. сброс секунд на 00 кнопками "+" или "-"
6. установка дня
7. установка месяца
8. установка года
9. установка времени отображения температуры 0-9 сек.
10. установка времени отображения даты 0-9 сек.
11. сброс настроек ("StdF") кнопками "+" или "-"

примерно через 4 сек выходит в нормальный режим (отображения часов)
кроме 5 пункта (сброс секунд)
 

Вложения

  • Лойс +1
Реакции: Plohish

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
Моя версия прошивки....
Светодиоды WS2812 - 30 шт
часы DS3231
температурный DS18B20

Последоватеольность соединения сигментов индикатора
{G B A F E D C} {G B A F E D C} {верхняя точка} {нижняя точка} {G B A F E D C} {G B A F E D C}
а это для какой платы ?
 

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
1594536417611.png
такое соединение только начало с начала а не с конца ?
 

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
а в вашей прошивке, можно сделать 4-5-....-10, светодиодов на сегмент?
Пока нет такой возможности, много редактировать надо. В ближайшее время буду переписывать эту прошивку под универсальную. Чтоб мож но было в настройках задавать количество светодиодов на сегмент. Сам собираюсь собирать большие часы. Это был пробный вариант. Пока что дописывается эта.
 

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
Пока нет такой возможности, много редактировать надо. В ближайшее время буду переписывать эту прошивку под универсальную. Чтоб мож но было в настройках задавать количество светодиодов на сегмент. Сам собираюсь собирать большие часы. Это был пробный вариант. Пока что дописывается эта.
Большее количество светодиодов можно сделать только если ставить ленту с 1 контроллером на 3...4 светодиода
 

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
У кого нибудь есть идеи как сделать корпус для больших часов чтоб сильно колхозом не смотрелся (без 3д принтера)

В описании забыл указать в режиме отображения часов нажатие на кнопку "+" в течении 4 сек. отображается температура, а на "-" дата