нашел на просторах интернета простые в изготовлении (ни каких плат рисовать-травить не надо, собирается из готовых плат проводками за 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]Можно, но следует учесть, что она в каждом случае будет возвращать новое значение. И зачем Вам это? Сделайте просто, без всяких извращений над кодом, например, так:
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; // для того чтобы знать изменилась цифра или нет
}