Большие часы на адресных светодиодах WS2812B

30.08.2018
6
7
3
#1
Всем привет, хочу рассказать о том как я попробовал повторить проект, но столкнулся с некоторыми проблемами.

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

Давно хотел поделиться готовым и работоспособным проектом в кругах аудитории Алекса, но вышло так что собственно нормальной работоспособностью тут не пахнет. Буду благодарени, если у кто сможет помочь.
 
Последнее редактирование:
08.09.2018
9
1
1
#2
Насчет отключения и мерцания, я бы посоветовал проверить через serial monitor показания значения твоего фоторезистора(желательно в разных условиях -> день/ночь и т.д.), для этого можно написать простой код который является пракически тем же самым что и твоя изначальная функция BrightnessCheck()
Только поставь delay(2000) //пару секунд , после каждого получения значений, после этого если не трудно то сделай скрин(ы) и выложи сюда.
Все это для того что бы определить является ли твоя проблема программной или же технической.
Однако я предролагаю что это скорей всего второе.
 
Последнее редактирование:
08.09.2018
9
1
1
#3
И кстати говоря, я только обатил внимание, почему ты используешь 1кОм на фоторезистре? Обычно используется 10 кОм.
Сделай все то что я тебе предположил в предыдущем коментарии, потом замени резистор о повтори процедуру. Обрати внимание на показания.
Хотя в идеале лучше же конечно использовать вот такой девайс TSL2561
 
Последнее редактирование:
30.08.2018
6
7
3
#4
Рисуя схему допустил ошибку. Да, на фоторезисте используется резистор на 10 кОм. Схему перезалил.

Промониторив значения на выходе фоторезистора заметил, что при слабом освещении происходили скачки этих самых значений.

Перебрав пару способов, получилось убрать мерцание и отключение ленты. Мерцание я поборол добавив в код строчку с округлением значения кратному 10, а полное отключение разрешилось добавлением единицы к значению яркости. Ибо иногда на выходе функции получалось 0. Хотя как там получался ноль я не представляю, потому что из-за наличия функций map и constrain, этого происходить не должно. Хоть и это, наверное, костыли, но это работает.
 
Последнее редактирование:
Симпатии: Понравилось vsa1970
05.12.2018
7
5
3
#5
Доброй ночи, решил я сделать тоже часы на WS2812B и Arduino, перепробовал несколько скетчей из сети, но ни один так и не смог запустить. Потом нашел этот форум и здешние не запускаются. Спаял по схеме, но поставил по 1 светодиоду на сегмент, направление как у автора.
Подскажите, пожалуйста, что в скетче еще надо изменить помимо #define NUM_LEDS на свое количество светодиодов, в byte digits[13][28] = в строках цифр ставлю значения для одного светодиода, а вот в // 1*7*4 +2 количество светодиодов в ленте здесь мне поставить 1*7*4 или 4*7*1?
Ну, и все же, если я ничего не изменю в скетче, а использую под количество светодиодов автора, хоть что-то должно светиться? У меня при запуске ничего не светится вообще, компилируется и загружается, правда пишет:
C:\Program Files (x86)\Arduino\libraries\FastLED/FastLED.h:17:21: note: #pragma message: FastLED version 3.001.005

# pragma message "FastLED version 3.001.005"
но это ж вроде не ошибка?
 
Симпатии: Понравилось ViVant
30.08.2018
6
7
3
#6
Доброй ночи, решил я сделать тоже часы на WS2812B и Arduino, перепробовал несколько скетчей из сети, но ни один так и не смог запустить. Потом нашел этот форум и здешние не запускаются. Спаял по схеме, но поставил по 1 светодиоду на сегмент, направление как у автора.
Подскажите, пожалуйста, что в скетче еще надо изменить помимо #define NUM_LEDS на свое количество светодиодов, в byte digits[13][28] = в строках цифр ставлю значения для одного светодиода, а вот в // 1*7*4 +2 количество светодиодов в ленте здесь мне поставить 1*7*4 или 4*7*1?
Ну, и все же, если я ничего не изменю в скетче, а использую под количество светодиодов автора, хоть что-то должно светиться? У меня при запуске ничего не светится вообще, компилируется и загружается, правда пишет:
C:\Program Files (x86)\Arduino\libraries\FastLED/FastLED.h:17:21: note: #pragma message: FastLED version 3.001.005

