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

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

Комментарии

Leon111_09

★★★✩✩✩✩
6 Июн 2021
642
148
55
Таганрог
forum.wisecomp.ru
я использую dht22
Вы используете ту прошивку,на которую я вам давал линк? В ней не используется этот датчик.Там bmp280 используется.Так же в прошивке нет вывода влажности.Там вывод атмосферного давления.
 

Boroda22

★✩✩✩✩✩✩
23 Фев 2022
240
42
Вы используете ту прошивку,на которую я вам давал линк?
я взял её за основу, нужен был алгоритм отрисовки цифр
Скорее всего что-то напутал на программном уровне + аппаратном )))
Подключил библиботеку Wire.h, отключил опрос блюпупа и dht22, от обычного блока питания работают нормально, не перезагружается. Начинаю опрашивать блюпуп (115200) - начинает перезагружаться.

Очень странная штука получается, по крайней мере для меня. Замерил напряжение от питания usb, на пинах наны, показывает 4.18 В, а вот если питать от блока питания, тогда показания уже 5.18. Что можно предпринять, подавать питание на vin?
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
2,988
895
@Boroda22, так а проблема-то в чём? Питать все часы от USB всё равно нельзя, блок питания, в данном случае, выдаёт нормальное напряжение (с учётом, наверняка, погрешности мультиметра).
 

poty

★★★★★★✩
19 Фев 2020
2,988
895
dht22, его на 3.3 нужно сажать?
Нет, предполагается 5В.
Начинаю опрашивать блюпуп (115200) - начинает перезагружаться.
А вот модуль Bluetooth - штука тёмная. Вряд ли по питанию проблема (там всего 50мА), скорее здесь играет роль то, что логика там 3,3В. Питать его от 5В можно, на плате стоит стабилизатор на 3,3В (вероятно, в руках не держал, но по параметрам - должен). А вот подавать на него 5В сигнал с Ардуино может быть не самый хороший вариант. Я бы попробовал в линию TX от Ардуино до RX модуля поставил резистор 1кОм.
Когда напряжение на Ардуино снижается, снижается и уровень сигнала. Возможно это помогает не перезагружаться, но, думаю, до поры до времени.
В реальной схеме часы подключены со стороны 6-ти выводов
это что означает?
Вообще я бы отвязал питание ленты от питания Ардуино. Допустим, диодом от + питания до +5В Ардуино (+ конденсатор от +5В Ардуино жл GND). Это спасло бы от небольших провалов в напряжении.
 

Boroda22

★✩✩✩✩✩✩
23 Фев 2022
240
42
Вообще я бы отвязал питание ленты от питания Ардуино.
На схеме разве не так ? Собирал схему согласно рекомендациям Гайвера по подключению ленты.
Когда напряжение на Ардуино снижается, снижается и уровень сигнала. Возможно это помогает не перезагружаться, но, думаю, до поры до времени.
Шутка в том, что я пробовал вообще все модули отключить, оставил только DS3231, поведение такое же, как и с подключенными модулями.
 

poty

★★★★★★✩
19 Фев 2020
2,988
895
Потому я и спрашивал, как всё подключено. На приведенной схеме нет никакой развязки кроме конденсатора на вход ленты. Он, конечно, спасает, но эффективность его не такая большая, как в варианте, который я привел.
Если такое происходит при полностью отключенных модулях, то вариантов остаётся два: либо сама Ардуино неисправна (выдернуть её вообще и проверить вне платы), либо на подключенных к её пинам цепях короткое замыкание/низкий импеданс. Нужно прозвонить всё, особое внимание обратить на номиналы подтягивающих резисторов и скачки показаний сопротивления при подключении мультиметра (конденсаторы на линиях данных).
 
  • Лойс +1
Реакции: Boroda22

Boroda22

