Круглые часы на адресной светодиодной ленте

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, Константы задаются один раз, а не переназначаются каждый цикл, и void fillLED() - аналог библиотеки под такой "дисплей".
Да и читабельно весьма)))
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, не только константы. fillLed я вынес в отдельный метод для читабельности. Посмотри, как часто у тебя лента перезаписывается и как часто у меня - это самое основное ИМХО.
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, Это да, разница колоссальная.

firstLedID
hoursDelta
Это нечто основополагающее? Точка отсчета и некий "сдвиг"?
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, hoursDelta это как раз что бы часовая смещалась между делениями, в зависимости от минуты = m/12. Обновил код. FIRSTLEDID - позволит тебе сместить 0 часов на любую диод
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, Типа const int FIRSTLEDID = 30; ? Не могу пока вникнуть в правила управления.
А вот тут
int firstHoursLed = ;
значение 0 поставил.

IMG_20180920_125008_HHT.jpg
При const int FIRSTLEDID = 30
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, еще раз код скопируй) в спешке немного мусора оставалось.)) (работаю и занят немного)

FIRSTLEDID - да, это тот диод, который у тебя стоит на 12 часах
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
Я поосмысляю пока. А то бездумно тыкать без мануала - некомильфо)
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len,

for (i = FIRSTLEDID%5; i < FIRSTLEDID%5+LEDCOUNT; i = i+5)
заливаю зеленым все диоды, которые находятся в шаге 5 от указанного за базовый

(FIRSTLEDID+m) % LEDCOUNT - вначале прибавляется количество минут к первому диоду и переводится кратно количеству диодов. Для часов аналогично
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, перезалил последнее видео. Камера хреново снимает такие светящиеся объекты, но, думаю, тут видно будет.
Рулон "праздничной" изоленты на 0-м светодиоде. А словами чет я не могу свормулировать))
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, цвета сильно яркие? моргают? Последнюю версию кода ставил? Какой диод первый - 30?
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
Стоит последняя версия, первый диод 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

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, так в коде нет ничего сложного) В основном небольшая модификация твоего же кода)
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, (FIRSTLEDID + LEDCOUNT - 1)% LEDCOUNT + hoursDelta - не понимаю, как это работает. % - ???? шо за зверь? И как должон работать hoursDelta? То есть, мы имеем (стартовый диод + количество диодов - 1) что-топроцент(остаток от чего?) количество диодов+смещение (равное 0).....
Я уже как эту формулу не курил, но просветление на меня так и не ляснулось.
Тю, блин, hoursDelta это m/12. Все-таки трудновато в длинных названиях ориентроваться поначалу) как работает % ? я чет мануалы читаю, но не вкурю
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, % - остаток от деления.
hoursDelta = m/12 - это как раз таки часть одного часа, на которую должна часовая стрелка сдвинуться. Из твоего же кода взял.
(0 + 60 - 1) % 60 + m/12 = 59%60 + m/12 => зажжется диод 59 + m/12
(0 + 60) % 60 + m/12 = 60%60 + m/12 => зажжется диод 0 + m/12
(0 + 60 + 1) % 60 + m/12 = 61%60 + m/12 => зажжется диод 1 + m/12

если же у нас 12 часов не в нуле а на 30 диоде, то:

(30 + 60-1) % 60 + m/12 = 89 %60 + m/12 => зажжется диод 29 + m/12
(30 + 60) % 60 + m/12 = 90%60 + m/12 => зажжется диод 30 + m/12
(30 + 60 + 1) % 60 + m/12 = 91%60 + m/12 => зажжется диод 31 + m/12

UPD. PS. Ты, наверное, не заметил - я слегка изменил код, но на логику не влияет вообще
 
