Уроки 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

  • @pilipshanov2011
    @pilipshanov20115 жыл бұрын

    Хорошее видео. Замечу лишь, что кормить животных раз в 23 дня чересчур расточительно)

  • @anoname10

    @anoname10

    4 жыл бұрын

    @Тарас Атавин Jl9 ну нах крокодила кормить

  • @yungfloppa

    @yungfloppa

    4 жыл бұрын

    @Тарас Атавин Гениально)

  • @clydewarrior2255
    @clydewarrior22554 жыл бұрын

    2:17 Прошу заметить, что выражение: if(millis() - last_time > 5000){} Срабатывает на 1 миллисекунду позже указанного, поэтому правильнее ставить ">="

  • @user-gh8gw5nk9y

    @user-gh8gw5nk9y

    3 жыл бұрын

    Мля , на миллисекунду полив позже сработал, цветы уже завяли)))

  • @x_mouzzer_x

    @x_mouzzer_x

    3 жыл бұрын

    дельное замечание, спасибо

  • @sashaca

    @sashaca

    3 жыл бұрын

    После этой команды идёт код, который тоже занимает время, поэтому значение last_time будет кратно этому числу, таким образом погрешность может быть ещё больше

  • @yeru6427

    @yeru6427

    3 жыл бұрын

    Сколько миллисекунд ты писал этот коммент?)

  • @kfvchk

    @kfvchk

    3 жыл бұрын

    @@yeru6427 хороший вопрос)

  • @sergeyv7342
    @sergeyv73422 жыл бұрын

    смотрю по лайкам , все меньше и меньше людей доходят до следующих курсов , но у вас самое доходчивое и понятное обьяснение среди всех.. от души благодарю..вы лучший учитель

  • @habihabi2003
    @habihabi20032 жыл бұрын

    Качество уроков на высоте , приятно слушать и не засыпаешь , вот только без практики это всё забудется

  • @cycle6023
    @cycle6023 Жыл бұрын

    очень хорошо объясняете! пишите примеры,хорошо подготавливаетесь,прям сразу хочется все это слушать! Все записываю в блокнот,от души спасибо! :)

  • @TheFenix717
    @TheFenix7177 жыл бұрын

    Очень полезное видео! спасибо за труды!!!

  • @user-xk9dk3gh4j
    @user-xk9dk3gh4j7 жыл бұрын

    Спс большое за уроки. Только побольше бы:) Самые понятные уроки из тех что я видел.

  • @Yupitrer
    @Yupitrer7 жыл бұрын

    Круто! Самый лучший канал по ардуино

  • @user-yz3us4qu2u
    @user-yz3us4qu2u7 жыл бұрын

    Спасибо большое . Я не программист но Ваш урок мне очень помог создать скетч для управления пиролизным котлом.

  • @user-mv7ee7bu8h
    @user-mv7ee7bu8h2 жыл бұрын

    Спасибо вам за столь полезные видео!!!

  • @beka6336
    @beka63367 жыл бұрын

    Отлично ведешь уроки. Продолжай!!!!

  • @florinturcanu7109
    @florinturcanu71097 жыл бұрын

    побыстрее бы следующие видео, очень понравилось

  • @unitycreate5269
    @unitycreate52696 жыл бұрын

    Это великолепнейший цикл уроков. Теперь он всегда у меня в закладках. Все время чего нибудь да забуду. Спасибо тебе за все. А можно в тебя денюжкой что-ли кинуть, чтобы можно было с уверенностью ждать новых выпусков (на обоих каналах(но хотелось бы побольше обучалок по ардуино ))

  • @romaibragimov9872
    @romaibragimov98725 жыл бұрын

    Спасибо большое!!! Очень познавательное видео!

  • @Scallori_17
    @Scallori_17 Жыл бұрын

    Спасибо большое за информацию. Практически все легко и приятно глазу. Я раньше только знал как папку создать а сейчас чуть больше чем ранее 🤗

  • @user-jn3jw7ot5q
    @user-jn3jw7ot5q7 жыл бұрын

    КРУТО!!!!!!!!!!!!! Спасибо!!! И как всегда что то новенькое, там где казалось и так все понятно. У тебя талант всякие вкусности выдавать!!!

  • @user-jn3jw7ot5q

    @user-jn3jw7ot5q

    3 жыл бұрын

    а в чём проблема молодой человек?

  • @mikdandys
    @mikdandys7 жыл бұрын

    Хорошо бы рассказать про таймер, в видео показана циклическое выполнение действия. А хотелось бы послушать про таймер - запуск таймера по событию, событие по окончанию работы таймера.

  • @0neme760

    @0neme760

    4 жыл бұрын

    Знаю, что поздновато, но почему нельзя просто взять и в цикле прописать изменения цифры по истечению одной секунды например? Типа: пока не нажали "стоп", будем считать количество секунд и выводить их на экран, а потом, если итоговое значение меньше ожидаемого - выведем надпись: "вы слишком жирный, кэп! Бегите быстрее" ^_^

  • @vladimirlee5928

    @vladimirlee5928

    3 жыл бұрын

    @@0neme760 а каким способом вы хотите реализовать данный таймер: внутренним таймеров Atmega328 или же функцией Delay? Не забывайте, что и без вашего участия в микроконтроллере всегда отсчитываются такты, а оно же и время. Просто вы должны научиться использовать это.

  • @0neme760

    @0neme760

    3 жыл бұрын

    @@vladimirlee5928 Это прекрасно! Приведите пример и мы все чему-то научимся. Лично я использовал таймер Атмега, ибо, как говорилось в видео, делэй тупит все выполнение программы, на самолетиках его использовать нельзя. Ну или на каком-нибудь самодельном ИВЛ )

  • @vladimirlee5928

    @vladimirlee5928

    3 жыл бұрын

    @@0neme760 Погодите. Здесь нам нужно определиться. Вы используете голый процессор или ардуино? Из первого вашего комментария мне было не понятно. Поэтому я и говорю, что в Ардуино уже автоматически таймер настроен который считает время millis() и micros(), а в голом микроконтроллере таймеры нужно настраивать самостоятельно уже.

  • @0neme760

    @0neme760

    3 жыл бұрын

    @@vladimirlee5928 с голыми контролерами я почти не работал. В данном случае ардуино

  • @Fear701
    @Fear7014 жыл бұрын

    так просто и так гениально!! ты меня выручил)))

  • @095TV
    @095TV7 жыл бұрын

    Классный ролик получился!

  • @WakeUp4L1fe
    @WakeUp4L1fe7 жыл бұрын

    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

    @alexandr_84

    7 жыл бұрын

    WakeUp4L1fe а вконце пример с переменной нексттайм, направление знака неравенства не перепутан?

  • @WakeUp4L1fe

    @WakeUp4L1fe

    7 жыл бұрын

    Спасибо, поправил

  • @ArduNotes

    @ArduNotes

    7 жыл бұрын

    +WakeUp4L1fe спасибо! Добавлю в методичку

  • @xumatyt

    @xumatyt

    7 жыл бұрын

    В таком случае, когда nextTime переполнится, условие if (nextTime

  • @alexandr_84

    @alexandr_84

    7 жыл бұрын

    xumux тоже верно. может можно в таких случаях както перегрузить ардуину раз в 50дней? или использовать модуль, вроде одно ложное срабатывание, а не постоянное.

  • @tleunurdossymbek48
    @tleunurdossymbek487 жыл бұрын

    спс за видео Алекс👍🏻 как раз таки не понимал эти задержки. Доходчиво объяснил, успехов!!! Будет возможность сделай видос про многозадачность. Спасибо!)

  • @victorgoncharov5476
    @victorgoncharov54767 жыл бұрын

    Спасибо, жду видео с уходом дуины в спящий режим)

  • @serafimes

    @serafimes

    3 жыл бұрын

    Дождался

  • @lutsenko36
    @lutsenko366 жыл бұрын

    Спасибо, мне очень нужно описание работы millis

  • @ravesonics
    @ravesonics7 жыл бұрын

    Ура, новый выпуск!

  • @alexlju
    @alexlju6 жыл бұрын

    2:50 Вот оно!!!! то, не зная чего я не смог перейти на ардуино с промышленных контроллеров! Теперь можно продолжить экезекуцию. Спасибо!

  • @victorsinitsyn1432
    @victorsinitsyn14323 жыл бұрын

    Алекс, у тебя получаются очень лаконичные уроки. Все четко и по делу: Круто! PS: по-моему round() лишний. Ты же целое число на целое делишь.

  • @TyomchaFPV
    @TyomchaFPV4 жыл бұрын

    Спасибо за видео, оч помогло для моего проекта)

  • @15Stepa
    @15Stepa7 жыл бұрын

    Спасибо за подсказку как сделать многозадачность.

  • @theavgusto7884
    @theavgusto78846 жыл бұрын

    2:50 не нужно ли переменной last_time присвоить изначально значение? так как при первом запуске if last_time будет использовать неизвестное значение из памяти предположительно 0 но все же. или я что-то не так понял?

  • @viktorviktor5847
    @viktorviktor58474 жыл бұрын

    Подскажите как через millis написать это: void setup() { pinMode(PIN 13, OUTPUT); } void loop() { digitalWrite(PIN 13, HIGH); delay(3000); digitalWrite(PIN 13, LOW); delay(1000); Я что то не пойму нифига(((

  • @ivanshepelev5617
    @ivanshepelev56174 жыл бұрын

    Если при компиляции скетча с последним примером вылетает ошибка: "invalid operands of types 'double' and 'int' to binary 'operator%" можно записать так: "if (int (round(millis() / 300)) % 2 == 0)" PS Огромное Спасибо за уроки!!!

  • @peacefulquasar
    @peacefulquasar4 жыл бұрын

    Про кратность подумал когда поставил видосик на паузу и разбирал, а потом ты сам продемонстрировал этот вариант)

  • @user-zf8kl6js8j
    @user-zf8kl6js8j3 жыл бұрын

    Спасибо за видос. Лайк!

  • @georgijwlassow7430
    @georgijwlassow74305 жыл бұрын

    Отлично. Спасибо.

  • @user-mg6zy3st5p
    @user-mg6zy3st5p6 жыл бұрын

    Хороший видео урок! Возможно, для новичков, стоило указать, что если мы не присваиваем переменной число, то в ней, как правило, по умолчанию хранится 0. Таким образом last_time , в начале, хранит 0, а по достижении millis() 5000 перезаписывается на 5000 и т.д.

  • @ivan8140

    @ivan8140

    Жыл бұрын

    да, как раз на этом комментарии вопрос и отпал :)

  • @Mr.Drug.

    @Mr.Drug.

    Жыл бұрын

    Мне пришло просто сто раз пересмотреть, и тупо догадаться и представить что именно так и должно быть. Ошибка всех обучалок, автор некоторые моменты умалчивает, забывает что люди не умеют читать мысли

  • @animecniks

    @animecniks

    5 ай бұрын

    @@Mr.Drug. может он верил что Кто то смотрет все видео А в каком то с прошлых Он говорыл Что Переменая изначально 0 если ми ничего не указали.Хотя мог повторить мейби

  • @lutsiuk5
    @lutsiuk57 жыл бұрын

    познавательно спасибо, не знал такого

  • @tenacious_nomad
    @tenacious_nomad6 жыл бұрын

    мне кажется последний однострочный вариант содержит несколько ошибок. 1. для приведение к секундам выполняется деление на 100 (хотя голосом все правильно сказал - делить надо на 1000). 2. из-за округления код срабатывает гораздо чаще чем нужно. например если millis() вернет 6405 или 6425 после округления получится одно и то же - в результате несколько запусков в одном интервале

  • @user-mq8tt4ny1u

    @user-mq8tt4ny1u

    6 жыл бұрын

    все верно. Округляем при выводе на экран ) Serial.println(round(last_time / 1000));

  • @Perepodvyvert_s_perevorotom

    @Perepodvyvert_s_perevorotom

    2 жыл бұрын

    @Тарас Атавин А по-русски: в реальном условии - не округляем.

  • @Perepodvyvert_s_perevorotom

    @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

    @Perepodvyvert_s_perevorotom

    2 жыл бұрын

    @Тарас Атавин Если надо объяснять - то не надо объяснять.

  • @Perepodvyvert_s_perevorotom

    @Perepodvyvert_s_perevorotom

    2 жыл бұрын

    @Тарас Атавин Вам ближе по-украински.

  • @user-vz7dw9jr2m
    @user-vz7dw9jr2m7 жыл бұрын

    Спасибо тебе огромное! Очень полезные видео) Начав смотреть твой канал тоже решил себе заказать ардуино)) И организовать на нем кормилку для котов)

  • @user-oy1sq7mc4d

    @user-oy1sq7mc4d

    7 жыл бұрын

    Сдохнет твой кот. Имхо в кормилку из холодильника кто то тоже должен класть еду. Можно конечно пойти дклее и автоматизировать процесс достования из холодильника. Затем создаётся робот который ходит в магаз и покупает жратву коту и кормит кота. есть шанс стать миллионером ))))))

  • @user-vz7dw9jr2m

    @user-vz7dw9jr2m

    7 жыл бұрын

    Спасибо за дельный совет от водителя такси:) А делать выводы по одному предложению у Вас очень хорошо получается... Кто то сказал что она будет полностью автоматической? если бы я мог собрать такую хрень - то уже давно был бы миллионером, а пока просто стоит задача чтоб коты могли жрать днем пока дома никого нет.

  • @user-tb7kw5nh4x
    @user-tb7kw5nh4x7 жыл бұрын

    спасибо большое очень помогло

  • @user-bs4jn3ms8h
    @user-bs4jn3ms8h4 жыл бұрын

    Alex, подскажи а как с помощью "millis()" реализовать моргание надписи на дисплее с настраиваемыми временами. Например: 1 сек. индикации, 1 сек. паузы? Ну типа аналог стандартного блинка, только без использования "delay". Спасибо.

  • @RusNovgorod
    @RusNovgorod6 жыл бұрын

    Доброго времени. Правильно ли я тогда понимаю, что для использование в слайдере для таймлапс, (это когда фотокамера установлена на слайдере и должны происходить два действия. Камера смещается на заданное расстояние, к примеру на один или два шага двигателя, останавливается, срабатывает затвор камеры. Камера вновь перемещается и так до края слайдера.) необходимо использовать millis()?

  • @Next__Play
    @Next__Play3 жыл бұрын

    Спасибо, ты помог мне с пересчетом данных в лупе датчика INA226 через 1/3 сек. А то delay(300) тормозила всю общую прогу, даже часы и те останавливались на 1/3 сек. Теперь пересчет и отображение характеристик тока отображается, как и нужно для нормального восприятия, а не бегущие цифры после запятой. (моя паяльная станция) .

  • @tashkent1133
    @tashkent11337 жыл бұрын

    Полезно, спасиб

  • @roma4ub241
    @roma4ub2417 жыл бұрын

    Ещё не посмотрел, а лайк поставил)

  • @TyZ2103
    @TyZ21037 жыл бұрын

    Эх, жаль нельзя сразу два лайка поставить :) То что нужно и как раз вовремя для моей программы :)

  • @jetset-fz6jd
    @jetset-fz6jd7 жыл бұрын

    даешь урок о прерываниях!

  • @elenapoplos9537
    @elenapoplos95373 жыл бұрын

    Спасибо за видео и попутного ветра

  • @user-sf4em7vw9y
    @user-sf4em7vw9y7 жыл бұрын

    с какого именно момента начинается работа счетчика? с первой строчки в void setup?

  • @User050068
    @User0500687 жыл бұрын

    Расскажи как выводить информацию на сдвоенный (x3, x4 итд) семисегментный индикатор и чем отличается способ с одиночными индикаторами и сдвиговыми регистрами. И как на SD-флешке создавать файл с логами. Не обязательно в ближайшем видео, а вообще когда-нибудь

  • @user-rx3lz1mk6u
    @user-rx3lz1mk6u5 жыл бұрын

    Привіт друже, ремарка long та int займать однакових 4 байта.А от long long 8 байт)Дякую тобі за твою титанічну роботу. Удачі:)

  • @svetoch_4592
    @svetoch_45926 жыл бұрын

    3:24 кормить кота раз в 21 день)))

  • @svetoch_4592

    @svetoch_4592

    3 жыл бұрын

    @Тарас Атавин Ебать! Я прозрел!

  • @bmirmorsminecraft3106
    @bmirmorsminecraft31064 жыл бұрын

    Ты так внятно объясняешь за 5 минут, не же ли нудные лекции училки 45мин.))))

  • @user-qp2hk1ib1y
    @user-qp2hk1ib1y7 жыл бұрын

    А существуют ли переменные, для которых можно задать числовое значение, допусти kek== 1, kek ==2, для того, чтобы считать, например минуты

  • @100899wot
    @100899wot7 жыл бұрын

    Сделай урок по прерываниям

  • @user-zj9dn8gm6f
    @user-zj9dn8gm6f5 жыл бұрын

    Подскажите пожалуйста. Гавер в видосе объявил переменную last_time типа unsigned long, но не указал значение. Дальше ты вроде бы как не присваивал её значения. Как понять чему равна переменная last_time. 2:02

  • @slav93rus

    @slav93rus

    5 жыл бұрын

    Typical ,он не указал значение ,он просто объявил last_time как переменную(можно сказать равна нулю),Millis- время после включения ардуино.Теперь условие : когда время после включения - 0 станет > 5000, то выполняется условие и мы перезаписываем last_time ( last_time= Millis=5000)и когда получается что last_time=5000, то не выполняется условие и мы ждём когда пройдёт ещё 5секунд (тогда будет Millis будет равен 10000 и будет снова выполнятся условие)и так бесконечно и при этом остальной код тоже выполняется

  • @user-sf9gv5vx7b
    @user-sf9gv5vx7b4 жыл бұрын

    Вот теперь точно понятно))) Хоть один человек смог нормально объяснить.

  • @user-iz1gu1tb2c
    @user-iz1gu1tb2c5 жыл бұрын

    У последнего предложенного варианта с целочисленным делением минус в том, что если время срабатывания по каким-либо причинам пропустится (остальной код долго выполнялся, или в нем был delay()), то тело условия не сработает, что может вызвать ошибки. Первый вариант сработает и при опоздании.

  • @user-eu8kn6to2m
    @user-eu8kn6to2m4 жыл бұрын

    По мере увеличения числа в миллис, контроллер не начинает тормозить?

  • @vladimirlee5928

    @vladimirlee5928

    3 жыл бұрын

    нет. это отдельный блок в микроконтроллере.

  • @user-do3vq3vb8g
    @user-do3vq3vb8g7 жыл бұрын

    Сделай видео о том как подключить камеру к ардуино

  • @user-op8fm5cf7f
    @user-op8fm5cf7f7 жыл бұрын

    как поступить, если нам нужно, чтобы часть программы срабатывала раз в 5 сек? Ведь часть, которая ниже if(millis)...может выполняться больше 5 сек

  • @user-kf7nj7vv3d
    @user-kf7nj7vv3d6 жыл бұрын

    спасибо alex. millis() работает. но как сделать чтоб задержка срабатывала в начале цикла loop() при включении микроконтроллера. по примеру сначала выполнение условия а потом идёт задержка то есть 1 пауза 1 пауза и т.д как сделать пауза 1 пауза 1 пауза 1 и т.д.. alex буду особенно признателен за ответ

  • @user-vs2nn1ug1l
    @user-vs2nn1ug1l9 ай бұрын

    Каков бы не был период срабатывания 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 дня } }

  • @nursultansulaymanov
    @nursultansulaymanov6 жыл бұрын

    не могу найти видео со спящим режимом. или такого выпуска еще не было?

  • @antianubis4623
    @antianubis46235 жыл бұрын

    Последний способ просто класс!! Блин лет 5 на си пишу - никогда подобную конструкцию не использовал. Мне стыдно...очень((

  • @user-cq7nj7un5e
    @user-cq7nj7un5e6 жыл бұрын

    Алекс а могли бы Вы снять видио с разбором где в одном скейче выполняются две операции например открываем серво привод по температуре и закрываем соответсвено по ней, и также по времени к примеру два раза в день включалось рэле минут на 5-10 . и соотвествено я так понимаю тут уже нужны часы реального времени.

  • @TheVitall
    @TheVitall7 жыл бұрын

    Алекс а в примере с "дебонсом" во втором if такую строчку " && millis() - last_press > 100 " тоже надо ?

  • @ArduNotes

    @ArduNotes

    7 жыл бұрын

    нет, если кнопка отпущена, то она отпущена, дребезга при отпускании не будет

  • @TheVitall

    @TheVitall

    7 жыл бұрын

    совсем заработался я , этот вопрос задавал для 6 урока . Главное , что ты понял . Низкий поклон тебе за науку !

  • @clydewarrior2255

    @clydewarrior2255

    6 жыл бұрын

    +Заметки Ардуинщика Ну не знаю, у меня кнопка при отпускании срабатывает

  • @egorka40699
    @egorka406997 жыл бұрын

    нужно видео про спячку ардуины!!!

  • @dos6920
    @dos69205 жыл бұрын

    Почему в последнем примере в связке if else отсутствуют фигурные скобки?

  • @user-xk9dk3gh4j
    @user-xk9dk3gh4j7 жыл бұрын

    можно ли просить у вас совета по скетчам?

  • @alexeibelousov3279
    @alexeibelousov32797 жыл бұрын

    в место delaymicroseconds() лучше использовать delay_us() на малых значениях параметров, экспериментировал на своей ардуино мега 2560 + осциллограф : delaymicroseconds(1) дает задержку около 20 микросекунд насколько я помню, а вот delay_us(1) дает задержку в 5 микросекунд ровно, даже фронты более менее в норме.Главный цикл loop не использовал, просто дергал ногой в while цикле, так быстрее всего.

  • @ArduNotes

    @ArduNotes

    7 жыл бұрын

    +Alexei Belousov спасибо, добавлю в пособие

  • @allthat7218

    @allthat7218

    5 жыл бұрын

    @@ArduNotes в PDF версии 1.1 (от 15.01.2019) нет ничего про delay_us - почему? не работает? забыли?

  • @iCoteg
    @iCoteg4 жыл бұрын

    Для понимания почему нужно использовать именно unsigned long , полезно было бы объяснить, что происходит при переполнении переменной.

  • @vladilion90
    @vladilion902 күн бұрын

    А если счётчик переполнится? И наш Last_time будет равен 4.294.966.000 допустим то код будет выглядеть так, millis опять стал 0 и будет (0 - last_time(4.294.966.000) > 1000) , так получается что условие больше не выполнится или будет выполнять я раз в 50 суток? И надо будет перезапускать МК? Или как это работает?

  • @lim11111
    @lim111116 жыл бұрын

    Здравствуйте. Почему функции round нет в справочниках по ардуино ?

  • @klaxwork1208
    @klaxwork12083 жыл бұрын

    Подскажите, пожалуйста, а как сделать, если мне надо чтобы светодиод загорелся на 5 секунд только, а не по циклу? Т.е. взяли с какого-то датчика данные и если какое-то условие сработало, то мне надо чтоб светодиод загорелся только на 5 секунд? Спасибо.

  • @chinarulit1126
    @chinarulit1126 Жыл бұрын

    А можно к фукции millis присвоить своё значение? Иногда нужно ускорить или пропустить счет millis.

  • @user-mn1yf2td4y

    @user-mn1yf2td4y

    Жыл бұрын

    Можно! Где-то видел, не могу найти! Можно в библиотеке гайвера про энергосбережение и сон покапаться, там есть корректировка миллис. Но тебе то это зачем ?

  • @volodysarasov
    @volodysarasov3 жыл бұрын

    как сделать таймер на миллис что бы несколько светодиодов мигали каждый по своему времени ? покажите нужно для программы у меня там будет порядка 15 -20 задержек на миллс

  • @viktoroleks9664
    @viktoroleks9664 Жыл бұрын

    Привет всем, скажите пожалуйста кто нибудь, как реализовать мою простую задачу. Мне нужно чтоб после нажатия на кнопку и удержании её, на каком-то цифровом Пине появился HIGH потенциал но с задержкой в секунду. Но только при нажатой кнопке.

  • @maxichannel9080
    @maxichannel90804 жыл бұрын

    Алекс Гайвер, скажите, почему в этой от конструкции (в низу) "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");

  • @stanislawsauer5295
    @stanislawsauer52956 жыл бұрын

    3:05 Мне эта конструкция показалась немного замудреной. Не проще ли было бы использовать деление с остатком? if((millis() % 5000) == 0){ // код для выполнени } так ненужно было бы каждый раз переменную переписывать, да и переменная вообще не нужна. Или % для Ардуино очень напряжен? (в плане ресурсов: такты, байты).

  • @horart9447

    @horart9447

    4 жыл бұрын

    А разве millis это не число с плавающей точкой?

  • @no_name_user5458

    @no_name_user5458

    3 жыл бұрын

    В таком случае ,если выполняется какая то полезная работа параллельно , то будут теряться миллисекунды и без остатка поделить не получится, пока делал проект , полностью это осознал.

  • @vitalicorsun1190
    @vitalicorsun11904 жыл бұрын

    Может кому то пригодится, скетч посылает значения в монитор порта от 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

  • @Qapernik
    @Qapernik4 жыл бұрын

    "переполнение millis" - это значит он в итоге остановится или в 0 уйдет? его перезапустить можно без рестарта?

  • @ArduNotes

    @ArduNotes

    4 жыл бұрын

    Уйдет в 0, но конструкция с таймером продолжит отрабатывать интервалы. Максимально подробно написано тут alexgyver.ru/lessons/time/

  • @Qapernik

    @Qapernik

    4 жыл бұрын

    @@ArduNotes благодарствую

  • @slavgamer8231
    @slavgamer82313 жыл бұрын

    А можно с помощью millis мигалку сделать?

  • @user-bn7dx4ds8v
    @user-bn7dx4ds8v11 ай бұрын

    со скетчем не поможете ? что бы серво 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).

  • @user-wd3ji1pw3m
    @user-wd3ji1pw3m6 жыл бұрын

    А этот код по идее корректно работать будет около 50 суток ведь так? По идее надо еще проверку поставит что millis()- last_time>0

  • @user-bk9bj8hf5j

    @user-bk9bj8hf5j

    4 жыл бұрын

    Нет. Проверка "millis()- last_time>0" лишняя - уже ж есть проверка "millis() - last_time > 5000" которая полностью её замещает. Другими словами если какое-то число больше 5000, то оно и подавно будет больше 0.

  • @user-eu8kn6to2m

    @user-eu8kn6to2m

    4 жыл бұрын

    @@user-bk9bj8hf5j привет

  • @user-bk9bj8hf5j

    @user-bk9bj8hf5j

    4 жыл бұрын

    @@user-eu8kn6to2m Привет! :)

  • @user-eu8kn6to2m

    @user-eu8kn6to2m

    4 жыл бұрын

    @@user-bk9bj8hf5j хочу сделать измеритель потребления на счетчик на Ардуино. Там лампочка моргает, и каждые 3200 раз проходит 1квт/ч. И, измеряя, время между моргания и светодиода можно определять текущую подключенную нагрузку. фоторезистор будет и через транзистор логика. Думаю хватит скорости. Там светодиод 0.1с это 11квт, такой нагрузки не будет наверно, максимум 5 кат т.е. 0,5 с. На прерываниями делать, если то как измерить время между прерываниями? Как идея?

  • @user-bk9bj8hf5j

    @user-bk9bj8hf5j

    4 жыл бұрын

    ​@@halyapin Нет. И тип переменной "last_time" и тип возвращаемого функцией "mills()" - "unsigned long" (беззнаковое целое), поэтому результат вычитания тоже будет типа "unsigned long", а число этого типа не может быть отрицательным *никогда*.

  • @ZhiroMurashka
    @ZhiroMurashka4 жыл бұрын

    Как посчитать сколько миллисекунд нажата кнопка на ардуино с помощью таймера?

  • @user-fl4nt9ej2z
    @user-fl4nt9ej2z4 жыл бұрын

    С 23 сутками не будет работать правильно... Сработает условие на 23й день, потом на 46й, а потом через 4 дня (на 50е сутки) сбросится миллис и пройдёт ещё 23 суток до условия, и того 27 дней до выполнения условия.

  • @yungfloppa

    @yungfloppa

    4 жыл бұрын

    А что если добавить проверку переполнения переменной и в случае такового события присваивать переменной значение равное пройденным 4 дням?

  • @user-mn1yf2td4y

    @user-mn1yf2td4y

    2 жыл бұрын

    Нет, все правильно будет работать. Там другая математика, отрицательных чисел нет, смотрите урок "математические операции". Числа идут по кругу, почти как на циферблате часов. Если считать в днях, то после 50 идёт 0, и наоборот перед 0 будет 50. То есть 0-1=50! 0-2=49,...0-46=5! А 18-46=23>=23 условие выполнилось на 18 день после перехода через 0. То есть через 23 дня! Только считать надо в миллисекундах

  • @dukalisreshaet4088
    @dukalisreshaet40884 жыл бұрын

    а как сделать допустим я подаю на один пин логическую 1 а на выходе мне надо что бы выходила логиеская еденица и длилась она 4 секунды!!!

  • @user-ng1sd5kj5p
    @user-ng1sd5kj5p3 жыл бұрын

    Подскажите а что делать с переменной "last_time" когда "millins" обнулится? Прописать еще одну проверку и если "millins" = 0, то обнулять и last_time? Или проверять разность? если разность меньше 0, то last_time = 0?

  • @user-mn1yf2td4y

    @user-mn1yf2td4y

    2 жыл бұрын

    Ничего не делать. Здесь нет отрицательных чисел, числа идут по кругу, то есть перед числом 0 стоит не - 1, а 4294967295. Значит 0 минус 1 будет равно 4294967295, а 0-4294967295==1, также как 0-4294962296==5000. То есть таймер не собьётся!

  • @user-ng1sd5kj5p

    @user-ng1sd5kj5p

    2 жыл бұрын

    @@user-mn1yf2td4y Спасибо за разьяснение.

  • @kirznervadim7072
    @kirznervadim70725 жыл бұрын

    Компилятор IDE 1,8,8 ругается на оператор умножения. Как исправить?

  • @user-hp2bh4un8j
    @user-hp2bh4un8j2 жыл бұрын

    не могу понять как работает переменная в круглых скобках unsigned long в операторе if (millis() - last_time > (unsigned long)23 * 24 *60 *69 100 ) для чего она там нужна ??

  • @vladlife1892
    @vladlife18924 жыл бұрын

    на millis() -ах луче код работает т.к. когда я взял на % ардуина как бешеная просчитывает, на примере вкл. выкл. светодиода она истерично промигивалась пропускала / глючила ( ну код постоянно ломился через условие == 0 , а когда millis() и знак > но верняк всё чётко стабильно , спс . И го побольше простых гайдов без библиотек , по возможности , что бы можно было понять суть кода? я пытался изложить мысль как смог. Как по датчику ардуину будить, и по этому же дачику ( света) ложить спать ?

  • @Werbard
    @Werbard7 жыл бұрын

    Очень бы хотелось увидеть урок 4.1 "борьба с переполнением переменной / обновлением millis"...

  • @ArduNotes

    @ArduNotes

    7 жыл бұрын

    +Вячеслав Бард в пособии в пдф все написано

  • @Werbard

    @Werbard

    7 жыл бұрын

    Пошел изучать. Спасибо!

  • @Werbard

    @Werbard

    7 жыл бұрын

    Проштудировал, но там не нашел универсального решения. Там ведь все то, что было здесь в комментариях. Оба варианта не предусматривают ситуацию, когда отсчет начался перед самым достижением предельного значения (допустим за 5 секунд до обнуления millis), а отсчитать должен ровно 60 секунд. Один вариант подгонит переменную к 0 и сработает раньше времени, другой прибавит слишком много и не будет достигнут ни когда. Вариант только писать еще более изощренную логику с прибавлением времени и проверкой на переполнение, если проверка не пройдена - менять... Что-то вроде: if((nextTime 4294967295){ nextTime = nextTime-4294967295; } } Но эта конструкция может дать сбои, если nextTime будет равен 4294967295 или на пару милисекунд меньше. Тогда контроллер пропустит срабатывание...

  • @yungfloppa

    @yungfloppa

    4 жыл бұрын

    @@Werbard Нашли способ решения проблемы? :)

  • @Werbard

    @Werbard

    4 жыл бұрын

    @@yungfloppa при переполнении переменная переходит через ноль. Вариантов два. Если не критично - забить, будет просто двойное срабатывание. Если критично - проверять после присвоения значения и делать соответствующие поправки.

  • @jurimik6529
    @jurimik65293 жыл бұрын

    а как будет работать выражение 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

    @ArduNotes

    3 жыл бұрын

    Произойдет переполнение переменной и все будет нормально

  • @unclevakkh
    @unclevakkh6 жыл бұрын

    конструкция мне пригодилась if (millis() - last_time > 1000) { last_time = millis(); //что делать); Спасибо!

  • @YeahMadeit_17

    @YeahMadeit_17

    2 жыл бұрын

    А зачем перед last_time ставить "-" ? Автор не объяснил

  • @Helg1002
    @Helg10024 жыл бұрын

    я правильно понял, что по умолчанию переменной last_time присваивается значение 0 ? а то, что-то как-то непонятно :(

  • @Helg1002

    @Helg1002

    4 жыл бұрын

    да да ... сам спросил, сам ответил - да 0

  • @yungfloppa

    @yungfloppa

    4 жыл бұрын

    @@Helg1002 Хорош)))

  • @ValentinM-ex3lo
    @ValentinM-ex3lo4 ай бұрын

    В самом конце видео показан код(с lolo 1 и lolo2), где программа проверяет кратность числа - 2, немогу понять почему он работает, если после оператора if нет фигурных скобок - {}, может кто-нибудь объяснить?

  • @micromaster4405

    @micromaster4405

    Ай бұрын

    Зачем фигурные скобки, если там после if только один оператор?

  • @AlexeyLitvinov
    @AlexeyLitvinov5 жыл бұрын

    при первом заходе в if не понятно чему будет равен last_time. его нужно где-то определить

  • @user-ue7kz4lq3k

    @user-ue7kz4lq3k

    5 жыл бұрын

    он при объявлении автоматически инициализируется нулём

  • @user-lm7iu6ni2y
    @user-lm7iu6ni2y3 жыл бұрын

    не понял одно сегодня Использовал этот участок кода.. поставил для датчиков температуры и атмосферного давления. через каждые 10 минут .. Что будет при переполнении счетчика millis

  • @ArduNotes

    @ArduNotes

    3 жыл бұрын

    Ничего

  • @user-rx6ki9pm6w
    @user-rx6ki9pm6w5 жыл бұрын

    У меня Arduino IDE выдаёт ошибку в этом скетче с функцией millis. Подскажите плз ламеру что за херня. Expected initializer before 'void'

  • @WereFly100

    @WereFly100

    5 жыл бұрын

    Скорее всего вы что-то объявили вне функции.., то, что можно объявлять только внутри функции...

  • @user-ih1ep8df9x
    @user-ih1ep8df9x6 жыл бұрын

    Чего? Delay это задержка, а Millis() - last_Tim... переодическое выполнение кода. Это разные действия, т. е delay этими millis не заменешь. И в таком случае эти милис тоже не лучший выбор,потому что перед ней может идти функция которая выполняется 20 минут и тогда только после этих 20 минут выполнится условие,есть шанс что период будет больше 5 секунд . Правильно, это прерывания от таймера получать и результат 100%

Келесі