★✩✩✩✩✩✩
23 Фев 2022
240
42
Добавил два 1N5406, показывает 4,78В, а было 5,3В, пока работают, контроллер не перезапускается, на тестовые команды реагирует, оставлю на сутки под наблюдением )))
 

sashok1958

✩✩✩✩✩✩✩
15 Май 2021
42
5
Умучался мега 328 не работает с начиная с 7 диодов на сегмент и похоже не хватает свопа,хотя компилируется,при загрузке начинают беситься светодиоды ,а потом и кнопки не работают итого общее количество для часов 196 ,либо увеличивать до 20 мегагерц тактовую частоту и потянет мега не знаю,перекомпилировал на 2560,работает ,но свободной железяки нет,пробовал на 64 и 128 мегу ,не компилируется ,проблема с портами,железяки другие по своим свойствам и отличаются от 32 и 2560
 

lunin

✩✩✩✩✩✩✩
10 Дек 2022
9
0
Ребята,обьясните не пойму почему версия 1.8 норм,а 1.9 выдает ошибку,библиотека DS18B20 установлена разных версий и толку нет

C:\Program Files (x86)\Arduino\libraries\
 

Вложения

lunin

✩✩✩✩✩✩✩
10 Дек 2022
9
0
не пошло)))удалил ардуино идэ поставил последнюю тоже нет результата,похоже что то другое

maksland
посмотри л.с
 

sashok1958

✩✩✩✩✩✩✩
15 Май 2021
42
5
железо делает конфронтацию с библиотекой,либо библиотека не та установлена,либо ИДЕ установлено новое добавьте железо и библиотеку от гайвера и посмотрите ,что оно у ВАС говорит,может быть нестыковка в командах или на пропущенные знаки ,ардуино ругается и что пишет в логе ардуино
 

lunin

✩✩✩✩✩✩✩
10 Дек 2022
9
0
C:\Users\User\Desktop\Clock_1.9\Clock_1.9.ino: In function 'void loop()':
C:\Users\User\Desktop\Clock_1.9\Clock_1.9.ino:267:13: error: 'RTC' was not declared in this scope
time_t tm = RTC.get(); // Получение времени
^~~

exit status 1

Compilation error: 'RTC' was not declared in this scope

2023-01-04_00-37-01.png

2023-01-04_00-38-38.png
 

sashok1958

✩✩✩✩✩✩✩
15 Май 2021
42
5
да точно у ВАС НЕПРАВИЛЬНО сделана команда ,что-то пропущено или лишнее поэтому идёт конфронтация часов,подбирать надо библиотеку часов,ВЫ похоже используете библиотеку часов ,не ту которую описывал автор ,либо у ВАС в начале скетча направление ссылки на гитхаб отсутствует и ардуино не может найти

Какой датчик давления у Вас ,если BMP-280 ,то лучше взять пересборку от Sergo_ST ,отсюда https://community.alexgyver.ru/threads/bolshie-chasy-na-adresnyx-svetodiodax-ws2812b.233/page-59
 

lunin

✩✩✩✩✩✩✩
10 Дек 2022
9
0
Версия: 2.0.3
может из за этого не получается?
 

sashok1958

✩✩✩✩✩✩✩
15 Май 2021
42
5
да у автора 1.8. 5 ,я тоже ставил эту версию а потом отошёл назад,нету библиотек
 

lunin

✩✩✩✩✩✩✩
10 Дек 2022
9
0
Arduino: 1.8.5 (Windows 10), Плата:"Arduino Uno"

C:\Users\User\Desktop\Clock_1.9\Clock_1.9.ino: In function 'void loop()':

Clock_1.9:273: error: 'RTC' was not declared in this scope

time_t tm = RTC.get(); // Получение времени

^~~

exit status 1
'RTC' was not declared in this scope

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
642
148
55
Таганрог
forum.wisecomp.ru
не у кого часы эти не отстают?
У меня за год использования ничего подобного не наблюдалось: время считает довольно точный модуль,все остальное только выводит показания на табло.