нашел на просторах интернета простые в изготовлении (ни каких плат рисовать-травить не надо, собирается из готовых плат проводками за 10 мин) , но интересные по функционалу часы http://forum.amperka.ru/threads/%D0%A7% ... %BA.12793/ немного переделал для себя . получилось хорошо в часах три шрифта музыкальные будильники термометр поздравительные плюшки .... был приемник, но я его за ненадобностью вырезал автор часов потрудился хорошо над ними...
печалька - под ESP12 компилиться не хочет(с прерываниями лажа какая то)..
Вопрос сэнсэям Ардуины - сложно ли програмно, вывод индикации сделать не в i2c а в UART ? (а то что то эта матрица внешне прямо не "фонтан", а в наличии есть с UART посимпатичнее)
Рассмотрим реализацию узла управления реле на примере компонентов SUNCO и реле Hongfa. Разберем оптимальные схемы и долговечные полупроводниковые компоненты для их реализации среди широкого ассортимента SUNCO. В номенклатуру компании SUNCO входят диодные мосты, выпрямительные, сигнальные и TVS-диоды, стабилитроны, биполярные, цифровые PNP- и NPN-транзисторы, маломощные тиристоры, симисторы и MOSFET.
В последние годы растёт спрос на источники питания для промышленной автоматизации в связи с увеличением инфраструктурных проектов, требующих надёжного электропитания. Источники питания на DIN-рейку MEAN WELL обладают высокой эффективностью, надёжностью и безопасностью, обеспечивая стабильное выходное напряжение. Большой ассортимент в наличии позволяет выбрать подходящий ИП MW на DIN-рейку для решения любой задачи электропитания.
Хоть на лоб . Неважно главное даже плату травить не надо
На лоб возможно пойдёт, а в АвтоМотоВело не пойдёт. Плата на проволочках, на механических контактах долго не проживёт. Только плата вытравленная, спаяная, и покрытая лаком
Т.е. сначала обновить, потом подождать, а потом очистить и повторять вывод.
спасибо, исправлю
Цитата:
Может увеличить задержку в delay с 30 мс до ~500? В сам код не вникал глубоко, может и ошибаюсь...
в delay вся и загвоздка, можно и без него, но тогда очень быстро отрисовываются цифры методом подбора получил (зо милсек ) чуть быстрее секунды а если delay(500) будут не только точки мигать медленно но и отрисовка цифр ....
"if (millis()%100==0) {..." -- это значит поймать момент, когда число милисекунд будет делиться на 100 без остатка, а по времени длится это событие всего 1 мс. из 100. Мне кажется, это поймать невозможно, будут сплошные пропуски по этому условию. Лучше бы просто там вставил delay(100), без всяких проверок условий.
Добавлено after 25 minutes 34 seconds: Я бы попробовал сделать этот кусок так, если что:
Код:
delay(100); // ждём 0,1 с clrAll(); // это же очистка всего? Можно ли её делать один раз перед выводом, или обязательно в цикле?
for (int q = 0; q < 12; q++ ) { // теперь цикл вывода значений, как я понимаю... // секунды, судя по переменной if (s0 != lasts0){showDigit( s0 * 12 + q, 28, dig3x7q);} else showDigit(s0, 28, dig3x7s); // десятки секунд if (s1 != lasts1) showDigit( s1 * 12 + q, 24, dig3x7q); else showDigit(s1, 24, dig3x7s); // минуты if (m0 != lastm0) showDigit( m0 * 12 + q, 17, dig4x8q); else showDigit(m0, 17, dig4x8); // десятки минут if (m1 != lastm1) showDigit( m1 * 12 + q, 12, dig4x8q); else showDigit(m1, 12, dig4x8); // часы if (h0 != lasth0) showDigit( h0 * 12 + q, 5, dig4x8q); else showDigit(h0, 5, dig4x8); // десятки часов if (h1>0){ if (h1 != lasth1) showDigit( h1 * 12 + q, 0, dig4x8q); else showDigit(h1, 0, dig4x8);}
} // конец цикла refreshAll(); // обновить всё, что навыводили в цикле, так?
Не понял, правда, как там работает "showDigit( s0 * 12 + q, 28, dig3x7q)" и в чём её отличия от "showDigit(s0, 28, dig3x7s)", который выполняется, если значение не изменилось...
for (int q = 0; q < 12; q++ ) { // для того чтобы отрисовать цифру состаящую из 12 точек (или шагов как правильно?)
if (s0 != lasts0){showDigit( s0 * 12 + q, 28, dig3x7q);} // s0 * 12 + q - номер строки в масиве dig3x7q (смотрим вкладку "fonts.h") else showDigit(s0, 28, dig3x7s); // s0 - номер строки в масиве dig3x7s (смотрим вкладку "fonts.h")
if (s1 != lasts1) showDigit( s1 * 12 + q, 24, dig3x7q); //24- позиция экрана с которой начинать печать else showDigit(s1, 24, dig3x7s); //24- позиция экрана с которой начинать печать
if (m0 != lastm0) showDigit( m0 * 12 + q, 17, dig4x8q); // dig3x7q - указатель на масив данных (смотрим вкладку "fonts.h") else showDigit(m0, 17, dig4x8); // dig4x8 - указатель на масив данных (смотрим вкладку "fonts.h")
if (m1 != lastm1) showDigit( m1 * 12 + q, 12, dig4x8q); // (m1 != lastm1)- проверяем изменилась цифра или нет else showDigit(m1, 12, dig4x8);
if (h0 != lasth0) showDigit( h0 * 12 + q, 5, dig4x8q); else showDigit(h0, 5, dig4x8);
if (h1>0){ if (h1 != lasth1)showDigit( h1 * 12 + q, 0, dig4x8q); else showDigit(h1, 0, dig4x8);}
int flag = millis() % 1000; // счетчик будет считать до тысячи и все заново(я так думаю, поправте если не прав) if ( flag > 500) { setCol(10, 0x24);} // если флаг больше 500, рисуем точки
refreshAll(); // вывод на экран (смотрим вкладку "max7219.h") clrAll(); // очищает экран полностью (смотрим вкладку "max7219.h") } lasth1 = h1; lasth0 = h0; lastm1 = m1; lastm0 = m0; lasts1 = s1; lasts0 = s0; // для того чтобы знать изменилась цифра или нет }
Цитата:
Не понял, правда, как там работает "showDigit( s0 * 12 + q, 28, dig3x7q)" и в чём её отличия от "showDigit(s0, 28, dig3x7s)", который выполняется, если значение не изменилось...
отличия - разный масив данных dig3x7q - цифра рисуется за 12 шагов (с эффектом которым борюсь, чтобы цифра отрисовывалась за 0,9 милсек), а dig3x7s цифра рисуется вся сразу.
В таком виде нормально, теперь можно вернуть delay в цикл для плавного вывода изменившихся цифр, только задержка там должна быть не больше 500мс / 12, иначе точки не будут мигать...
В таком виде нормально, теперь можно вернуть delay
честно говоря не совсем понял , что написал на 182 стр. ( if (millis() % 2==0)q++) но стали цифры отрисовываться с задержкой, если поставить например 10 то очень медленно, а на точку это не влияет! может кто пояснит? желательно по "слогам"
Цитата:
Serzh2000 писал(а): (с эффектом которым борюсь, чтобы цифра отрисовывалась за 0,9 милсек) Может за 0,9 сек?
да вы правы, ошибся...
можно ли в оной void { millis()%15000 что то делаем millis()%2==0 что то делаем millis()%200>10 что то делаем } использовать несколько раз функцию millis()?
честно говоря не совсем понял , что написал на 182 стр. ( if (millis() % 2==0)q++) но стали цифры отрисовываться с задержкой, если поставить например 10 то очень медленно, а на точку это не влияет! может кто пояснит? желательно по "слогам"
Тогда, когда количество милисекунд после старта будет чётным (в 50% случаев), один шаг в цикле пропускается. Вы, извиняюсь, пишите скетч по методу вставки случайных команд в случайные места?
можно ли в оной void { millis()%15000 что то делаем millis()%2==0 что то делаем millis()%200>10 что то делаем } использовать несколько раз функцию millis()?
Можно, но следует учесть, что она в каждом случае будет возвращать новое значение. И зачем Вам это? Сделайте просто, без всяких извращений над кодом, например, так:
Код:
void showAnimClock(){
clrAll(); // очищает экран полностью (смотрим вкладку "max7219.h")
// выводим цифры, которые не изменились if (s0 == lasts0){showDigit(s0, 28, dig3x7s);} if (s1 == lasts1){showDigit(s1, 24, dig3x7s);} if (m0 == lastm0){showDigit(m0, 17, dig4x8);} if (m1 == lastm1){showDigit(m1, 12, dig4x8);} if (h0 == lasth0){showDigit(h0, 5, dig4x8);} if ((h1>0)&&(h1 == lasth1)){showDigit(h1, 0, dig4x8);}
// а теперь цикл по изменившимся цифрам for (int q = 0; q < 12; q++ ) {
if (s0 != lasts0){showDigit( s0 * 12 + q, 28, dig3x7q);} if (s1 != lasts1){showDigit( s1 * 12 + q, 24, dig3x7q);} if (m0 != lastm0){showDigit( m0 * 12 + q, 17, dig4x8q);} if (m1 != lastm1){showDigit( m1 * 12 + q, 12, dig4x8q);} if (h0 != lasth0){showDigit( h0 * 12 + q, 5, dig4x8q);} if ((h1>0)&&(h1 != lasth1)){showDigit( h1 * 12 + q, 0, dig4x8q);} if (q > 5){setCol(10, 0x24);} // если вторая половина цикла, то рисуем точки // тут можно поиграться длительностью, изменяя значение, с которым сравнивается q refreshAll(); // обновляем экран после каждой строки delay(70); // задержка для плавного вывода цифр // величина задержки должна быть меньше 900мс / 12 циклов } lasth1 = h1; lasth0 = h0; lastm1 = m1; lastm0 = m0; lasts1 = s1; lasts0 = s0; // для того чтобы знать изменилась цифра или нет }
int flag = millis() % 1000; // счетчик будет считать до тысячи и все заново if ( flag > 500) { setCol(10, 0x24);} // если флаг больше 500, рисуем точки
if (s0 != lasts0){showDigit( s0 * 12 + shag, 28, dig3x7q);} // s0 * 12 + q - номер строки в масиве dig3x7q (смотрим вкладку "fonts.h") else showDigit(s0, 28, dig3x7s); // s0 - номер строки в масиве dig3x7s (смотрим вкладку "fonts.h")
if (s1 != lasts1) showDigit( s1 * 12 + shag, 24, dig3x7q); //24- позиция экрана с которой начинать печать else showDigit(s1, 24, dig3x7s); //24- позиция экрана с которой начинать печать
if (m0 != lastm0) showDigit( m0 * 12 + shag, 17, dig4x8q); // dig3x7q - указатель на масив данных (смотрим вкладку "fonts.h") else showDigit(m0, 17, dig4x8); // dig4x8 - указатель на масив данных (смотрим вкладку "fonts.h")
if (m1 != lastm1) showDigit( m1 * 12 + shag, 12, dig4x8q); // (m1 != lastm1)- проверяем изменилась цифра или нет else showDigit(m1, 12, dig4x8);
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения