Часы на светодиодах WS2812b
- Войдите на сайт для отправки комментариев
Здравствуйте. Такая проблема. Собрал часы на светодиодах общее кол-во 155 ( хотя это не важно). Получилась матрица размером 7x17, т.е. одна ее часть приходится на часы 7x8, другая половина 7x8 на минуты(по середине двоеточие). Забил номера светодиодов в глобальный массив const byte, чтобы изменять соответственно цифры.
#define k 7 #define l 17 const byte _hhmm[k][l] = { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // h0 h1 h2 h3 h4 h5 h6 h7 {6, 8, 23, 26, 44, 59, 62, 76, 0, 94, 93, 92, 91, 89, 88, 87, 86}, {5, 0, 0, 27, 45, 0, 0, 75, 0, 95, 0, 0, 98, 100, 0, 0, 103}, {4, 0, 0, 28, 46, 0, 0, 74, 78, 112, 0, 0, 109, 107, 0, 0, 104}, {3, 11, 20, 29, 47, 56, 65, 73, 0, 113, 114, 115, 116, 118, 119, 120, 121}, {2, 0, 0, 30, 48, 0, 0, 72, 77, 130, 0, 0, 127, 125, 0, 0, 122}, {1, 0, 0, 31, 49, 0, 0, 71, 0, 131, 0, 0, 134, 136, 0, 0, 139}, {0, 14, 17, 32, 50, 53, 68, 70, 0, 148, 147, 146, 145, 143, 142, 141, 140}, };
Затем создал функции для чисел от 0 до 9 по принципу:
uint32_t time_color = pixels_1.Color(255,255,255); uint32_t black = pixels_1.Color(0,0,0); //цифра ноль void my_1() { pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[0][h1], black); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[1][h1], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[2][h1], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[3][h1], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[4][h1], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[5][h1], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[6][h1], black); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[0][h2], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[3][h2], black); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[6][h2], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[0][h3], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[3][h3], black); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[6][h3], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[0][h4], black); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[1][h4], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[2][h4], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[3][h4], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[4][h4], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[5][h4], time_color); pixels_1.show(); pixels_1.setBrightness(b); pixels_1.setPixelColor(_hhmm[6][h4], black); }
Далее цифры один (void my_2()),
Два (void my_3()),
Три (void my_4()),
итд.
void setup() { // стандартный код инициализации светодиодов и модуля времени DS3231 } void loop() { byte h = t.hour(); byte m = t.minute(); // цифра ноль для (ЧАСЫ) if (h == 0 | h == 10 | h == 20){ my_1(); h1 = 4; h2 = 5; h3 = 6; h4 = 7; } // цифра один if (h == 1 | h == 11 | h == 21){ my_2(); h1 = 4; h2 = 5; h3 = 6; h4 = 7; }
Итд.
Отдельно десятки (h>=10 & h<20) и двадцатки (h>=20 & h<25)
Далее тоже самое с минутами.
// цифра ноль (минуты) if (m == 0 | m == 10 | m == 20 | m == 30 | m == 40 | m == 50) { my_1(); h1 = 9; h2 = 10; h3 = 11; h4 = 12; }
Итд.
Но проблема в том, что когда, например, в модуле время 23:54, то цифры перемешиваются между собой и время высвечивается как 52:43 или по др. В чем проблема, как правильно? Я самоучка, прошу не судить строго
155-7*8-7*8=43 Это что за двоеточие такое ???
1. Вставьте весь код.
2. Нарисуйте как у вас соединены сегменты. (Сначала змейка шла по вертикали, потом по горизонтали ???)
То что вы уже выложили - это филькина грамота !!!
Зачем вы для каждого пикселя вызываете pixels_1.setBrightness(b); и pixels_1.show(); ??? Их надо вызывать ОДИН РАЗ после задания цвета для всех пикселей "одного кадра" !!!
2. Все верно. Сначала змейка идет вертикально (это поле для часов), потом горизонтально (это минуты).
Мне бы принцип понять. Почему цифры в итоге вперемешку
Код бредовей еще не видел ! Пока вижу что для десятков минут и единиц минут перепутаны столбцы.
Все конструкции:
my_...(); h1 = 4; h2 = 5; h3 = 6; h4 = 7;
надо записать так:
my_...();
То есть сначала задаем столбцы, а потом вызываем отображение !!!
А мне понравилось это:
Но уже на конструкцию :
ругается - где логика?
Изменил как вы написали и удалил лишние show() и setBrightness(b)
И все стало на свои места! У меня сейчас код куда бредовее, кстати! Функций в два раза больше, отдельно на часы и минуты, без массива и соответственно весит он 30544кб. (99%). Он рабочий, но прямо впритык! Это бред! Сейчас 40%! Спасибо Добрый человек! Удачи и здоровья вам, Komandir!
Тоже надо перевернуть:
должен быть раньше чем:
show() и setBrightness(b) должны быть ОДИН раз в конце LOOP !
И + я совсем не разбирался зачем там прерывания и другая лабуда с PWDC ... смотрел только на заявленные проблемы с порядком цифр !
Налицо абсолютно бредовое проектирование схемы и кода. Понимаете, если вам надо вывести на экран двухзначное число, это не значит что надо придумать 100 функций для каждого варианта от 00 до 99. Вместо этого сначала выводим первую цифру, а потом вторую.
Если бы вы сделали змейки для каждой цифры часов и минут одинаковые - можно было обойтись всго десятью функциями для цифр от 0 до 9
Ок, поменял местами. Вы имеете ввиду, что нужно удалить show() и setBrightness(b) из всех функций до void setup() тоже? Только в void loop() в конце один раз? На счет PWDC это я слизал так называемую защиту от зависаний. Черт его знает работает оно или нет, ах-ха-ха! Ну, пусть будет! Вроде не мешает.
...Вы имеете ввиду, что нужно удалить show() и setBrightness(b) из всех функций до void setup() тоже? Только в void loop() в конце один раз...
ДА
Не знаю, понятно ли, что я отвечаю конкретно кому-то, нажимая "ответить".
b707, все верно, у меня как раз такая схема 10 функций для чисел от 0 до 9, и пару функций для режима двоеточий и функция watchdog. А была действительно громоздкая на 20+ функций для часов и минут отдельно
А мне понравилось это:
Но уже на конструкцию :
ругается - где логика?
«Ох, как он сетовал!
Где закон? Нету, мол!»
В.С. Высоцкий.
...Вы имеете ввиду, что нужно удалить show() и setBrightness(b) из всех функций до void setup() тоже? Только в void loop() в конце один раз...
ДА
Все удалил. Все работает. Двоеточие замигало в два раза чаще, вроде в такт секундам, как и планировалось. Раньше чуть запаздывало. Спасибо
Нужно заменить на:
И так же для других разрядов ...
Нужно заменить на:
И так же для других разрядов ...
Ахах, 37%!!! Гениально! У меня там еще есть DHT22. Когда было 99%, я искал по сусекам несчастные килобайты, чтобы температуру и влажность еще завести. Вот теперь есть где разгуляться! Я в программировании профан, поэтому для меня это очень изящное решение!
Первой строкой в loop пишем pixels_1.clear(); и тогда ВСЕ строки где пикселям присваивается цвет black УДАЛЯЕМ !!!
Первой строкой в loop пишем pixels_1.clear(); и тогда ВСЕ строки где пикселям присваивается цвет black УДАЛЯЕМ !!!
Прикольно, 31%...
Было 99%, стало 31%. Я знал, что простые часы не могут весить 99%, поэтому копал везде. Но чтобы больше чем вполовину разгрузить, я конечно не подозревал. "Я просто похлопаю(c)"
А мне понравилось это:
Но уже на конструкцию :
ругается - где логика?
«Ох, как он сетовал!
Где закон? Нету, мол!»
В.С. Высоцкий.
:-)
Ну, да...
Раз в рамках case работает конструкция min ... max почему в других не встречается?
:-)
Элементарно решается одной формулой в две строчки для проекции пикселей. Или таблицей, если лень мозги напрягать.