# pragma message "FastLED version 3.001.005"
но это ж вроде не ошибка?
Приветствую. Сперва об ошибке. У меня тоже такое пишет, но спокойно прошивается и работает.
На счёт количества светодиодов, тут нужно менять весь массив. Первый индекс это количество символов. Их так и остается 13. А второй это количество диодов в одном символе. В вашем случае, получается, их число будет 7.
Если все правильно, то должно выглядеть как-то так:
C:
byte digits[13][7] = {{0, 1, 1, 1, 1, 1, 1},   // Digit 0
                       {0, 1, 0, 0, 0, 0, 1},   // Digit 1
                       {1, 1, 1, 0, 1, 1, 0},   // Digit 2
                       {1, 1, 1, 0, 0, 1, 1},   // Digit 3
                       {1, 1, 0, 1, 0, 0, 1},   // Digit 4
                       {1, 0, 1, 1, 0, 1, 1},   // Digit 5
                       {1, 0, 1, 1, 1, 1, 1},   // Digit 6
                       {0, 1, 1, 0, 0, 0, 1},   // Digit 7
                       {1, 1, 1, 1, 1, 1, 1},   // Digit 8
                       {1, 1, 1, 1, 0, 1, 1},   // Digit 9 | 2D Array for numbers on 7 segment,
                       {1, 1, 1, 1, 0, 0, 0},   // ° char
                       {0, 0, 1, 1, 1, 1, 0},   // C char
                       {1, 0, 0, 0, 1, 1, 1}};  // % char
Пробуйте заменить на этот массив. Надеюсь все верно заменил. В общем, проще говоря, тут каждый нолик или еденица отвечает как должен гореть сегмент для отобряжения определенного символа.
 
Симпатии: Понравилось VK11
05.12.2018
7
5
3
#7
Пробуйте заменить на этот массив.
Большое спасибо за помощь. Я массив так и менял, кроме значения 26 на 7 после 13. Правда, пока все так же, при подключении вспыхивает лишь несколько сегментов четвертой цифры. Пока не знаю на что грешить... вроде и компилируется, и прошивается, и тока БП хватает. Уже на днях еще раз проверю пайку светодиодов и направление, хотя уже пару раз это делал.
 
Симпатии: Понравилось ViVant
30.08.2018
6
7
3
#8
Пока не знаю на что грешить... вроде и компилируется, и прошивается, и тока БП хватает. Уже на днях еще раз проверю пайку светодиодов и направление, хотя уже пару раз это делал.
Еще в коде есть стороки
C:
int cursor = 114; // номер последнего светодиода
он встречается в разных местах 3 раза. Если не меняли, то это может быть причиной. А лучше будет, если выложите свой код и фото.
 
Симпатии: Понравилось VK11
05.12.2018
7
5
3
#9
он встречается в разных местах 3 раза. Если не меняли, то это может быть причиной. А лучше будет, если выложите свой код и фото.
Доброго вечера, оказывается, лента не светилась, так как я устанавливаю светодиоды в сгоревшие китайские часы и паяю их с обратной стороны, там где клейкая основа обычно (у меня изначально без скотча), а там переходное отверстие по линии реза, вот и не было контакта по линии DI и DO, в то время как шины - и + в нескольких местах имеют переходные отверстия, подпаял DI DO со стороны светодиодов и лента засветилась. Вычислил это путем подключения к Ардуино целого куска ленты, которая сразу засветилась.
Сспасибо за подсказки, поменял 114 во всех местах на 30. Но лента теперь горит вот так:
20181208_171634.jpg

Еще я пока не ставил фоторезистор и датчик, думаю, это не критично?
Вот что я прошивал, надеюсь, сохранил правильно:
Еще прошивал другой скетч, ( чужой скетч ) тоже менял количество светодиодов и прочее - часы тоже светятся всеми светодиодами.
И в мониторе порта никаких данных.
 

