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

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

Комментарии

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@balent, Вот прошил скетчем Clock_1.95_bme_final без датчиков, только RTC подключено, всё работает. Что уж у Вас там за полтергейтс такой.
 

Вложения

  • 40.9 KB Просмотры: 9
  • 37.6 KB Просмотры: 10
  • 46.8 KB Просмотры: 10
  • 54.2 KB Просмотры: 10
  • 43.2 KB Просмотры: 9
Изменено:

Navigator

✩✩✩✩✩✩✩
12 Апр 2021
12
2
В общем поставили дополнительную точку , индикация часов и переход есть. А вот температуру не показывает. Как в скетче определяется датчик ds18b20 ? и почему они висят на разных пинах ? Они ведь работают на одном проводе.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@Navigator, .....определяется датчик ds18b20? в строке 124 нужно выставить нужное Вам.
...висят на разных пинах... потому что они подключаются не по шине I2C и у каждого датчика свой адрес, если подключить на один пин будет конфликт.
Вы вообще код смотрели? там все настройки расписаны по пунктам.
А вообще о каком скетче речь?:unsure:
 
Изменено:

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Разрешите присоедениться и задать свой вопрос: возможно ли добавить 31-й сегмент (точку между 3-й и 4-й цифрами подключаемую к концу ленты), а в режиме отображения давления сдвинуть индикацию на один знак влево, т.е. символ "Р" гасится, на его место переезжает семерка, зажигается точка после третьей цифры (только в режиме отображения давления) а четвертый знак отображает десятые доли (первый знак после запятой десятичной дроби)?
 

balent

✩✩✩✩✩✩✩
29 Ноя 2021
53
7
@kym13, Знать бы, картинки такие же только время не устанавливается. Попробовать бы hex прошить.
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
p.s. пробовал строку 560 изменять к такому виду: DigitOut(pres / 100, (pres % 100) / 10, pres % 10, pres % 1, 0, pres_color)
но на месте десятичного знака всегда отображается нуль, 7480, 7490 т.е. по факту десятые доли не вычисляются, их значение округленно возможно оператором int pres; значение press приводится к целочисленному выражению, может нужно как в строке 359 temp = 10 * ..... давление тоже умножить на 10, pres = 10*(bme.readPressure() * 0.00750063) чтоб не потерять десятичное значение, затем в строке 569 все делители увеличить в 10 раз?
 

balent

✩✩✩✩✩✩✩
29 Ноя 2021
53
7
@kym13, А можно сбросить Ваши библиотеки и какой Arduino ID пользуешь, у меня 1.8.1
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
может нужно как в строке 359 temp = 10 * ..... давление тоже умножить на 10, pres = 10*(bme.readPressure() * 0.00750063) чтоб не потерять десятичное значение, затем в строке 569 все делители увеличить в 10 раз?
направление правильное, но чтобы добавить точку на дисплей, все строчки вывода по всему скетчу придется менять
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
Я же вам ранее писал,что нужно обновить Arduino IDЕ.
К этому есть какие-то основания? например, если известно, что 1.8.1 - глючная, то надо обновить. А если нет - нафига? у меня вот на одном компе 1.8.3, на другом вообще 1.6.12 - и , знаете, все скетчи собираются...
Никогда не обновляю без повода.
 

Navigator

✩✩✩✩✩✩✩
12 Апр 2021
12
2
Всем огромное спасибо ! Вопрос с датчиками снят, все заработало !!! Отдельная благодарность @kym13 !!!! Проблема была в сбросе при первом включении, после сброса все встало на свои места.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
Navigator
Ёлы палы. Вы код вообще не смотрели что-ли? Там же в начале прямо БУКВАМИ написано
// При первом запуске выбрать режим "- - - -" для обнуления памяти
 

balent

✩✩✩✩✩✩✩
29 Ноя 2021
53
7
@kym13, закатал hex, видно, что время идет, на кнопки реагирует. но крякозябры. Видимо, что-то не соответсвует, кол-во в сегменте или порядок подключения сегментов?
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Видимо, что-то не соответсвует, кол-во в сегменте или порядок подключения сегментов?
А что мешает проверить оба варианта? В скетче зашито один светодиод на пиксель и один пиксель на сегмент (этот параметр как раз и указывается в скетче). Так что если у вас три светодиода на пиксель то и будут кракозябры. Если этот вариант отпал: сравнивайте ваше подключение с подключением в этой теме.
 

balent

✩✩✩✩✩✩✩
29 Ноя 2021
53
7
@kym13, Спасибо за помощь. Установил Ард1,8,16 прошил лоудером первые файлы, и на этом начались проблемы, перестало прошиваться Видимо надо Ардуино обнулить

А hex с чего вы делаете? Не со скетча ли случайно? :)
Дали и зашил.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@balent
Открываете скетч в ардуино IDE компилируете его, затем вверху нажимаете скетч->экспорт бинарного файла и вуаля в Вашей папке со скетчем появляются файлы с расширением hex
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
я бы вам крайне советовал немного глубже погрузиться в вопрос, разобраться с кодом, научиться самому компилировать и прошивать, как минимум.
А такой подход как сейчас - "дали и зашил" - наводит на мысль, что понимаете в программировании мк чуть более нуля и ждете, что форум вас вечно за ручку водить будет. Если так - это заблуждение.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Поздравляю с началом новых проблем. Скорее всего вы зашили прошивку без загрузчика. Теперь вы скорее всего ничего не сможете прошить напрямую-только через программатор. При загрузке скетча через программатор обычно загрузчик затирается (если он не был прописан в хексе). А вообще, компилятор тоже самое делает: сначала компилирует хекс из скетча, а потом шьет его в МК. Так что способ прошивки в вашем случае роли не играет. bort707 прав,вам надо сначала хоть маленько разобраться в скетче.
"Дай голодному рыбу и ты его накормишь на весь день. Дай голодному удочку и научи его ловить рыбу, и ты накормишь его на всю жизнь"
 
  • Лойс +1
Реакции: sergey197008 и kym13