нашел на просторах интернета простые в изготовлении (ни каких плат рисовать-травить не надо, собирается из готовых плат проводками за 10 мин) , но интересные по функционалу часы http://forum.amperka.ru/threads/%D0%A7% ... %BA.12793/ немного переделал для себя . получилось хорошо в часах три шрифта музыкальные будильники термометр поздравительные плюшки .... был приемник, но я его за ненадобностью вырезал автор часов потрудился хорошо над ними...
Хоть на лоб . Неважно главное даже плату травить не надо
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Пн фев 10, 2020 15:58:02
AndyGU70
печалька - под ESP12 компилиться не хочет(с прерываниями лажа какая то)..
Вопрос сэнсэям Ардуины - сложно ли програмно, вывод индикации сделать не в i2c а в UART ? (а то что то эта матрица внешне прямо не "фонтан", а в наличии есть с UART посимпатичнее)
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3788535#p3788535"]Хоть на лоб . Неважно главное даже плату травить не надо[/uquote] На лоб возможно пойдёт, а в АвтоМотоВело не пойдёт. Плата на проволочках, на механических контактах долго не проживёт. Только плата вытравленная, спаяная, и покрытая лаком
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Вт фев 11, 2020 16:25:03
Serzh2000
Плата на проволочках, на механических контактах долго не проживёт.
кто мешает припаять проводочки? и окунуть в лак?
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Чт фев 13, 2020 21:08:43
Serzh2000
урезанный вариант для отладки эффекта
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Сб фев 15, 2020 11:27:44
Serzh2000
обалденно цифры рисуются теперь это надо облагородить
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Чт фев 20, 2020 19:31:20
Serzh2000
вот сделал отрисовку цифр. получилось как хотел. не получается мигать точками (точнее очень быстро мигают) может кто поможет ?
и вопрос: поставил в часах на 190 строчке delay(30); в интернете пишут delay это плохо. тады как?
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Пт фев 21, 2020 08:34:01
Improver
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3794097#p3794097"]и вопрос: поставил в часах на 190 строчке delay(30); в интернете пишут delay это плохо. тады как? [/uquote]Это нормально. Заменить его можно пустым циклом, но зачем? Там только я бы сделал немного другой порядок строк:
Т.е. сначала обновить, потом подождать, а потом очистить и повторять вывод.
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3794097#p3794097"]не получается мигать точками (точнее очень быстро мигают) может кто поможет ? [/uquote]Может увеличить задержку в delay с 30 мс до ~500? В сам код не вникал глубоко, может и ошибаюсь...
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Пт фев 21, 2020 09:11:50
Serzh2000
Т.е. сначала обновить, потом подождать, а потом очистить и повторять вывод.
спасибо, исправлю
Может увеличить задержку в delay с 30 мс до ~500? В сам код не вникал глубоко, может и ошибаюсь...
в delay вся и загвоздка, можно и без него, но тогда очень быстро отрисовываются цифры методом подбора получил (зо милсек ) чуть быстрее секунды а если delay(500) будут не только точки мигать медленно но и отрисовка цифр ....
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Вт фев 25, 2020 21:31:30
Serzh2000
я здаюсь... куда эту ... millis() поставить чтобы цифра отрисовывалась за 0,9 милсек помогите, пожалуйста.
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Чт фев 27, 2020 16:15:10
Improver
"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 цифра рисуется вся сразу.
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Пт фев 28, 2020 10:46:18
Improver
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3797997#p3797997"]во. сточкой получилось!!! [/uquote] В таком виде нормально, теперь можно вернуть delay в цикл для плавного вывода изменившихся цифр, только задержка там должна быть не больше 500мс / 12, иначе точки не будут мигать...
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3797997#p3797997"](с эффектом которым борюсь, чтобы цифра отрисовывалась за 0,9 милсек)[/uquote]Может за 0,9 сек?
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Пт фев 28, 2020 18:00:19
Serzh2000
В таком виде нормально, теперь можно вернуть delay
честно говоря не совсем понял , что написал на 182 стр. ( if (millis() % 2==0)q++) но стали цифры отрисовываться с задержкой, если поставить например 10 то очень медленно, а на точку это не влияет! может кто пояснит? желательно по "слогам"
Serzh2000 писал(а): (с эффектом которым борюсь, чтобы цифра отрисовывалась за 0,9 милсек) Может за 0,9 сек?
да вы правы, ошибся...
можно ли в оной void { millis()%15000 что то делаем millis()%2==0 что то делаем millis()%200>10 что то делаем } использовать несколько раз функцию millis()?
Re: часы ардуино ds3231 max7219 ds18b20
Добавлено: Пн мар 02, 2020 09:18:26
Improver
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3798474#p3798474"]честно говоря не совсем понял , что написал на 182 стр. ( if (millis() % 2==0)q++) но стали цифры отрисовываться с задержкой, если поставить например 10 то очень медленно, а на точку это не влияет! может кто пояснит? желательно по "слогам"[/uquote]Тогда, когда количество милисекунд после старта будет чётным (в 50% случаев), один шаг в цикле пропускается. Вы, извиняюсь, пишите скетч по методу вставки случайных команд в случайные места?
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3798474#p3798474"]можно ли в оной void { millis()%15000 что то делаем millis()%2==0 что то делаем millis()%200>10 что то делаем } использовать несколько раз функцию millis()?[/uquote]Можно, но следует учесть, что она в каждом случае будет возвращать новое значение. И зачем Вам это? Сделайте просто, без всяких извращений над кодом, например, так:
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);