Помогите разобраться с библиотекой iarduino_rtc
- Войдите на сайт для отправки комментариев
Ну точнее там в принципе все понятно. Вот только почему-то функция blinktime() у меня не работает. Экран есть и стандартный 2х16 ардуиновский с I2C, и экранчик TFT от телефона Alcatel. Программа для обычных часов лежит на многих сайтах и там в момент установки времени должен мигать выбранный параметр (секунды, минуты, часы или там что другое). Так вот сами часы работают. Правда повозицца немного с кварцем пришлось. У меня была микросхемка ds1307, купил кварц в Чип и Дип, собрал на макетке - не работает. Повозился, в итоге нашел на старом медиацентре часовой кварт, впаял и все заработало. Так вот часы работают, но при установке не мигает устанавливаемы параметр.
Кроме часов есть два будильника, которые тоже должны мигать при установке, и мигают просто по millis(). Так вот они тоже мигают скажем 2 раза мигнет раз в секунду, потом 2 раза не мигает. Это скажем часы. А минуты могут наоборот не горят вообще несколько секунл, потом 2 раза мигнут и снова не горят. Или вообще просто не горят. Код щаас приложу. Очищу от мусора и приложу. Всякие Delay вроде убраны отовсюду.
Лучший способ разобраться с этой библиотекой - забыть о её существовании, и взять нормальную.
Хотя, у Вас проблемы не с ней, а с Вашим кодом.
Xomyc - по-моему вы второй или даже третий раз спрашиваете про этот блинк. Если он вам так нужен - так напишите его сами, в конце концов это же не функция RTC. а только вывод на экран
Вообще-то это функция RTC. Ну если говорить о blinktime().
А для мигания при установке будильника я свою процедуру написал. Так вот там мигает тоже не ставильно. В первом посте я описал в чем проблема. Но blinktime() вообще не мигает.
Вот уже на втором форуме мне пишут возьмите другую библиотеку для часов, мол эта фигня, но никто не называет другую библиотеку, в которой есть функция мигания.
Щас дочищу код и выложу. К компу дома подойти не могу никак.
Щас дочищу код и выложу.
не надо код чистить, выкладывайте как есть. А то мы опять будем обсуждать "идеальный" код, а потом окажется что на реальном все работает совсем не так.
Или, по крайней мере. перед выкладываием "очищенного" кода протестируйте его на железе и опишите только те глюки. которые наблюдаются именно на этом коде.
Вас не смущает, что RTC и мигание это совершенно разные области приложения знаний? Одна часы реального времени - должна давать правильное время , другая интерфейсы - красиво показывать на экране то что Вам хочется. Как они могут быть связаны прямо не понятно. Мигание к реальному времени ни как не относится. Исключительно к относительному, т.к. от реального времени ни как не зависит. И в 12 и 24 часа мигать будет одинаково. И даже без RTC, а, например, при вводе количества бутылок пива в заказе мигать тоже должно также как и при установке времени будильника? Может быть не скрещевать ужа и ежа а написать отдельную универсальную библиотеку меню с вводом чисел в мигающую позицию? Тем более, что у LCD1602 и похожих есть команда курсор - в библиотеке LiquidCrystal blink(); cursor();setCursor(col,row); и прочие.
Щас дочищу код и выложу.
не надо код чистить, выкладывайте как есть. А то мы опять будем обсуждать "идеальный" код, а потом окажется что на реальном все работает совсем не так.
Или, по крайней мере. перед выкладываием "очищенного" кода протестируйте его на железе и опишите только те глюки. которые наблюдаются именно на этом коде.
Да там закомментированного больше раза в 3 чем кода. Работает то незакомментированный код! Да и к компу пока подойти не могу.
Тем более, что у LCD1602 и похожих есть команда курсор - в библиотеке LiquidCrystal blink(); cursor();setCursor(col,row); и прочие.
Я уже убрал этот дисплей. Думал дело в нем и большой он. Поставил TFT с кноаочного алкателя 128х128.
Вот код. Убрал только закомментированные строки.
тут одна из проблем
050
if
(millis()%1000==0){
// если прошла 1 секунда
у тебя в лупе стока науеверчено, что == 0 может быть только случайно.
А так, весь код -> фпамойку();
Ну за меня все равно никто не напишет.
А чего там в лупе науеверчено?
Задаем шрифт дисплея, выводим 4 строки на экран и отрабатываем будильник. Все.
А какие-нибудь конкретные предложения есть? То что науеверчено я и сам понимаю. Все что кассается часов содран в инете. При чем этот код в инете очень много где лежит.
050
if
(millis()%1000==0){
// если прошла 1 секунда
Не моя строка, но она ведь работает. Честно говоря особо о ней не задумывался. Так понимаю ее вообще можно убрать.
А какие-нибудь конкретные предложения есть? То что науеверчено я и сам понимаю. Все что кассается часов содран в инете. При чем этот код в инете очень много где лежит.
050
if
(millis()%1000==0){
// если прошла 1 секунда
Не моя строка, но она ведь работает. Честно говоря особо о ней не задумывался. Так понимаю ее вообще можно убрать.
то есть вы в этом коде вообще нифига не понимаете? - то что написал Дед и есть самое что ни на есть конкретное предложение - исправьте эту строчку - шанс, что именно она портит мигание цифр на экране - процентов этак 80
Так я и спросил что исправить?
Как я понимаю эту строчку.
Если целое значение от деления millis() на 1000 равно 0, код работает. Т.е. он срабатывает только каждую целую секунду.
Попробую убрать эту строчку. Честно написал выше, что не задумывался о ней, т.к. брал готовый код из инета.
Попробую убрать эту строчку.
"заставь дурака ..."
Не надо убирать. Идея исполнять код раз в секунду - абсолютно верная. Другой вопрос, что строка эта задачу решает плохо. Попробуйте задуматься, будет ли она работать, если это условие проверяется реже, чем раз в 1 мс?
Ну как поймете, в чем проблема - попробуйте исправить
Я когда то так делал:
Попробуйте задуматься, будет ли она работать, если это условие проверяется реже, чем раз в 1 мс?
Ну как поймете, в чем проблема - попробуйте исправить
А почему она выполняется реже, чем раз в 1мс? Я прошу прощения, я совсем начинающий программист так сказать, и в теории вроде как loop как раз каждую 1 мс отрабатывает? Ну если нет всяких дилеев. А их нет.
Или я что-то не то говорю?
А вы на практике проверьте скоко луп выполняется.
А почему она выполняется реже, чем раз в 1мс? Я прошу прощения, я совсем начинающий программист так сказать, и в теории вроде как loop как раз каждую 1 мс отрабатывает? Ну если нет всяких дилеев. А их нет.
Откуда вы взяли эту "теорию" про выполнение ЛУП раз в 1мс - я не знаю. но ничего общего с правдой она не имеет. Луп выполняется так часто, как успевает. Совсем пустой ЛУП выполняется сотни тысяч раз в секунду, а по мере его заполнения все медленее и медленее. Например вывод всего одного символа в Сериал на "дефолтной скорости" 9600 как раз примерно занимает 1мс. Соответственно вот такой loop:
уже будет оборачиватся не быстрее 5-7мс. а это всего одна строчка!
А теперь сравните со своим кодом. Там и куча вычислений, и работа с часами. и . главное - вывод на ТФТ экран... Все это время и время.
Ну хорошо. Я же не спорю. Я говорю, что не знаю. Подскажите как реализовать, чтобы точно раз в секунду выполнялся.
Ну разве что:
Больше ничего в голову не приходит.
Подскажите как реализовать, чтобы точно раз в секунду выполнялся.
Ну разве что:
Больше ничего в голову не приходит.
это совсем неработоспособный код. И кроме того, он ничем не отличается от millis%1000
А зачем вам "точно"? - какая разница, покажете вы на часах время через 1000 мс или через 1002 мс? - вы сможете заметить разницу?
А точность самих часов не пострадает, вы же время с RTC берете, значит точность времени с точностью обновления нэкрана не связано никак
Да мне не важно! Никто просто не говорит как это сделать! Подскажите код как это сделать. У меня личного опыта в написании кодов для микроконтроллеров с гулькин фиг. Я занимался много программированием, но на Delphi, на Java, на PowerShell в конце концов. Там таких задач нет, как рассчет секунд, вот я и не знаю что делать.
Да мне не важно! Никто просто не говорит как это сделать! Подскажите код как это сделать.
ах еще и не важно? - "не знаю и знать не хочу, дайте готовое решение!" - в таком ключе продолжать неинтересно
А зачем вам "точно"? - какая разница, покажете вы на часах время через 1000 мс или через 1002 мс? - вы сможете заметить разницу?
ВОт я и говорю, что мне не важно.
Да мне не важно! Никто просто не говорит как это сделать! Подскажите код как это сделать.
ах еще и не важно? - "не знаю и знать не хочу, дайте готовое решение!" - в таком ключе продолжать неинтересно
Вы коверкаете мои слова не вчитавшись в них.
Это что вирус влияет! Все такие заведенные! Одно слово из текста схватил и давай ругацца!
Хотус, не надо ловить точно (==) момент - это ненадёжно, определяйте, что лимит перебран (>=)
Хотус, не надо ловить точно (==) момент - это ненадёжно, определяйте, что лимит перебран (>=)
Вот спасибо! Идею понял! Ну вот так:
Но правда это никак не влияет.
Но правда это никак не влияет.
Да счас - а вот так:
millis же возвращает unsigned long а не unsigned int
так низзя. Этот макрос чуть сложнее пишется.
При таком написании, у Вас этот макрос только раз в пределах функции/блока использовать можно, второе использование даст повторное объявление переменных tmr и flag.
Да, но там разве нужно использовать его больше одного раза в loop?
так низзя. Этот макрос чуть сложнее пишется.
Как?
Не, ну я ж проблему описал - она то понятна, так ведь? А как писать - думаю Вы и сами разберётесь. Ну, или посмотрите, например, макрос ATOMIC_BLOCK в файле C:\Arduino\arduino-1.8.12\hardware\tools\avr\avr\include\util\atomic.h, там вроде эта проблема решена.
Да, но там разве нужно использовать его больше одного раза в loop?
А почему нет? Если мы двумя "светодиодами мигаем" с разными интервалами? Мало ли подобных процессов? Раз в секунду освещённость замерить, раз в минуту температуру - и что, специально ради Вашего макроса функции создавать? Зачем, когда его можно просто нормально написать?
Да, но там разве нужно использовать его больше одного раза в loop?
А почему нет? Если мы двумя "светодиодами мигаем" с разными интервалами? Мало ли подобных процессов? Раз в секунду освещённость замерить, раз в минуту температуру - и что, специально ради Вашего макроса функции создавать? Зачем, когда его можно просто нормально написать?
Да, я понимаю что можно лучше его написать, а так он подходит только если в этом блоке не нужно больше 1 интервала.
А если нужно больше то уже использовать обычный таймер.
ну или в крайнем случае можно в разные блоки засунуть))
Так как то
А так?
Проблему с миганием вроде решил. Ну конечно не так сложно как тут описывается, но работает. Написал свою мигалку для часов.
Осталась маленька проблеммка с OneButton.h.
Вроде я поставил удержание 2000, а нажатие 200. Что-то очень долго приходится держать удержание, секунд 5, и при двойном клике иногда обычный клик срабатывает.
А так?
Я в программирование не настолько силён.
Можете хоть чуть чуть пояснить что здесь происходит?
Осталась маленька проблеммка с OneButton.h.
Вроде я поставил удержание 2000, а нажатие 200. Что-то очень долго приходится держать удержание, секунд 5, и при двойном клике иногда обычный клик срабатывает.
Попробуйте библиотеку gyverButton, удобная, и без косяков(вроде бы)!
Чем твоя "своя мигалка для часов", отличается от той что я тут запостил ?
Названием переменных ?
Ты не ученик гивера часом ?
У того тоже все "свое" с гитхаба надергано.
Попробуйте библиотеку gyverButton, удобная, и без косяков(вроде бы)!
С нее и начал вчера. Весь день с ней провозился, так она и не заработала. Даже обычное нажатие только к вечеру запустил.
Это вы к кому обращаетесь?
Это вы к кому обращаетесь?
К ТС'у
Нет, Гайвера я конечно знаю, много чего у него по первости содрал. Гирлянду на елку, лампу рассвет с эффектами. Но мигалку для часов только что сам написал.
А с гитхаба почему не брать, если все ссылки на библиотеки туда идут?
В общем вроде и кнопки добил. Теперь нормально. Поставил клик 400 и удержание 1000.
Так как то
Не, ну это не спортивно! Давайте одним макросом! Это же гораздо интереснее!
А так?
Я в программирование не настолько силён.
Можете хоть чуть чуть пояснить что здесь происходит?
Тоже присоединюсь к вопросу. Что за конструкция
Это что бы использовать где не попадя и ниочём не думать.)
Нет, Гайвера я конечно знаю, много чего у него по первости содрал. Гирлянду на елку, лампу рассвет с эффектами. Но мигалку для часов только что сам написал.
А с гитхаба почему не брать, если все ссылки на библиотеки туда идут?
В общем вроде и кнопки добил. Теперь нормально. Поставил клик 400 и удержание 1000.
Ну я и говорю "сам".
Мало ли, что тебе тут писали:
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/pomogite-razob...
Нет, Гайвера я конечно знаю, много чего у него по первости содрал. Гирлянду на елку, лампу рассвет с эффектами. Но мигалку для часов только что сам написал.
А с гитхаба почему не брать, если все ссылки на библиотеки туда идут?
В общем вроде и кнопки добил. Теперь нормально. Поставил клик 400 и удержание 1000.
Не совсем понял на что ссылка! На эту же тему? В кодах там вроде ничего похожего на то что я написал нет. Ну кроме того, что то высвечивается скажем минута, то нет. Но это по умолчанию понятно. Просто если есть готовая функция, зачем самому писать? А если не нарвался хотя бы раз, то как знать будешь, что она не работает?