@feniragon, Константы задаются один раз, а не переназначаются каждый цикл, и void fillLED() - аналог библиотеки под такой "дисплей".
Да и читабельно весьма)))
@seve_len, не только константы. fillLed я вынес в отдельный метод для читабельности. Посмотри, как часто у тебя лента перезаписывается и как часто у меня - это самое основное ИМХО.
@seve_len, hoursDelta это как раз что бы часовая смещалась между делениями, в зависимости от минуты = m/12. Обновил код. FIRSTLEDID - позволит тебе сместить 0 часов на любую диод
@feniragon, перезалил последнее видео. Камера хреново снимает такие светящиеся объекты, но, думаю, тут видно будет.
Рулон "праздничной" изоленты на 0-м светодиоде. А словами чет я не могу свормулировать))
Стоит последняя версия, первый диод 30. Засвечивает, зараза. Я и тусклее уже делал.
Тогда попробую словами:
когда должны отображать часовую стрелку
58,59, 0 - то 0 остается фоном.
59,0,1 - нормально;
0,1,2 - 0 фон;
1,2,3 - 1 фон;
2,3,4 - 2 фон;
3,4,5 - 3 фон;
4,5,6 - уже как положено
@feniragon, (FIRSTLEDID + LEDCOUNT - 1)% LEDCOUNT + hoursDelta - не понимаю, как это работает. % - ???? шо за зверь? И как должон работать hoursDelta? То есть, мы имеем (стартовый диод + количество диодов - 1) что-топроцент(остаток от чего?) количество диодов+смещение (равное 0).....
Я уже как эту формулу не курил, но просветление на меня так и не ляснулось.
Тю, блин, hoursDelta это m/12. Все-таки трудновато в длинных названиях ориентроваться поначалу) как работает % ? я чет мануалы читаю, но не вкурю
Дык вот что за зверь) Агась, остаток.... (0 + 60 - 1) % 60 + m/12 = 59%60 + m/12 => зажжется диод 59 + m/12 чет такое ощущение, что тут как-то не так происходит... Если результат деления меньше 1, то как оно себя ведет?
Ща перезалью!
Хм.... Блин, я к тем переменным еще не привык, а тут новые) Новый метод ведет себя так же при переходе через 0. Я в своей последней кривулине ставил два условия для корректного прохождения через 0... Там часы == 0 и сдвиг < 1 был.. Ага...ща..
Короче, что-то лютое происходит) При h==0 и сдвиг < 1 (так было в моей последней кривулине) нифига. При час == 6 и сдвиг == 3 (хз, почему, но захотелось) в конструкцию демоны вселились)) Все вернул, ушел курить
Поставил FIRSTLEDID = 0; и if (h == 0 && hoursDelta < 1). Стало веселее, только при необходимости отрисовать 58,59, 0 0 остается фоном.
@seve_len,
1. я ж написал, в логике ничего не поменялось. Присмотрись, я просто убрал повторяющийся код.
2, А ты понимаешь, что ты этим условием сделал? Попробуй просчитать логику, что происходит с переменными в результате твоих манипуляций. Просто так тыкать условия - не вариант. Продебаж что происходит при 6 и 3, посмотри что происходит при добавленном тобой условии
В общем, вывел в порт следующие значения:
currentHourLed; hoursDelta; m; h; (currentHourLed - 1)% LEDCOUNT + hoursDelta; (currentHourLed )% LEDCOUNT + hoursDelta и
(currentHourLed + 1 )% LEDCOUNT + hoursDelta. Ну так, что бы вообще посмотреть, что происходит. Вот результат:
По хорошему, вот этот кусочек
if (h == 0){
currentHourLed = FIRSTLEDID + LEDCOUNT; //вот это для корректного отображения 12 часов
} else {
currentHourLed = FIRSTLEDID + h*5; //для всех остальных часов
}
можно заменить на
currentHourLed = FIRSTLEDID + h*5; //для всех остальных часов
при FIRSTLEDID = 30;
Правда, если FIRSTLEDID будет равен 0, то:
Тогда в 12 у тебя будет currentHourLed = 90 => все норм
а в 6 часов что случится?
ЗЫ. Для себя лично вопрос: Ты не находил случаем другие библиотеки для работы с WS2812b? Есть еще fastLED - но она медленнее, как ни забавно)) и больше памяти жрет.. У Алекса еще есть ссылка на light_ws2812 - но так и не смог поставить...
ЗЫ2, я бы еще предложил вместо hoursDelta = m/12; сделать hoursDelta = round(m/12.0);
При при FIRSTLEDID = 30; - ничего. Все то же самое. Ща пару костылей воткну, посмотрим
Не, юзал первое, что под руку подвернулось, остальные библиотеки даже не пытался рассматривать.
@seve_len, тоже самое в смысле все норм или такие же глюки?
Я бы предложил тебе продебажить таки 6 часов)) а заодно просчитать вручную что будет происходить с переменными
На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.