Изменено:

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
Дык вот что за зверь) Агась, остаток.... (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 остается фоном.
 
Изменено:

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len,
1. я ж написал, в логике ничего не поменялось. Присмотрись, я просто убрал повторяющийся код.
2, А ты понимаешь, что ты этим условием сделал? Попробуй просчитать логику, что происходит с переменными в результате твоих манипуляций. Просто так тыкать условия - не вариант. Продебаж что происходит при 6 и 3, посмотри что происходит при добавленном тобой условии
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
В общем, вывел в порт следующие значения:
currentHourLed; hoursDelta; m; h; (currentHourLed - 1)% LEDCOUNT + hoursDelta; (currentHourLed )% LEDCOUNT + hoursDelta и
(currentHourLed + 1 )% LEDCOUNT + hoursDelta. Ну так, что бы вообще посмотреть, что происходит. Вот результат:
55 4 57 5 58 59 60
55 4 58 5 58 59 60
55 4 59 5 58 59 60
60 0 0 6 59 0 1
60 0 1 6 59 0 1
60 0 2 6 59 0 1
60 0 3 6 59 0 1
60 0 4 6 59 0 1
60 0 5 6 59 0 1
60 0 6 6 59 0 1
60 0 7 6 59 0 1
60 0 8 6 59 0 1
60 0 9 6 59 0 1
60 0 10 6 59 0 1
60 0 11 6 59 0 1
60 1 12 6 60 1 2
60 1 13 6 60 1 2
60 1 14 6 60 1 2
60 1 15 6 60 1 2
60 1 16 6 60 1 2
60 1 17 6 60 1 2
60 1 18 6 60 1 2
60 1 19 6 60 1 2
60 1 20 6 60 1 2
60 1 21 6 60 1 2
60 1 22 6 60 1 2
60 1 23 6 60 1 2
60 2 24 6 61 2 3
60 2 25 6 61 2 3
60 2 26 6 61 2 3
60 2 27 6 61 2 3
60 2 28 6 61 2 3
60 2 29 6 61 2 3
60 2 30 6 61 2 3
60 2 31 6 61 2 3
60 2 32 6 61 2 3
60 2 33 6 61 2 3
60 2 34 6 61 2 3
60 2 35 6 61 2 3
60 3 36 6 62 3 4
60 3 37 6 62 3 4
60 3 38 6 62 3 4
60 3 39 6 62 3 4
60 3 40 6 62 3 4
60 3 41 6 62 3 4
60 3 42 6 62 3 4
60 3 43 6 62 3 4
60 3 44 6 62 3 4
60 3 45 6 62 3 4
60 3 46 6 62 3 4
60 3 47 6 62 3 4
60 4 48 6 63 4 5
60 4 49 6 63 4 5
60 4 50 6 63 4 5
60 4 51 6 63 4 5
60 4 52 6 63 4 5
60 4 53 6 63 4 5
60 4 54 6 63 4 5
60 4 55 6 63 4 5
60 4 56 6 63 4 5
60 4 57 6 63 4 5
60 4 58 6 63 4 5
60 4 59 6 63 4 5
65 0 0 7 4 5 6
65 0 1 7 4 5 6
65 0 2 7 4 5 6

По хорошему, вот этот кусочек
if (h == 0){
currentHourLed = FIRSTLEDID + LEDCOUNT; //вот это для корректного отображения 12 часов
} else {
currentHourLed = FIRSTLEDID + h*5; //для всех остальных часов
}

можно заменить на
currentHourLed = FIRSTLEDID + h*5; //для всех остальных часов
при FIRSTLEDID = 30;
Правда, если FIRSTLEDID будет равен 0, то:
55 4 57 11 58 59 60
55 4 58 11 58 59 60
55 4 59 11 58 59 60
0 0 0 0 -1 0 1
0 0 1 0 -1 0 1
0 0 2 0 -1 0 1
0 0 3 0 -1 0 1
0 0 4 0 -1 0 1
0 0 5 0 -1 0 1
0 0 6 0 -1 0 1
0 0 7 0 -1 0 1
0 0 8 0 -1 0 1
0 0 9 0 -1 0 1
0 0 10 0 -1 0 1
0 0 11 0 -1 0 1
0 1 12 0 0 1 2
0 1 13 0 0 1 2
0 1 14 0 0 1 2
0 1 15 0 0 1 2
0 1 16 0 0 1 2
0 1 17 0 0 1 2
0 1 18 0 0 1 2
0 1 19 0 0 1 2
0 1 20 0 0 1 2
0 1 21 0 0 1 2
0 1 22 0 0 1 2
0 1 23 0 0 1 2
0 2 24 0 1 2 3
остальное нормально.
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
Тогда в 12 у тебя будет currentHourLed = 90 => все норм
а в 6 часов что случится?

ЗЫ. Для себя лично вопрос: Ты не находил случаем другие библиотеки для работы с WS2812b? Есть еще fastLED - но она медленнее, как ни забавно)) и больше памяти жрет.. У Алекса еще есть ссылка на light_ws2812 - но так и не смог поставить...

ЗЫ2, я бы еще предложил вместо hoursDelta = m/12; сделать hoursDelta = round(m/12.0);
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
При при FIRSTLEDID = 30; - ничего. Все то же самое. Ща пару костылей воткну, посмотрим:)
Не, юзал первое, что под руку подвернулось, остальные библиотеки даже не пытался рассматривать.
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, тоже самое в смысле все норм или такие же глюки?
Я бы предложил тебе продебажить таки 6 часов)) а заодно просчитать вручную что будет происходить с переменными