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

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

Комментарии

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
208
Смотришь определение функции digitout
1561889325315.png
Функция отображает цифры. Первый параметр -- позиция цифры, второй -- цифра (хотя по факту, полистав ниже, видно, что не только цифры можно показывать).
 

valek

✩✩✩✩✩✩✩
28 Июн 2019
17
1
Москва
digitout (16, 13 ); // отрисовываем "-" (выставляем черные точки) то есть цифра 13 соответсвует блоку case 13 ?
 

valek

✩✩✩✩✩✩✩
28 Июн 2019
17
1
Москва
простите не вставил часть кода) digitout (0, time.Hours / 10 ); // отрисовываем цифры (выставляем черные точки). вот тут цифра 10. а в блоке отображения цифр нет блока под цифрой 10. там нумерация 1.2.3.4.5.6.7.8.9.0.11.12 и тд это правильно?
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
208
простите не вставил часть кода) digitout (0, time.Hours / 10 ); // отрисовываем цифры (выставляем черные точки). вот тут цифра 10. а в блоке отображения цифр нет блока под цифрой 10. там нумерация 1.2.3.4.5.6.7.8.9.0.11.12 и тд это правильно?
Там не цифра 10, там текущий час, разделенный на 10. Деление целочисленное, т.е. дробная часть результата отбрасывается.
 

valek

✩✩✩✩✩✩✩
28 Июн 2019
17
1
Москва
@Александр Симонов, не могли бы вы посмотреть скетч. а точнее подскажите что убрать/добавить что бы раздельтельные точны в часах были одного цвета что и цифры. этот код в самом низу скетча. и еще у меня почему то в температуре отображается символ С без нижнего сегмента. не могу понять почему.
 

Вложения

jokir1971

✩✩✩✩✩✩✩
2 Июл 2019
1
0
Всем добра! Помогите советом - собрал часы, все отлично, но есть проблема. Утром отключил часы от сети, а вечером при включении часы показали время, отстающее на час с лишним. Как я понимаю RTC 3231 не корректно сработали от 2032. Как с этим жить???
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
208
@Александр Симонов, а не подскажите по доброте душевной что написать в скетче что бы часы, допустим, с 7 утра светили ярко, а с 21-00 на минимум?
Для запросов типа "сделайте за меня" есть раздел "Ищу разработчика" на этом форуме. Любой школьник вам напишет за 100р.

Если есть время и желание разобраться самому, то начните с канала Заметки Ардуинщика, хотя бы первые уроки.
 

valek

✩✩✩✩✩✩✩
28 Июн 2019
17
1
Москва
Для запросов типа "сделайте за меня" есть раздел "Ищу разработчика" на этом форуме. Любой школьник вам напишет за 100р.

Если есть время и желание разобраться самому, то начните с канала Заметки Ардуинщика, хотя бы первые уроки.
я пытался. слишком много вопросов возникает в процессе изучения. а в сборнике команд ардуино некоторых слов почему то нет. я про те что встретились мне в скетче часов. но все ровно спасибо. буду изучать
 

Dimsim

✩✩✩✩✩✩✩
14 Июл 2019
1
0
Моя версия скетча часов. Один светодиод на сегмент. Две мигающие точки (секунды).
Автоматическое изменение яркости ступенчато, опрос датчика раз в 3 секунды.
Изменение цвета ступенчато, потенциометром. В дальнейшем, есть желание сделать изменения цвета потенциометром плавно, но знаний пока не хватает. И как я понимаю, здесь желающих помочь безвозмездно нет.
Ссылка
 

Игорь2019ok

✩✩✩✩✩✩✩
28 Мар 2019
3
0
Добрый день, а где найти правильную схему подключения датчика температуры и фоторезистора? В скетче порт стоит А3 а не D3 как на схеме
 

valek

✩✩✩✩✩✩✩
28 Июн 2019
17
1
Москва
друзья подскажите вот у меня в часа участок кода отвечающий за авторегулировку яркости. как мне сдвинуть границы срабатывания в нем. что бы темнели часы сильнее. а то они даже в полной темноте считают что есть немного света.

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);
strip.setBrightness(new_bright_f); // установить новую яркость
}
}
};
 

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

★★★★★★★
14 Авг 2019
4,252
1,297
Москва
new_bright = map(analogRead(BRI_PIN), 0, bright_constant, min_bright, max_bright);
тут считываемое значение яркости приводится к сотв. значению яркости для проекта. считается что значение между 0 и bright_constant, если в полной темноте (а светодиод никакой в фоторезистор не светит ?) есть какое то значение больше 0, то и получается, что где то что то светит. если вместо 0 поставить то самое значение, что дает фоторезистор в полной темноте, то как раз должны получить минимальное значение яркости
 

valek

✩✩✩✩✩✩✩
28 Июн 2019
17
1
Москва
@Старик Похабыч, в мониторе порта показывает 10 -15 ... если рукой закрыть то будет ноль. но яркость все ровно не уменьшается. до необходимого минимума.заметил что если часы в полной темноте выключить и включить то яркость встает на минимум прям как мне и надо. но если по светить на них. то набирают яркость и больше не опускаются до нужного предела.
 

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

★★★★★★★
14 Авг 2019
4,252
1,297
Москва
Тогда надо ковырять фильтр
new_bright_f = new_bright_f * coef + new_bright * (1 - coef);

Для начала просто отключить его. Как этот фильтр работает есть у Алекса на видео, я с ним не разбирался, так что если после отключения будет нормально работать (как хотелось бы) то следует подобрать нужный coef

И еще вариант уменьшить значение min_bright , если возможно
 
Изменено:

valek

✩✩✩✩✩✩✩
28 Июн 2019
17
1
Москва
@Старик Похабыч, еще заметил что если просто проверяю фоторезистор отдельным скетчем то показания меняются в зависимости от света. а в скетче часов всегда монитор показывает 17. но часы меняют яркость от освещения все ровно. и что бы я не делал минимальная яркость через фоторрезистоор больше минимальной если без него