Большие часы на адресных светодиодах 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
442
103
Omsk
это мой частный случай, ну что вы в самом деле ! :) не хочу я портить фасад здания
здесь просто попытаюсь использовать костыль в виде радио удлинителя
получится - хорошо, нет - ну будем портить фасад :)
скетч Вячеслава менять ради этого не надо, она уже почти идеальная и есть всё что надо (меню и возможности)
а то наплодим кучу недоскетчей и то одно не работает, то не так работает как хотелось
 
Изменено:

bort707

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

Leon111_09

★★★✩✩✩✩
6 Июн 2021
642
148
55
Таганрог
forum.wisecomp.ru
платы распаковал
посмотрел я на ваши платы и пришла мысль: хорошо бы к ним подкинуть солнечную панельку (китайскую) для подзарядки солнечным днем. и следом пришла вторая мысль: а ваш датчик хорошо встанет в корпус садового солнечного фонаря (фикспрайс,галамаркет,дешевые-дешевые). и следующая мысль следом за ней: а на стене такой фонарь в держателе а-ля "средневековый настенный держатель для факелов" смотрелся бы еще лучше (плюс подзарядка от солнечной батареи днем).

А зачем две разных?
по ходу одна основная,вторая-для датчика. или я неправильно понял?
 
  • Лойс +1
Реакции: bort707

bort707

★★★★★★✩
21 Сен 2020
2,859
850
@Leon111_09, с фонариком интересная идея, там и солнечная панель со схемой и акб уже есть, интересно на какое напряжение
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
642
148
55
Таганрог
forum.wisecomp.ru
Одна на атмел, другая на есп.
ну, атмел можно использовать для передачи данных с датчика,а есп-под основную часовую плату. оба варианта "жизнеспособны" :)

интересно на какое напряжение
от 3,3В до 4,5В: я с такого типа уличными фонариками уже экспериментировал: делал автономное освещение в коридоре с выносом солнечной панели на улицу.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
424
64
Не компилируется. Ругается на строку 89 "MicroDS18B20 <TEMP_2_PIN> sensor2;"
'MicroDS18B20' is not a template("Micro DS18B20" не является шаблоном)
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
424
64
Такие часы у меня получились без BMP280 и внешнего датчика температуры, прошивка Clock_1.9.ino . То что надо.
Вячеслав_45 человечище.
 

Вложения

  • 70.2 KB Просмотры: 40
  • 82.2 KB Просмотры: 41
  • 74.6 KB Просмотры: 37
  • 74.7 KB Просмотры: 34

kym13

★★✩✩✩✩✩
14 Ноя 2020
424
64
Вячеслав_45
Простите меня за наглость, а можно сделать режим день-ночь в настройках. Что-бы ночью только часы отображались, без даты и температуры. И ноль не значащий убрать. Спасибо.
 
Изменено:

maksland

★★★✩✩✩✩
13 Янв 2019
442
103
Omsk
запустил, давление показывает точно но температура (BMP280) немного выше чем у DS18B20
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
2,859
850
И ноль не значащий убрать.
"убрать ноль" тут просят чуть ли не каждые три страницы. Много раз было обьяснено, как это делать. возьмите да уберите сами.Это ровно одна строка кода.

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

Leon111_09

★★★✩✩✩✩
6 Июн 2021
642
148
55
Таганрог
forum.wisecomp.ru
@Вячеслав_45, подскажите пожалуйста по какому алгоритму у вас работает анимация и автоматическая смена цвета?. почему-то не работает ни то ни другое, хоть в настройках и включено.
 

maksland

★★★✩✩✩✩
13 Янв 2019
442
103
Omsk
когда компилирую под 2 светодиода в меню некоторые параметры не видно, время нормально показывает
а в настройках к примеру
(t) пусто
(P) пусто
(tt) пусто
 

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
В прошивке нужно установить желаемые параметры по умолчанию

C++:
// Defauil настройки в часах устанавливаются режимом "----" +++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define TIME_TEMP 4                // Установка времени отображения температуры и давления 0...8 секунд (0 - отк.)
#define TIME_DATE 0                // Установка времени отображения даты 0...3 секунд (0 - отк.)
#define SET_COLOR 0                // Настройка цвета (если 0 то автоматическая) 0...20
#define SET_LIGHT 0                // Настройка яркости (если 0 то автоматическая) 0...25
#define SET_TEMPS 2                // Включение отображения температуры (0 - отк. 1 - 1 датчик, 2 - 2 датчик, 3 - оба)
#define SET_PRESS 2                // Включение отображения температуры и давления с BMP280 (0 - отк. 1 - темп., 2 - давл., 3 - оба)
#define SET_SHOWS 1                // Включение отображения анимации при смене минут (0 - отк. 1 - вкл.)
#define TIME_TIME 3                // Установка количества отображения температуры и даты в минуту 1...5 раз
а после прошивки в часах выбрать последний пункт "- - - -" и нажать + или - для сброса памяти
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
642
148
55
Таганрог
forum.wisecomp.ru
@Вячеслав_45, я все это делаю,но смены цвета и анимации нету. все остальное работает хорошо.

@Вячеслав_45, обнаружил небольшой баг: если отключить оба датчика температуры, то не работает автоматическая смена цвета и соответственно анимация.