Вложения

Последнее редактирование:
Симпатии: Понравилось ViVant
30.08.2018
6
7
3
#10
Сспасибо за подсказки, поменял 114 во всех местах на 30. Но лента теперь горит вот так:
Да, нужно поменять еще пару цифр по всему коду. Как я понял, это расположение курсора для каждого символа. И еще в циклах есть каие-то цифры, но похоже что я все угадал и подставил как оно должно быть. Прошил свои часики и у меня все заработало. Только при малом количестве светодиодов анимация каждую минуту очень быстрая. Прикрепил измененный скетч. Отпишитесь как заведете часы)
Если нету фотрезистора, то можно просто в auto_bright поставить 0. Если не планиеруете ставить его, то не плохо было бы удалить лишние строки кода и добавить возможность устанавливать значение яркости вручную.
Крутой у вас дизайн часиков. С чего и как делали?
 

Вложения

Последнее редактирование:
Симпатии: Понравилось VK11
05.12.2018
7
5
3
#11
Огромнейше благодарю!!!) Честно признаться, в прошивках я не шарю, не изучал никогда программирование. Часики завелись. Это не мой дизайн)) Сгорел мк в таких часах
х 3D.jpg_640x640.jpg
Я их разобрал и решил поставить WS2812B, так как проект на таких светодиодах давно встречал в сети. Вот только под рассеивателем все равно слегка пятно светодиода проглядывается, надо будет попробовать или заматировать линзу, или пробовать бумагу дополнительно на линзу укладывать. Посмотрю, хотя вроде и так читабельно) На фото пятна выделяются сильней, визуально не так. Кстати, в этих часах, светодиоды идеально встают в прорезь, иногда даже вплотную.
20181208_204937.jpg 20181208_205037.jpg
 
Симпатии: Понравилось kirovz
05.12.2018
7
5
3
#13
@VK11, пожалйуста. Я рад что смог помочь) В любом случае часы выглядият круто.
:) Кстати, быстрая анимация для меня не критична, так даже быстрей показания выводятся, и по яркости, я планировал на кухню поставить и чтоб ночью подсвечивали, так что поставлю просто поярче или ближе к максимуму)
 
24.11.2018
5
0
1
#14
:) Кстати, быстрая анимация для меня не критична, так даже быстрей показания выводятся, и по яркости, я планировал на кухню поставить и чтоб ночью подсвечивали, так что поставлю просто поярче или ближе к максимуму)
какие библиотеки использовал? у меня ошибка при компиляции
 
05.12.2018
7
5
3
#15
какие библиотеки использовал? у меня ошибка при компиляции
У меня уже в папке библиотек столько накопилось, потому как сперва не получалось с часами, причем на разных скетчах, тоже ошибки компиляций были, то на RTC.h ругалось, то еще что, но стоят такие:
DHT-sensor-library-master
DS3232RTC-master
ds3231-master
RTClib-master
А фастледовские давно стоят и FastLED, и FastLED 3.0.1, и FastLED-master.
Вот я в архиве выложу свои, может поможет что.
 

Вложения

24.11.2018
5
0
1
#16
У меня уже в папке библиотек столько накопилось, потому как сперва не получалось с часами, причем на разных скетчах, тоже ошибки компиляций были, то на RTC.h ругалось, то еще что, но стоят такие:
DHT-sensor-library-master
DS3232RTC-master
ds3231-master
RTClib-master
А фастледовские давно стоят и FastLED, и FastLED 3.0.1, и FastLED-master.
Вот я в архиве выложу свои, может поможет что.
спасибо! всё ок!
 
05.11.2018
1
0
1
#17
Добрый день , для чего нужна кнопка dst так и не понял, может кто объяснит как она работает
 
05.12.2018
7
5
3
#18
Добрый день , для чего нужна кнопка dst так и не понял, может кто объяснит как она работает
DST: Летнее время (англ. Daylight saving time)

Перевод на летнее время. Для меня, например, актуально, так как у нас действует перевод часов)
 
Симпатии: Понравилось ViVant