Уроки Arduino #4 - функции времени
Ғылым және технология
В этом уроке мы с вами научимся пользоваться временнЫми функциями Arduino, или функциями времени. Это стандартные функции задержек delay() и delayMicroseconds(), а также встроенный таймер millis() и micros(). Рассмотрим особенности и примеры применения.
▼ Текстовая версия ▼
alexgyver.ru/lessons/time/
▼ Огромный стартовый набор GyverKIT ▼
kit.alexgyver.ru/
▼ Уроки Arduino на сайте ▼
alexgyver.ru/lessons/
▼ Модули и датчики с Али ▼
alexgyver.ru/arduino_shop/
▼ Страница "Заметок Ардуинщика" ▼
alexgyver.ru/arduino_lessons/
Теги: #arduino #уроки #ардуино #alexgyver
●●●●●●●●●●●●●●●●●●●●
► Основной канал: / alexgyvershow
► Поддержать автора alexgyver.ru/support_alex/
► Официальный сайт: alexgyver.ru/
► Почта: alex@alexgyver.ru
Пікірлер: 416
Хорошее видео. Замечу лишь, что кормить животных раз в 23 дня чересчур расточительно)
@anoname10
4 жыл бұрын
@Тарас Атавин Jl9 ну нах крокодила кормить
@yungfloppa
4 жыл бұрын
@Тарас Атавин Гениально)
2:17 Прошу заметить, что выражение: if(millis() - last_time > 5000){} Срабатывает на 1 миллисекунду позже указанного, поэтому правильнее ставить ">="
@user-gh8gw5nk9y
3 жыл бұрын
Мля , на миллисекунду полив позже сработал, цветы уже завяли)))
@x_mouzzer_x
3 жыл бұрын
дельное замечание, спасибо
@sashaca
3 жыл бұрын
После этой команды идёт код, который тоже занимает время, поэтому значение last_time будет кратно этому числу, таким образом погрешность может быть ещё больше
@yeru6427
3 жыл бұрын
Сколько миллисекунд ты писал этот коммент?)
@kfvchk
3 жыл бұрын
@@yeru6427 хороший вопрос)
смотрю по лайкам , все меньше и меньше людей доходят до следующих курсов , но у вас самое доходчивое и понятное обьяснение среди всех.. от души благодарю..вы лучший учитель
Качество уроков на высоте , приятно слушать и не засыпаешь , вот только без практики это всё забудется
очень хорошо объясняете! пишите примеры,хорошо подготавливаетесь,прям сразу хочется все это слушать! Все записываю в блокнот,от души спасибо! :)
Очень полезное видео! спасибо за труды!!!
Спс большое за уроки. Только побольше бы:) Самые понятные уроки из тех что я видел.
Круто! Самый лучший канал по ардуино
Спасибо большое . Я не программист но Ваш урок мне очень помог создать скетч для управления пиролизным котлом.
Спасибо вам за столь полезные видео!!!
Отлично ведешь уроки. Продолжай!!!!
побыстрее бы следующие видео, очень понравилось
Это великолепнейший цикл уроков. Теперь он всегда у меня в закладках. Все время чего нибудь да забуду. Спасибо тебе за все. А можно в тебя денюжкой что-ли кинуть, чтобы можно было с уверенностью ждать новых выпусков (на обоих каналах(но хотелось бы побольше обучалок по ардуино ))
Спасибо большое!!! Очень познавательное видео!
Спасибо большое за информацию. Практически все легко и приятно глазу. Я раньше только знал как папку создать а сейчас чуть больше чем ранее 🤗
КРУТО!!!!!!!!!!!!! Спасибо!!! И как всегда что то новенькое, там где казалось и так все понятно. У тебя талант всякие вкусности выдавать!!!
@user-jn3jw7ot5q
3 жыл бұрын
а в чём проблема молодой человек?
Хорошо бы рассказать про таймер, в видео показана циклическое выполнение действия. А хотелось бы послушать про таймер - запуск таймера по событию, событие по окончанию работы таймера.
@0neme760
4 жыл бұрын
Знаю, что поздновато, но почему нельзя просто взять и в цикле прописать изменения цифры по истечению одной секунды например? Типа: пока не нажали "стоп", будем считать количество секунд и выводить их на экран, а потом, если итоговое значение меньше ожидаемого - выведем надпись: "вы слишком жирный, кэп! Бегите быстрее" ^_^
@vladimirlee5928
3 жыл бұрын
@@0neme760 а каким способом вы хотите реализовать данный таймер: внутренним таймеров Atmega328 или же функцией Delay? Не забывайте, что и без вашего участия в микроконтроллере всегда отсчитываются такты, а оно же и время. Просто вы должны научиться использовать это.
@0neme760
3 жыл бұрын
@@vladimirlee5928 Это прекрасно! Приведите пример и мы все чему-то научимся. Лично я использовал таймер Атмега, ибо, как говорилось в видео, делэй тупит все выполнение программы, на самолетиках его использовать нельзя. Ну или на каком-нибудь самодельном ИВЛ )
@vladimirlee5928
3 жыл бұрын
@@0neme760 Погодите. Здесь нам нужно определиться. Вы используете голый процессор или ардуино? Из первого вашего комментария мне было не понятно. Поэтому я и говорю, что в Ардуино уже автоматически таймер настроен который считает время millis() и micros(), а в голом микроконтроллере таймеры нужно настраивать самостоятельно уже.
@0neme760
3 жыл бұрын
@@vladimirlee5928 с голыми контролерами я почти не работал. В данном случае ардуино
так просто и так гениально!! ты меня выручил)))
Классный ролик получился!
if (millis() - last_time > 5000) { // что-то сделать last_time = millis(); } На 51-ом дне работы программы, значение, возвращающее функцией millis() переполнится, last_time будет иметь значение "за 5 секунд до переполнения" и блок if выполнится один раз только через 50 дней, перезаписав last_time на значение чуть больше, и так по кругу. Т.к. в нашем случае значение разности не будет превышать 5000 мсек, то проблему можно решить взяв разность по модулю (функция labs() для типа long): if (labs(millis() - last_time) > 5000) {...} Но в таком случае будет ложное срабатывание при каждом переполнении. Лучше сделать так: unsigned long nextTime = 0; void loop() { if (nextTime
@alexandr_84
7 жыл бұрын
WakeUp4L1fe а вконце пример с переменной нексттайм, направление знака неравенства не перепутан?
@WakeUp4L1fe
7 жыл бұрын
Спасибо, поправил
@ArduNotes
7 жыл бұрын
+WakeUp4L1fe спасибо! Добавлю в методичку
@xumatyt
7 жыл бұрын
В таком случае, когда nextTime переполнится, условие if (nextTime
@alexandr_84
7 жыл бұрын
xumux тоже верно. может можно в таких случаях както перегрузить ардуину раз в 50дней? или использовать модуль, вроде одно ложное срабатывание, а не постоянное.
спс за видео Алекс👍🏻 как раз таки не понимал эти задержки. Доходчиво объяснил, успехов!!! Будет возможность сделай видос про многозадачность. Спасибо!)
Спасибо, жду видео с уходом дуины в спящий режим)
@serafimes
3 жыл бұрын
Дождался
Спасибо, мне очень нужно описание работы millis
Ура, новый выпуск!
2:50 Вот оно!!!! то, не зная чего я не смог перейти на ардуино с промышленных контроллеров! Теперь можно продолжить экезекуцию. Спасибо!
Алекс, у тебя получаются очень лаконичные уроки. Все четко и по делу: Круто! PS: по-моему round() лишний. Ты же целое число на целое делишь.
Спасибо за видео, оч помогло для моего проекта)
Спасибо за подсказку как сделать многозадачность.
2:50 не нужно ли переменной last_time присвоить изначально значение? так как при первом запуске if last_time будет использовать неизвестное значение из памяти предположительно 0 но все же. или я что-то не так понял?
Подскажите как через millis написать это: void setup() { pinMode(PIN 13, OUTPUT); } void loop() { digitalWrite(PIN 13, HIGH); delay(3000); digitalWrite(PIN 13, LOW); delay(1000); Я что то не пойму нифига(((
Если при компиляции скетча с последним примером вылетает ошибка: "invalid operands of types 'double' and 'int' to binary 'operator%" можно записать так: "if (int (round(millis() / 300)) % 2 == 0)" PS Огромное Спасибо за уроки!!!
Про кратность подумал когда поставил видосик на паузу и разбирал, а потом ты сам продемонстрировал этот вариант)
Спасибо за видос. Лайк!
Отлично. Спасибо.
Хороший видео урок! Возможно, для новичков, стоило указать, что если мы не присваиваем переменной число, то в ней, как правило, по умолчанию хранится 0. Таким образом last_time , в начале, хранит 0, а по достижении millis() 5000 перезаписывается на 5000 и т.д.
@ivan8140
Жыл бұрын
да, как раз на этом комментарии вопрос и отпал :)
@Mr.Drug.
Жыл бұрын
Мне пришло просто сто раз пересмотреть, и тупо догадаться и представить что именно так и должно быть. Ошибка всех обучалок, автор некоторые моменты умалчивает, забывает что люди не умеют читать мысли
@animecniks
5 ай бұрын
@@Mr.Drug. может он верил что Кто то смотрет все видео А в каком то с прошлых Он говорыл Что Переменая изначально 0 если ми ничего не указали.Хотя мог повторить мейби
познавательно спасибо, не знал такого
мне кажется последний однострочный вариант содержит несколько ошибок. 1. для приведение к секундам выполняется деление на 100 (хотя голосом все правильно сказал - делить надо на 1000). 2. из-за округления код срабатывает гораздо чаще чем нужно. например если millis() вернет 6405 или 6425 после округления получится одно и то же - в результате несколько запусков в одном интервале
@user-mq8tt4ny1u
6 жыл бұрын
все верно. Округляем при выводе на экран ) Serial.println(round(last_time / 1000));
@Perepodvyvert_s_perevorotom
2 жыл бұрын
@Тарас Атавин А по-русски: в реальном условии - не округляем.
@Perepodvyvert_s_perevorotom
2 жыл бұрын
Она и без округления лажает. Вредная штука, если бездумно использовать. Кусок вывода в терминал вот такого кода: void setup() { Serial.begin(9600); } void loop() { if ((millis()/1000) % 2 == 0) { Serial.println ("Sovpalo"); }else{ Serial.println ("Ne sovpalo"); } } ==========ВЫВОД В ТЕРМИНАЛ========== Ne sovpalo Ne sovpalo Ne sovpalo Ne sovpalo Ne sovpalo Sovpalo Sovpalo Sovpalo Sovpalo Sovpalo Sovpalo
@Perepodvyvert_s_perevorotom
2 жыл бұрын
@Тарас Атавин Если надо объяснять - то не надо объяснять.
@Perepodvyvert_s_perevorotom
2 жыл бұрын
@Тарас Атавин Вам ближе по-украински.
Спасибо тебе огромное! Очень полезные видео) Начав смотреть твой канал тоже решил себе заказать ардуино)) И организовать на нем кормилку для котов)
@user-oy1sq7mc4d
7 жыл бұрын
Сдохнет твой кот. Имхо в кормилку из холодильника кто то тоже должен класть еду. Можно конечно пойти дклее и автоматизировать процесс достования из холодильника. Затем создаётся робот который ходит в магаз и покупает жратву коту и кормит кота. есть шанс стать миллионером ))))))
@user-vz7dw9jr2m
7 жыл бұрын
Спасибо за дельный совет от водителя такси:) А делать выводы по одному предложению у Вас очень хорошо получается... Кто то сказал что она будет полностью автоматической? если бы я мог собрать такую хрень - то уже давно был бы миллионером, а пока просто стоит задача чтоб коты могли жрать днем пока дома никого нет.
спасибо большое очень помогло
Alex, подскажи а как с помощью "millis()" реализовать моргание надписи на дисплее с настраиваемыми временами. Например: 1 сек. индикации, 1 сек. паузы? Ну типа аналог стандартного блинка, только без использования "delay". Спасибо.
Доброго времени. Правильно ли я тогда понимаю, что для использование в слайдере для таймлапс, (это когда фотокамера установлена на слайдере и должны происходить два действия. Камера смещается на заданное расстояние, к примеру на один или два шага двигателя, останавливается, срабатывает затвор камеры. Камера вновь перемещается и так до края слайдера.) необходимо использовать millis()?
Спасибо, ты помог мне с пересчетом данных в лупе датчика INA226 через 1/3 сек. А то delay(300) тормозила всю общую прогу, даже часы и те останавливались на 1/3 сек. Теперь пересчет и отображение характеристик тока отображается, как и нужно для нормального восприятия, а не бегущие цифры после запятой. (моя паяльная станция) .
Полезно, спасиб
Ещё не посмотрел, а лайк поставил)
Эх, жаль нельзя сразу два лайка поставить :) То что нужно и как раз вовремя для моей программы :)
даешь урок о прерываниях!
Спасибо за видео и попутного ветра
с какого именно момента начинается работа счетчика? с первой строчки в void setup?
Расскажи как выводить информацию на сдвоенный (x3, x4 итд) семисегментный индикатор и чем отличается способ с одиночными индикаторами и сдвиговыми регистрами. И как на SD-флешке создавать файл с логами. Не обязательно в ближайшем видео, а вообще когда-нибудь
Привіт друже, ремарка long та int займать однакових 4 байта.А от long long 8 байт)Дякую тобі за твою титанічну роботу. Удачі:)
3:24 кормить кота раз в 21 день)))
@svetoch_4592
3 жыл бұрын
@Тарас Атавин Ебать! Я прозрел!
Ты так внятно объясняешь за 5 минут, не же ли нудные лекции училки 45мин.))))
А существуют ли переменные, для которых можно задать числовое значение, допусти kek== 1, kek ==2, для того, чтобы считать, например минуты
Сделай урок по прерываниям
Подскажите пожалуйста. Гавер в видосе объявил переменную last_time типа unsigned long, но не указал значение. Дальше ты вроде бы как не присваивал её значения. Как понять чему равна переменная last_time. 2:02
@slav93rus
5 жыл бұрын
Typical ,он не указал значение ,он просто объявил last_time как переменную(можно сказать равна нулю),Millis- время после включения ардуино.Теперь условие : когда время после включения - 0 станет > 5000, то выполняется условие и мы перезаписываем last_time ( last_time= Millis=5000)и когда получается что last_time=5000, то не выполняется условие и мы ждём когда пройдёт ещё 5секунд (тогда будет Millis будет равен 10000 и будет снова выполнятся условие)и так бесконечно и при этом остальной код тоже выполняется
Вот теперь точно понятно))) Хоть один человек смог нормально объяснить.
У последнего предложенного варианта с целочисленным делением минус в том, что если время срабатывания по каким-либо причинам пропустится (остальной код долго выполнялся, или в нем был delay()), то тело условия не сработает, что может вызвать ошибки. Первый вариант сработает и при опоздании.
По мере увеличения числа в миллис, контроллер не начинает тормозить?
@vladimirlee5928
3 жыл бұрын
нет. это отдельный блок в микроконтроллере.
Сделай видео о том как подключить камеру к ардуино
как поступить, если нам нужно, чтобы часть программы срабатывала раз в 5 сек? Ведь часть, которая ниже if(millis)...может выполняться больше 5 сек
спасибо alex. millis() работает. но как сделать чтоб задержка срабатывала в начале цикла loop() при включении микроконтроллера. по примеру сначала выполнение условия а потом идёт задержка то есть 1 пауза 1 пауза и т.д как сделать пауза 1 пауза 1 пауза 1 и т.д.. alex буду особенно признателен за ответ
Каков бы не был период срабатывания N (23 дня или 1 секунда), через 50 дней, когда millis() после обнуления, она уже никогда не будет больше last_time+N обнулять же last_time, когда millis() обнулится, тоже не очень, при большом N, получим 23, 46, 50, 73... дней. Не идеально, но на полтора века хватит unsigned long seconds=0; unsigned long lastTimeMillis=0; unsigned long lastTimeSeconds=0; void setup() { } void loop() { if(millis()-lastTimeMillis>=1000 || lastTimeMillis>millis()) { seconds++; lastTimeMillis=millis(); } if(seconds-lastTimeSeconds>=23){ lastTimeSeconds=seconds; // выполняем что хотели раз в 23 дня } }
не могу найти видео со спящим режимом. или такого выпуска еще не было?
Последний способ просто класс!! Блин лет 5 на си пишу - никогда подобную конструкцию не использовал. Мне стыдно...очень((
Алекс а могли бы Вы снять видио с разбором где в одном скейче выполняются две операции например открываем серво привод по температуре и закрываем соответсвено по ней, и также по времени к примеру два раза в день включалось рэле минут на 5-10 . и соотвествено я так понимаю тут уже нужны часы реального времени.
Алекс а в примере с "дебонсом" во втором if такую строчку " && millis() - last_press > 100 " тоже надо ?
@ArduNotes
7 жыл бұрын
нет, если кнопка отпущена, то она отпущена, дребезга при отпускании не будет
@TheVitall
7 жыл бұрын
совсем заработался я , этот вопрос задавал для 6 урока . Главное , что ты понял . Низкий поклон тебе за науку !
@clydewarrior2255
6 жыл бұрын
+Заметки Ардуинщика Ну не знаю, у меня кнопка при отпускании срабатывает
нужно видео про спячку ардуины!!!
Почему в последнем примере в связке if else отсутствуют фигурные скобки?
можно ли просить у вас совета по скетчам?
в место delaymicroseconds() лучше использовать delay_us() на малых значениях параметров, экспериментировал на своей ардуино мега 2560 + осциллограф : delaymicroseconds(1) дает задержку около 20 микросекунд насколько я помню, а вот delay_us(1) дает задержку в 5 микросекунд ровно, даже фронты более менее в норме.Главный цикл loop не использовал, просто дергал ногой в while цикле, так быстрее всего.
@ArduNotes
7 жыл бұрын
+Alexei Belousov спасибо, добавлю в пособие
@allthat7218
5 жыл бұрын
@@ArduNotes в PDF версии 1.1 (от 15.01.2019) нет ничего про delay_us - почему? не работает? забыли?
Для понимания почему нужно использовать именно unsigned long , полезно было бы объяснить, что происходит при переполнении переменной.
А если счётчик переполнится? И наш Last_time будет равен 4.294.966.000 допустим то код будет выглядеть так, millis опять стал 0 и будет (0 - last_time(4.294.966.000) > 1000) , так получается что условие больше не выполнится или будет выполнять я раз в 50 суток? И надо будет перезапускать МК? Или как это работает?
Здравствуйте. Почему функции round нет в справочниках по ардуино ?
Подскажите, пожалуйста, а как сделать, если мне надо чтобы светодиод загорелся на 5 секунд только, а не по циклу? Т.е. взяли с какого-то датчика данные и если какое-то условие сработало, то мне надо чтоб светодиод загорелся только на 5 секунд? Спасибо.
А можно к фукции millis присвоить своё значение? Иногда нужно ускорить или пропустить счет millis.
@user-mn1yf2td4y
Жыл бұрын
Можно! Где-то видел, не могу найти! Можно в библиотеке гайвера про энергосбережение и сон покапаться, там есть корректировка миллис. Но тебе то это зачем ?
как сделать таймер на миллис что бы несколько светодиодов мигали каждый по своему времени ? покажите нужно для программы у меня там будет порядка 15 -20 задержек на миллс
Привет всем, скажите пожалуйста кто нибудь, как реализовать мою простую задачу. Мне нужно чтоб после нажатия на кнопку и удержании её, на каком-то цифровом Пине появился HIGH потенциал но с задержкой в секунду. Но только при нажатой кнопке.
Алекс Гайвер, скажите, почему в этой от конструкции (в низу) "kek" срабатывает через каждые 5 секунд, а не 6, при знаке >, а не >=. Если, к примеру, мы от (time=5 сек отнимем last_time=0 сек) мы запишем в last_time 5 сек, мы получим строго равно 5 сек, так само как и при (time=10 сек - last_time=5 сек.) Мы получим строго равно 5 сек. и высветиться "kek", ПОЧЕМУ? Есть должно пройти не 5 сек, а 6 сек.(как в самом начале на одну секунду больше), что бы было БОЛЬШЕ знака СТРОГО РАВНО? То есть (time=11 сек - last_time=5 сек.) мы получим ИМЕННО > 5000, а не >=. Как это объяснить? if (millis() - last_time >= 5000){ last_time = millis(); Serial.println("kek");
3:05 Мне эта конструкция показалась немного замудреной. Не проще ли было бы использовать деление с остатком? if((millis() % 5000) == 0){ // код для выполнени } так ненужно было бы каждый раз переменную переписывать, да и переменная вообще не нужна. Или % для Ардуино очень напряжен? (в плане ресурсов: такты, байты).
@horart9447
4 жыл бұрын
А разве millis это не число с плавающей точкой?
@no_name_user5458
3 жыл бұрын
В таком случае ,если выполняется какая то полезная работа параллельно , то будут теряться миллисекунды и без остатка поделить не получится, пока делал проект , полностью это осознал.
Может кому то пригодится, скетч посылает значения в монитор порта от 160 до 0 по убыванию,а потом от 0 до 160 по возрастанию,можно применить для плавного движения серво привода,без delay() и for . byte q[2] = {255,0}; void setup() { Serial.begin(9600); } void loop() { int down = q[0]--; int up = q[1]++; down = map(down,255,0,320,0); up = map(up,0,255,0,320); if(down>160) Serial.println(up); if(down
"переполнение millis" - это значит он в итоге остановится или в 0 уйдет? его перезапустить можно без рестарта?
@ArduNotes
4 жыл бұрын
Уйдет в 0, но конструкция с таймером продолжит отрабатывать интервалы. Максимально подробно написано тут alexgyver.ru/lessons/time/
@Qapernik
4 жыл бұрын
@@ArduNotes благодарствую
А можно с помощью millis мигалку сделать?
со скетчем не поможете ? что бы серво Tower Pro 9g SG90 в 21.00 поворачивался на 180 ,а в 6.00 возвращался обратно. в наличии ( 1.Сервопривод Tower Pro 9g SG90 2.encoder 3.Дисплей 1602 с модулем I2c 4.Arduino nano 3.0 с Atmega 328p 5.Плата AT24C256 память 6.часы DS 3231).
А этот код по идее корректно работать будет около 50 суток ведь так? По идее надо еще проверку поставит что millis()- last_time>0
@user-bk9bj8hf5j
4 жыл бұрын
Нет. Проверка "millis()- last_time>0" лишняя - уже ж есть проверка "millis() - last_time > 5000" которая полностью её замещает. Другими словами если какое-то число больше 5000, то оно и подавно будет больше 0.
@user-eu8kn6to2m
4 жыл бұрын
@@user-bk9bj8hf5j привет
@user-bk9bj8hf5j
4 жыл бұрын
@@user-eu8kn6to2m Привет! :)
@user-eu8kn6to2m
4 жыл бұрын
@@user-bk9bj8hf5j хочу сделать измеритель потребления на счетчик на Ардуино. Там лампочка моргает, и каждые 3200 раз проходит 1квт/ч. И, измеряя, время между моргания и светодиода можно определять текущую подключенную нагрузку. фоторезистор будет и через транзистор логика. Думаю хватит скорости. Там светодиод 0.1с это 11квт, такой нагрузки не будет наверно, максимум 5 кат т.е. 0,5 с. На прерываниями делать, если то как измерить время между прерываниями? Как идея?
@user-bk9bj8hf5j
4 жыл бұрын
@@halyapin Нет. И тип переменной "last_time" и тип возвращаемого функцией "mills()" - "unsigned long" (беззнаковое целое), поэтому результат вычитания тоже будет типа "unsigned long", а число этого типа не может быть отрицательным *никогда*.
Как посчитать сколько миллисекунд нажата кнопка на ардуино с помощью таймера?
С 23 сутками не будет работать правильно... Сработает условие на 23й день, потом на 46й, а потом через 4 дня (на 50е сутки) сбросится миллис и пройдёт ещё 23 суток до условия, и того 27 дней до выполнения условия.
@yungfloppa
4 жыл бұрын
А что если добавить проверку переполнения переменной и в случае такового события присваивать переменной значение равное пройденным 4 дням?
@user-mn1yf2td4y
2 жыл бұрын
Нет, все правильно будет работать. Там другая математика, отрицательных чисел нет, смотрите урок "математические операции". Числа идут по кругу, почти как на циферблате часов. Если считать в днях, то после 50 идёт 0, и наоборот перед 0 будет 50. То есть 0-1=50! 0-2=49,...0-46=5! А 18-46=23>=23 условие выполнилось на 18 день после перехода через 0. То есть через 23 дня! Только считать надо в миллисекундах
а как сделать допустим я подаю на один пин логическую 1 а на выходе мне надо что бы выходила логиеская еденица и длилась она 4 секунды!!!
Подскажите а что делать с переменной "last_time" когда "millins" обнулится? Прописать еще одну проверку и если "millins" = 0, то обнулять и last_time? Или проверять разность? если разность меньше 0, то last_time = 0?
@user-mn1yf2td4y
2 жыл бұрын
Ничего не делать. Здесь нет отрицательных чисел, числа идут по кругу, то есть перед числом 0 стоит не - 1, а 4294967295. Значит 0 минус 1 будет равно 4294967295, а 0-4294967295==1, также как 0-4294962296==5000. То есть таймер не собьётся!
@user-ng1sd5kj5p
2 жыл бұрын
@@user-mn1yf2td4y Спасибо за разьяснение.
Компилятор IDE 1,8,8 ругается на оператор умножения. Как исправить?
не могу понять как работает переменная в круглых скобках unsigned long в операторе if (millis() - last_time > (unsigned long)23 * 24 *60 *69 100 ) для чего она там нужна ??
на millis() -ах луче код работает т.к. когда я взял на % ардуина как бешеная просчитывает, на примере вкл. выкл. светодиода она истерично промигивалась пропускала / глючила ( ну код постоянно ломился через условие == 0 , а когда millis() и знак > но верняк всё чётко стабильно , спс . И го побольше простых гайдов без библиотек , по возможности , что бы можно было понять суть кода? я пытался изложить мысль как смог. Как по датчику ардуину будить, и по этому же дачику ( света) ложить спать ?
Очень бы хотелось увидеть урок 4.1 "борьба с переполнением переменной / обновлением millis"...
@ArduNotes
7 жыл бұрын
+Вячеслав Бард в пособии в пдф все написано
@Werbard
7 жыл бұрын
Пошел изучать. Спасибо!
@Werbard
7 жыл бұрын
Проштудировал, но там не нашел универсального решения. Там ведь все то, что было здесь в комментариях. Оба варианта не предусматривают ситуацию, когда отсчет начался перед самым достижением предельного значения (допустим за 5 секунд до обнуления millis), а отсчитать должен ровно 60 секунд. Один вариант подгонит переменную к 0 и сработает раньше времени, другой прибавит слишком много и не будет достигнут ни когда. Вариант только писать еще более изощренную логику с прибавлением времени и проверкой на переполнение, если проверка не пройдена - менять... Что-то вроде: if((nextTime 4294967295){ nextTime = nextTime-4294967295; } } Но эта конструкция может дать сбои, если nextTime будет равен 4294967295 или на пару милисекунд меньше. Тогда контроллер пропустит срабатывание...
@yungfloppa
4 жыл бұрын
@@Werbard Нашли способ решения проблемы? :)
@Werbard
4 жыл бұрын
@@yungfloppa при переполнении переменная переходит через ноль. Вариантов два. Если не критично - забить, будет просто двойное срабатывание. Если критично - проверять после присвоения значения и делать соответствующие поправки.
а как будет работать выражение millis() - last_time > 23*24*60*60*1000 после переполнения long? если last_time - 4 100 000 000, а millis() на 51й день возвращает например 100 000 то: 100000 - 4100000000 > 23*24*60*60*100 == -4 099 900 000 > 1 987 200 000 условие не выполнится или тут что-то работает по другому?
@ArduNotes
3 жыл бұрын
Произойдет переполнение переменной и все будет нормально
конструкция мне пригодилась if (millis() - last_time > 1000) { last_time = millis(); //что делать); Спасибо!
@YeahMadeit_17
2 жыл бұрын
А зачем перед last_time ставить "-" ? Автор не объяснил
я правильно понял, что по умолчанию переменной last_time присваивается значение 0 ? а то, что-то как-то непонятно :(
@Helg1002
4 жыл бұрын
да да ... сам спросил, сам ответил - да 0
@yungfloppa
4 жыл бұрын
@@Helg1002 Хорош)))
В самом конце видео показан код(с lolo 1 и lolo2), где программа проверяет кратность числа - 2, немогу понять почему он работает, если после оператора if нет фигурных скобок - {}, может кто-нибудь объяснить?
@micromaster4405
Ай бұрын
Зачем фигурные скобки, если там после if только один оператор?
при первом заходе в if не понятно чему будет равен last_time. его нужно где-то определить
@user-ue7kz4lq3k
5 жыл бұрын
он при объявлении автоматически инициализируется нулём
не понял одно сегодня Использовал этот участок кода.. поставил для датчиков температуры и атмосферного давления. через каждые 10 минут .. Что будет при переполнении счетчика millis
@ArduNotes
3 жыл бұрын
Ничего
У меня Arduino IDE выдаёт ошибку в этом скетче с функцией millis. Подскажите плз ламеру что за херня. Expected initializer before 'void'
@WereFly100
5 жыл бұрын
Скорее всего вы что-то объявили вне функции.., то, что можно объявлять только внутри функции...
Чего? Delay это задержка, а Millis() - last_Tim... переодическое выполнение кода. Это разные действия, т. е delay этими millis не заменешь. И в таком случае эти милис тоже не лучший выбор,потому что перед ней может идти функция которая выполняется 20 минут и тогда только после этих 20 минут выполнится условие,есть шанс что период будет больше 5 секунд . Правильно, это прерывания от таймера получать и результат 100%