No video

Уроки Arduino #4 - функции времени

  Рет қаралды 436,828

Заметки Ардуинщика

Заметки Ардуинщика

Күн бұрын

В этом уроке мы с вами научимся пользоваться временнЫми функциями Arduino, или функциями времени. Это стандартные функции задержек delay() и delayMicroseconds(), а также встроенный таймер millis() и micros(). Рассмотрим особенности и примеры применения.
▼ Текстовая версия ▼
alexgyver.ru/l...
▼ Огромный стартовый набор GyverKIT ▼
kit.alexgyver.ru/
▼ Уроки Arduino на сайте ▼
alexgyver.ru/l...
▼ Модули и датчики с Али ▼
alexgyver.ru/ar...
▼ Страница "Заметок Ардуинщика" ▼
alexgyver.ru/ar...
Теги: #arduino #уроки #ардуино #alexgyver
●●●●●●●●●●●●●●●●●●●●
► Основной канал: / alexgyvershow
► Поддержать автора alexgyver.ru/s...
► Официальный сайт: alexgyver.ru/
► Почта: alex@alexgyver.ru

Пікірлер: 419
@clydewarrior2255
@clydewarrior2255 4 жыл бұрын
2:17 Прошу заметить, что выражение: if(millis() - last_time > 5000){} Срабатывает на 1 миллисекунду позже указанного, поэтому правильнее ставить ">="
@user-gh8gw5nk9y
@user-gh8gw5nk9y 4 жыл бұрын
Мля , на миллисекунду полив позже сработал, цветы уже завяли)))
@x_mouzzer_x
@x_mouzzer_x 3 жыл бұрын
дельное замечание, спасибо
@sashaca
@sashaca 3 жыл бұрын
После этой команды идёт код, который тоже занимает время, поэтому значение last_time будет кратно этому числу, таким образом погрешность может быть ещё больше
@yeru6427
@yeru6427 3 жыл бұрын
Сколько миллисекунд ты писал этот коммент?)
@kfvchk
@kfvchk 3 жыл бұрын
@@yeru6427 хороший вопрос)
@sergeyv7342
@sergeyv7342 3 жыл бұрын
смотрю по лайкам , все меньше и меньше людей доходят до следующих курсов , но у вас самое доходчивое и понятное обьяснение среди всех.. от души благодарю..вы лучший учитель
@pilipshanov2011
@pilipshanov2011 5 жыл бұрын
Хорошее видео. Замечу лишь, что кормить животных раз в 23 дня чересчур расточительно)
@anoname10
@anoname10 4 жыл бұрын
@Тарас Атавин Jl9 ну нах крокодила кормить
@yungfloppa
@yungfloppa 4 жыл бұрын
@Тарас Атавин Гениально)
@habihabi2003
@habihabi2003 2 жыл бұрын
Качество уроков на высоте , приятно слушать и не засыпаешь , вот только без практики это всё забудется
@cycle6023
@cycle6023 Жыл бұрын
очень хорошо объясняете! пишите примеры,хорошо подготавливаетесь,прям сразу хочется все это слушать! Все записываю в блокнот,от души спасибо! :)
@mikdandys
@mikdandys 7 жыл бұрын
Хорошо бы рассказать про таймер, в видео показана циклическое выполнение действия. А хотелось бы послушать про таймер - запуск таймера по событию, событие по окончанию работы таймера.
@0neme760
@0neme760 5 жыл бұрын
Знаю, что поздновато, но почему нельзя просто взять и в цикле прописать изменения цифры по истечению одной секунды например? Типа: пока не нажали "стоп", будем считать количество секунд и выводить их на экран, а потом, если итоговое значение меньше ожидаемого - выведем надпись: "вы слишком жирный, кэп! Бегите быстрее" ^_^
@vladimirlee5928
@vladimirlee5928 4 жыл бұрын
@@0neme760 а каким способом вы хотите реализовать данный таймер: внутренним таймеров Atmega328 или же функцией Delay? Не забывайте, что и без вашего участия в микроконтроллере всегда отсчитываются такты, а оно же и время. Просто вы должны научиться использовать это.
@0neme760
@0neme760 4 жыл бұрын
@@vladimirlee5928 Это прекрасно! Приведите пример и мы все чему-то научимся. Лично я использовал таймер Атмега, ибо, как говорилось в видео, делэй тупит все выполнение программы, на самолетиках его использовать нельзя. Ну или на каком-нибудь самодельном ИВЛ )
@vladimirlee5928
@vladimirlee5928 4 жыл бұрын
@@0neme760 Погодите. Здесь нам нужно определиться. Вы используете голый процессор или ардуино? Из первого вашего комментария мне было не понятно. Поэтому я и говорю, что в Ардуино уже автоматически таймер настроен который считает время millis() и micros(), а в голом микроконтроллере таймеры нужно настраивать самостоятельно уже.
@0neme760
@0neme760 4 жыл бұрын
@@vladimirlee5928 с голыми контролерами я почти не работал. В данном случае ардуино
@user-yz3us4qu2u
@user-yz3us4qu2u 7 жыл бұрын
Спасибо большое . Я не программист но Ваш урок мне очень помог создать скетч для управления пиролизным котлом.
@victorgoncharov5476
@victorgoncharov5476 7 жыл бұрын
Спасибо, жду видео с уходом дуины в спящий режим)
@serafimes
@serafimes 3 жыл бұрын
Дождался
@WakeUp4L1fe
@WakeUp4L1fe 7 жыл бұрын
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дней? или использовать модуль, вроде одно ложное срабатывание, а не постоянное.
@Scallori_17
@Scallori_17 2 жыл бұрын
Спасибо большое за информацию. Практически все легко и приятно глазу. Я раньше только знал как папку создать а сейчас чуть больше чем ранее 🤗
@tenacious_nomad
@tenacious_nomad 7 жыл бұрын
мне кажется последний однострочный вариант содержит несколько ошибок. 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-jn3jw7ot5q
@user-jn3jw7ot5q 7 жыл бұрын
КРУТО!!!!!!!!!!!!! Спасибо!!! И как всегда что то новенькое, там где казалось и так все понятно. У тебя талант всякие вкусности выдавать!!!
@user-jn3jw7ot5q
@user-jn3jw7ot5q 3 жыл бұрын
а в чём проблема молодой человек?
@Yupitrer
@Yupitrer 7 жыл бұрын
Круто! Самый лучший канал по ардуино
@unitycreate5269
@unitycreate5269 6 жыл бұрын
Это великолепнейший цикл уроков. Теперь он всегда у меня в закладках. Все время чего нибудь да забуду. Спасибо тебе за все. А можно в тебя денюжкой что-ли кинуть, чтобы можно было с уверенностью ждать новых выпусков (на обоих каналах(но хотелось бы побольше обучалок по ардуино ))
@user-mg6zy3st5p
@user-mg6zy3st5p 6 жыл бұрын
Хороший видео урок! Возможно, для новичков, стоило указать, что если мы не присваиваем переменной число, то в ней, как правило, по умолчанию хранится 0. Таким образом last_time , в начале, хранит 0, а по достижении millis() 5000 перезаписывается на 5000 и т.д.
@ivan8140
@ivan8140 2 жыл бұрын
да, как раз на этом комментарии вопрос и отпал :)
@Mr.Drug.
@Mr.Drug. Жыл бұрын
Мне пришло просто сто раз пересмотреть, и тупо догадаться и представить что именно так и должно быть. Ошибка всех обучалок, автор некоторые моменты умалчивает, забывает что люди не умеют читать мысли
@animecniks
@animecniks 8 ай бұрын
@@Mr.Drug. может он верил что Кто то смотрет все видео А в каком то с прошлых Он говорыл Что Переменая изначально 0 если ми ничего не указали.Хотя мог повторить мейби
@TheFenix717
@TheFenix717 7 жыл бұрын
Очень полезное видео! спасибо за труды!!!
@user-xk9dk3gh4j
@user-xk9dk3gh4j 7 жыл бұрын
Спс большое за уроки. Только побольше бы:) Самые понятные уроки из тех что я видел.
@user-mv7ee7bu8h
@user-mv7ee7bu8h 2 жыл бұрын
Спасибо вам за столь полезные видео!!!
@peacefulquasar
@peacefulquasar 4 жыл бұрын
Про кратность подумал когда поставил видосик на паузу и разбирал, а потом ты сам продемонстрировал этот вариант)
@ravesonics
@ravesonics 7 жыл бұрын
Ура, новый выпуск!
@alexlju
@alexlju 6 жыл бұрын
2:50 Вот оно!!!! то, не зная чего я не смог перейти на ардуино с промышленных контроллеров! Теперь можно продолжить экезекуцию. Спасибо!
@ivanshepelev5617
@ivanshepelev5617 4 жыл бұрын
Если при компиляции скетча с последним примером вылетает ошибка: "invalid operands of types 'double' and 'int' to binary 'operator%" можно записать так: "if (int (round(millis() / 300)) % 2 == 0)" PS Огромное Спасибо за уроки!!!
@florinturcanu7109
@florinturcanu7109 7 жыл бұрын
побыстрее бы следующие видео, очень понравилось
@beka6336
@beka6336 7 жыл бұрын
Отлично ведешь уроки. Продолжай!!!!
@Next__Play
@Next__Play 4 жыл бұрын
Спасибо, ты помог мне с пересчетом данных в лупе датчика INA226 через 1/3 сек. А то delay(300) тормозила всю общую прогу, даже часы и те останавливались на 1/3 сек. Теперь пересчет и отображение характеристик тока отображается, как и нужно для нормального восприятия, а не бегущие цифры после запятой. (моя паяльная станция) .
@romaibragimov9872
@romaibragimov9872 5 жыл бұрын
Спасибо большое!!! Очень познавательное видео!
@svetoch_4592
@svetoch_4592 6 жыл бұрын
3:24 кормить кота раз в 21 день)))
@svetoch_4592
@svetoch_4592 3 жыл бұрын
@Тарас Атавин Ебать! Я прозрел!
@jetset-fz6jd
@jetset-fz6jd 7 жыл бұрын
даешь урок о прерываниях!
@viktorviktor5847
@viktorviktor5847 4 жыл бұрын
Подскажите как через millis написать это: void setup() { pinMode(PIN 13, OUTPUT); } void loop() { digitalWrite(PIN 13, HIGH); delay(3000); digitalWrite(PIN 13, LOW); delay(1000); Я что то не пойму нифига(((
@15Stepa
@15Stepa 7 жыл бұрын
Спасибо за подсказку как сделать многозадачность.
@TyZ2103
@TyZ2103 7 жыл бұрын
Эх, жаль нельзя сразу два лайка поставить :) То что нужно и как раз вовремя для моей программы :)
@victorsinitsyn1432
@victorsinitsyn1432 3 жыл бұрын
Алекс, у тебя получаются очень лаконичные уроки. Все четко и по делу: Круто! PS: по-моему round() лишний. Ты же целое число на целое делишь.
@user-vz7dw9jr2m
@user-vz7dw9jr2m 7 жыл бұрын
Спасибо тебе огромное! Очень полезные видео) Начав смотреть твой канал тоже решил себе заказать ардуино)) И организовать на нем кормилку для котов)
@user-oy1sq7mc4d
@user-oy1sq7mc4d 7 жыл бұрын
Сдохнет твой кот. Имхо в кормилку из холодильника кто то тоже должен класть еду. Можно конечно пойти дклее и автоматизировать процесс достования из холодильника. Затем создаётся робот который ходит в магаз и покупает жратву коту и кормит кота. есть шанс стать миллионером ))))))
@user-vz7dw9jr2m
@user-vz7dw9jr2m 7 жыл бұрын
Спасибо за дельный совет от водителя такси:) А делать выводы по одному предложению у Вас очень хорошо получается... Кто то сказал что она будет полностью автоматической? если бы я мог собрать такую хрень - то уже давно был бы миллионером, а пока просто стоит задача чтоб коты могли жрать днем пока дома никого нет.
@095TV
@095TV 7 жыл бұрын
Классный ролик получился!
@Fear701
@Fear701 4 жыл бұрын
так просто и так гениально!! ты меня выручил)))
@tleunurdossymbek48
@tleunurdossymbek48 7 жыл бұрын
спс за видео Алекс👍🏻 как раз таки не понимал эти задержки. Доходчиво объяснил, успехов!!! Будет возможность сделай видос про многозадачность. Спасибо!)
@user-sf9gv5vx7b
@user-sf9gv5vx7b 4 жыл бұрын
Вот теперь точно понятно))) Хоть один человек смог нормально объяснить.
@iCoteg
@iCoteg 4 жыл бұрын
Для понимания почему нужно использовать именно unsigned long , полезно было бы объяснить, что происходит при переполнении переменной.
@bmirmorsminecraft3106
@bmirmorsminecraft3106 4 жыл бұрын
Ты так внятно объясняешь за 5 минут, не же ли нудные лекции училки 45мин.))))
@user-iz1gu1tb2c
@user-iz1gu1tb2c 5 жыл бұрын
У последнего предложенного варианта с целочисленным делением минус в том, что если время срабатывания по каким-либо причинам пропустится (остальной код долго выполнялся, или в нем был delay()), то тело условия не сработает, что может вызвать ошибки. Первый вариант сработает и при опоздании.
@theavgusto7884
@theavgusto7884 6 жыл бұрын
2:50 не нужно ли переменной last_time присвоить изначально значение? так как при первом запуске if last_time будет использовать неизвестное значение из памяти предположительно 0 но все же. или я что-то не так понял?
@lutsenko36
@lutsenko36 6 жыл бұрын
Спасибо, мне очень нужно описание работы millis
@user-fl4nt9ej2z
@user-fl4nt9ej2z 4 жыл бұрын
С 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 дня! Только считать надо в миллисекундах
@user-ih1ep8df9x
@user-ih1ep8df9x 7 жыл бұрын
Чего? Delay это задержка, а Millis() - last_Tim... переодическое выполнение кода. Это разные действия, т. е delay этими millis не заменешь. И в таком случае эти милис тоже не лучший выбор,потому что перед ней может идти функция которая выполняется 20 минут и тогда только после этих 20 минут выполнится условие,есть шанс что период будет больше 5 секунд . Правильно, это прерывания от таймера получать и результат 100%
@user-vs2nn1ug1l
@user-vs2nn1ug1l Жыл бұрын
Каков бы не был период срабатывания 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 дня } }
@vitaliy204
@vitaliy204 5 жыл бұрын
Привіт друже, ремарка long та int займать однакових 4 байта.А от long long 8 байт)Дякую тобі за твою титанічну роботу. Удачі:)
@user-eu8kn6to2m
@user-eu8kn6to2m 4 жыл бұрын
По мере увеличения числа в миллис, контроллер не начинает тормозить?
@vladimirlee5928
@vladimirlee5928 4 жыл бұрын
нет. это отдельный блок в микроконтроллере.
@TyomchaFPV
@TyomchaFPV 4 жыл бұрын
Спасибо за видео, оч помогло для моего проекта)
@vitalicorsun1190
@vitalicorsun1190 4 жыл бұрын
Может кому то пригодится, скетч посылает значения в монитор порта от 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
@antianubis4623
@antianubis4623 6 жыл бұрын
Последний способ просто класс!! Блин лет 5 на си пишу - никогда подобную конструкцию не использовал. Мне стыдно...очень((
@user-tb7kw5nh4x
@user-tb7kw5nh4x 7 жыл бұрын
спасибо большое очень помогло
@user-do3vq3vb8g
@user-do3vq3vb8g 7 жыл бұрын
Сделай видео о том как подключить камеру к ардуино
@user-zf8kl6js8j
@user-zf8kl6js8j 3 жыл бұрын
Спасибо за видос. Лайк!
@DimaKylikov
@DimaKylikov 7 жыл бұрын
Давай новый видосик про эту тему только с учетом комментарии и объяснением с примером физическим)
@Werbard
@Werbard 7 жыл бұрын
Очень бы хотелось увидеть урок 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 при переполнении переменная переходит через ноль. Вариантов два. Если не критично - забить, будет просто двойное срабатывание. Если критично - проверять после присвоения значения и делать соответствующие поправки.
@100899wot
@100899wot 7 жыл бұрын
Сделай урок по прерываниям
@roma4ub241
@roma4ub241 7 жыл бұрын
Ещё не посмотрел, а лайк поставил)
@alexeibelousov3279
@alexeibelousov3279 7 жыл бұрын
в место delaymicroseconds() лучше использовать delay_us() на малых значениях параметров, экспериментировал на своей ардуино мега 2560 + осциллограф : delaymicroseconds(1) дает задержку около 20 микросекунд насколько я помню, а вот delay_us(1) дает задержку в 5 микросекунд ровно, даже фронты более менее в норме.Главный цикл loop не использовал, просто дергал ногой в while цикле, так быстрее всего.
@ArduNotes
@ArduNotes 7 жыл бұрын
+Alexei Belousov спасибо, добавлю в пособие
@ArtisanVision
@ArtisanVision 5 жыл бұрын
@@ArduNotes в PDF версии 1.1 (от 15.01.2019) нет ничего про delay_us - почему? не работает? забыли?
@georgijwlassow7430
@georgijwlassow7430 5 жыл бұрын
Отлично. Спасибо.
@lutsiuk5
@lutsiuk5 7 жыл бұрын
познавательно спасибо, не знал такого
@user-op8fm5cf7f
@user-op8fm5cf7f 7 жыл бұрын
как поступить, если нам нужно, чтобы часть программы срабатывала раз в 5 сек? Ведь часть, которая ниже if(millis)...может выполняться больше 5 сек
@Tarik91011
@Tarik91011 4 жыл бұрын
ДЛЯ ТЕХ КТО НЕ МОГ ПОНЯТЬ // Глобальные переменные при объявлении имеют значение 0 по умолчанию (если не инициализировать) uint32_t myTimer1; // Глобальные переменные при объявлении имеют значение 0 по умолчанию (если не инициализировать) void setup() {} void loop() { if (millis() - myTimer1 >= 500) { // ищем разницу (500 мс) myTimer1 = millis(); // сброс таймера // выполнить действие } }
@Shvak
@Shvak 5 жыл бұрын
) Multi Blink - три светодиода мигают независимо друг от друга, у каждого своя частота . Поиграйтесь. Только почему-то со временем разбежка в срабатывании появляется и увеличивается потиху. А вот что делать, если нужно, чтобы работали синхронно? Как избавиться от рассинхрона? Кто подскажет, как скорректировать и насколько? unsigned long last_timeR = 0; unsigned long last_timeG = 0; unsigned long last_timeB = 0; boolean ledR=0; boolean ledG=0; boolean ledB=0; void setup() { Serial.begin(9600); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); digitalWrite(13, 0); } void loop() { if (millis() - last_timeR > 1000) { last_timeR = millis(); Serial.println(" прошла 1 секунда "); digitalWrite(10, ledR); ledR = ! ledR; } if (millis() - last_timeG > 2000) { last_timeG = millis(); Serial.println(" прошло 2 секунды "); digitalWrite(11, ledG); ledG = ! ledG; } if (millis() - last_timeB > 3000) { last_timeB = millis(); Serial.println(" прошло 3 секунды "); digitalWrite(12, ledB); ledB = ! ledB; } }
@elenapoplos9537
@elenapoplos9537 3 жыл бұрын
Спасибо за видео и попутного ветра
@user-kf7nj7vv3d
@user-kf7nj7vv3d 6 жыл бұрын
спасибо alex. millis() работает. но как сделать чтоб задержка срабатывала в начале цикла loop() при включении микроконтроллера. по примеру сначала выполнение условия а потом идёт задержка то есть 1 пауза 1 пауза и т.д как сделать пауза 1 пауза 1 пауза 1 и т.д.. alex буду особенно признателен за ответ
@volkavenu
@volkavenu 3 жыл бұрын
жаль что часто алекс читает комменты по типу: классное видео, круто. А реальные вопросы к видео остаются незамеченными...
@ArduNotes
@ArduNotes 3 жыл бұрын
к сожалению в ютубе нет такого фильтра на коменты и читать приходится всё =) на реальные вопросы к видео в 90% случаев ответ находится в видео
@volkavenu
@volkavenu 3 жыл бұрын
@@ArduNotes Интересно, как это так что ты почти сразу отвечаешь на мои комменты??? В третий раз уже. Это ты получается заходишь посмотреть коменты и из последних мой комент попадается? Или как?) Кстати я сначало начал учиться по курсу Радиолюбителя TV, потому что у него больше видео и проще. Но вскоре я понял что ничего не понял и изучаю теперь твои уроки вроде все понимаю хорошо. Надо было сразу так)
@Emmet_Brown
@Emmet_Brown Ай бұрын
Так как время срабатывает на миллисекунду позже, я сделал if(millis() - last_time > 5000 - 1), хотя наверное как сказано ниже будет лучше if(millis() - last_time > 4999) чтобы была меньше нагрузка на процессор микроконтроллера. А функция micros() вызывает какие-то перевернутые вопросы, уже больше получаса не могу исправить, код с micros настолько же прост как с millis
@user-bn7dx4ds8v
@user-bn7dx4ds8v Жыл бұрын
со скетчем не поможете ? что бы серво 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-hi1qd2jr4d
@user-hi1qd2jr4d 4 жыл бұрын
Как сделать так, чтобы ограничить действие например: Нажать кнопку можно только раз в час и действие будет производиться только раз в час! Например: Наливаем воду в стакан, нажал кнопку стакан наполнился, но при повторном нажатии оно реагировать не будет пока не пройдет час.
@AlexeyLitvinov
@AlexeyLitvinov 5 жыл бұрын
при первом заходе в if не понятно чему будет равен last_time. его нужно где-то определить
@user-ue7kz4lq3k
@user-ue7kz4lq3k 5 жыл бұрын
он при объявлении автоматически инициализируется нулём
@user-oy1sq7mc4d
@user-oy1sq7mc4d 7 жыл бұрын
Сидел игрался с шим приходит сообщение о новом видио. Попробовал использовать вместо delay(10); Вот что получилось void loop() { int x = 1; for (int i = 0; i > -1; i = i + x) //В цикле увеличиваем значение i на величину х { if (millis()-lfst_tim >32000); // Это вместо задержки delay(10) { lfst_tim=millis(); analogWrite(LedPin3, i); // Функция analogWrite(,) зажигает диод со значением i if (i == 255) x = -1; // переключение управления на максимуме //delay(10); //Эту команду не выполняем имхо заремлено } } } Таймер вставляем внутрь цикла иначе у вас будер задержка перед работой цикла
@SaleyAlexey
@SaleyAlexey 7 жыл бұрын
класс, только редко выходят видео...
@ArduNotes
@ArduNotes 7 жыл бұрын
+Алексей Салей зато на основном канале часто))
@SaleyAlexey
@SaleyAlexey 7 жыл бұрын
Заметки Ардуинщика а какой основной канал, а то я тут новичок. Только подписался...
@beyondgodlike_
@beyondgodlike_ 7 жыл бұрын
AlexGyver
@SaleyAlexey
@SaleyAlexey 7 жыл бұрын
Уже нашёл, но там про ардуино ничего нет, а интересна эта тема, а не любые видео лишь бы часто...
@ArduNotes
@ArduNotes 7 жыл бұрын
а там и не любые, там всё очень круто
@user-cq7nj7un5e
@user-cq7nj7un5e 6 жыл бұрын
Алекс а могли бы Вы снять видио с разбором где в одном скейче выполняются две операции например открываем серво привод по температуре и закрываем соответсвено по ней, и также по времени к примеру два раза в день включалось рэле минут на 5-10 . и соотвествено я так понимаю тут уже нужны часы реального времени.
@nursultansulaymanov
@nursultansulaymanov 6 жыл бұрын
не могу найти видео со спящим режимом. или такого выпуска еще не было?
@miid1693
@miid1693 6 жыл бұрын
Очень непросто вникнуть в эти видеоуроки даже о простом. Параллельно открываю гугл и за минуту переосмысливаю без проблем. Уж, не сочтите за дерзость! Всё равно лайк
@tashkent1133
@tashkent1133 7 жыл бұрын
Полезно, спасиб
@user-qm3be1dm4u
@user-qm3be1dm4u 6 жыл бұрын
Эта конструкция за миллисекунду два-пять раз выполняется: void loop() { if ((last_time = millis()) % 1000 == 0) { Serial.println(last_time); } } А вот это работает как надо: void loop() { if (millis() == (last_time+1000)) { last_time = millis(); Serial.println(last_time); } } Либо так: void loop() { if ((last_time = millis()) % 1000 == 0) { Serial.println(last_time); } delay(1); } И еще, почему-то условие if (millis() % 1000 == 0) {} выполняется при mills=1000,1001;2000,2001;3000;3001;и т.д.... т.е 1001 % 1000 == 0. Почему так?
@maxichannel9080
@maxichannel9080 4 жыл бұрын
Алекс Гайвер, скажите, почему в этой от конструкции (в низу) "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");
@unclevakkh
@unclevakkh 6 жыл бұрын
конструкция мне пригодилась if (millis() - last_time > 1000) { last_time = millis(); //что делать); Спасибо!
@YeahMadeit_17
@YeahMadeit_17 3 жыл бұрын
А зачем перед last_time ставить "-" ? Автор не объяснил
@user-wd3ji1pw3m
@user-wd3ji1pw3m 6 жыл бұрын
А этот код по идее корректно работать будет около 50 суток ведь так? По идее надо еще проверку поставит что millis()- last_time>0
@Valigozi
@Valigozi 4 жыл бұрын
Нет. Проверка "millis()- last_time>0" лишняя - уже ж есть проверка "millis() - last_time > 5000" которая полностью её замещает. Другими словами если какое-то число больше 5000, то оно и подавно будет больше 0.
@user-eu8kn6to2m
@user-eu8kn6to2m 4 жыл бұрын
@@Valigozi привет
@Valigozi
@Valigozi 4 жыл бұрын
@@user-eu8kn6to2m Привет! :)
@user-eu8kn6to2m
@user-eu8kn6to2m 4 жыл бұрын
@@Valigozi хочу сделать измеритель потребления на счетчик на Ардуино. Там лампочка моргает, и каждые 3200 раз проходит 1квт/ч. И, измеряя, время между моргания и светодиода можно определять текущую подключенную нагрузку. фоторезистор будет и через транзистор логика. Думаю хватит скорости. Там светодиод 0.1с это 11квт, такой нагрузки не будет наверно, максимум 5 кат т.е. 0,5 с. На прерываниями делать, если то как измерить время между прерываниями? Как идея?
@Valigozi
@Valigozi 4 жыл бұрын
​@@halyapin Нет. И тип переменной "last_time" и тип возвращаемого функцией "mills()" - "unsigned long" (беззнаковое целое), поэтому результат вычитания тоже будет типа "unsigned long", а число этого типа не может быть отрицательным *никогда*.
@Qapernik
@Qapernik 4 жыл бұрын
"переполнение millis" - это значит он в итоге остановится или в 0 уйдет? его перезапустить можно без рестарта?
@ArduNotes
@ArduNotes 4 жыл бұрын
Уйдет в 0, но конструкция с таймером продолжит отрабатывать интервалы. Максимально подробно написано тут alexgyver.ru/lessons/time/
@Qapernik
@Qapernik 4 жыл бұрын
@@ArduNotes благодарствую
@Helg1002
@Helg1002 5 жыл бұрын
я правильно понял, что по умолчанию переменной last_time присваивается значение 0 ? а то, что-то как-то непонятно :(
@Helg1002
@Helg1002 5 жыл бұрын
да да ... сам спросил, сам ответил - да 0
@yungfloppa
@yungfloppa 4 жыл бұрын
@@Helg1002 Хорош)))
@user-qp2hk1ib1y
@user-qp2hk1ib1y 7 жыл бұрын
А существуют ли переменные, для которых можно задать числовое значение, допусти kek== 1, kek ==2, для того, чтобы считать, например минуты
@volodysarasov
@volodysarasov 3 жыл бұрын
как сделать таймер на миллис что бы несколько светодиодов мигали каждый по своему времени ? покажите нужно для программы у меня там будет порядка 15 -20 задержек на миллс
@user-hp2bh4un8j
@user-hp2bh4un8j 2 жыл бұрын
не могу понять как работает переменная в круглых скобках unsigned long в операторе if (millis() - last_time > (unsigned long)23 * 24 *60 *69 100 ) для чего она там нужна ??
@guest7329
@guest7329 7 жыл бұрын
функция round там не нужна, потому что целочисленное деление
@user-rn8ld9kr1w
@user-rn8ld9kr1w 3 жыл бұрын
Нет. В данном случае- например: при делении 150/100 получается дробное число, которое нельзя проверить на кратность с 2
@stanislawsauer5295
@stanislawsauer5295 6 жыл бұрын
3:05 Мне эта конструкция показалась немного замудреной. Не проще ли было бы использовать деление с остатком? if((millis() % 5000) == 0){ // код для выполнени } так ненужно было бы каждый раз переменную переписывать, да и переменная вообще не нужна. Или % для Ардуино очень напряжен? (в плане ресурсов: такты, байты).
@horart9447
@horart9447 4 жыл бұрын
А разве millis это не число с плавающей точкой?
@no_name_user5458
@no_name_user5458 3 жыл бұрын
В таком случае ,если выполняется какая то полезная работа параллельно , то будут теряться миллисекунды и без остатка поделить не получится, пока делал проект , полностью это осознал.
@Ohdohd
@Ohdohd 7 жыл бұрын
нужно видео про спячку ардуины!!!
@netadmin8262
@netadmin8262 Ай бұрын
А у меня код "if ( round (millis() / 100) % 2 == 0)" вообще не работает, пишет что "invalid operands of types '__gnu_cxx::__enable_if::__type' {aka 'double'} and 'int' to binary 'operator%'", то есть оператор % применим только к типу данных int а не double. Видимо на 8266 округление round возвращает не int.
@User050068
@User050068 7 жыл бұрын
Расскажи как выводить информацию на сдвоенный (x3, x4 итд) семисегментный индикатор и чем отличается способ с одиночными индикаторами и сдвиговыми регистрами. И как на SD-флешке создавать файл с логами. Не обязательно в ближайшем видео, а вообще когда-нибудь
@user-wz3pi6ls4t
@user-wz3pi6ls4t 4 жыл бұрын
А теперь поподробнее, пожалуйста. Как в данный скетч #define BUZZER 10 #define SENSOR 111 unsigned long last_time; //Переменная для хранения void setup() { pinMode(BUZZER, OUTPUT ); digitalWrite( BUZZER,HIGH); Serial.begin(9600); } void loop() { if (millis() - last_time > 1000) { last_time = millis(); Serial.println ( "1 second" ); } if (SENSOR < 100) { digitalWrite(BUZZER,LOW); delay(1000); digitalWrite(BUZZER,HIGH); delay(1000); } } вставить millis вместо delay(1000); ?
@viktoroleks9664
@viktoroleks9664 Жыл бұрын
Привет всем, скажите пожалуйста кто нибудь, как реализовать мою простую задачу. Мне нужно чтоб после нажатия на кнопку и удержании её, на каком-то цифровом Пине появился HIGH потенциал но с задержкой в секунду. Но только при нажатой кнопке.
@vladilion90
@vladilion90 2 ай бұрын
А если счётчик переполнится? И наш Last_time будет равен 4.294.966.000 допустим то код будет выглядеть так, millis опять стал 0 и будет (0 - last_time(4.294.966.000) > 1000) , так получается что условие больше не выполнится или будет выполнять я раз в 50 суток? И надо будет перезапускать МК? Или как это работает?
@chinarulit1126
@chinarulit1126 Жыл бұрын
А можно к фукции millis присвоить своё значение? Иногда нужно ускорить или пропустить счет millis.
@user-mn1yf2td4y
@user-mn1yf2td4y Жыл бұрын
Можно! Где-то видел, не могу найти! Можно в библиотеке гайвера про энергосбережение и сон покапаться, там есть корректировка миллис. Но тебе то это зачем ?
@Perepodvyvert_s_perevorotom
@Perepodvyvert_s_perevorotom 2 жыл бұрын
Если внимательно рассмотреть конструкцию if (round(millis() / 100) % 2 == 0) {some code...} то мы увидим, что состояние TRUE наступает НЕСКОЛЬКО РАЗ ПОДРЯД!!! Тогда как в классической конструкции if (millis() - tmr > 1000) {tmr=millis(); some code...} состояние TRUE отрабатывается ровно один-единственный раз. -=- Имейте это в виду, а то будете дооолго код дебажить.
@Perepodvyvert_s_perevorotom
@Perepodvyvert_s_perevorotom 2 жыл бұрын
Arduino UNO ====================================== Кусок вывода в терминал вот такого кода: 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 То есть даже без округления метод лажает.
@RusNovgorod
@RusNovgorod 6 жыл бұрын
Доброго времени. Правильно ли я тогда понимаю, что для использование в слайдере для таймлапс, (это когда фотокамера установлена на слайдере и должны происходить два действия. Камера смещается на заданное расстояние, к примеру на один или два шага двигателя, останавливается, срабатывает затвор камеры. Камера вновь перемещается и так до края слайдера.) необходимо использовать millis()?
@user-bs4jn3ms8h
@user-bs4jn3ms8h 4 жыл бұрын
Alex, подскажи а как с помощью "millis()" реализовать моргание надписи на дисплее с настраиваемыми временами. Например: 1 сек. индикации, 1 сек. паузы? Ну типа аналог стандартного блинка, только без использования "delay". Спасибо.
@alisaguestfromthefuture
@alisaguestfromthefuture 7 ай бұрын
Получается,Миля работает параллельно со всеми другими до и после командами в скетчи. А мне бы её бы остановить после первого выполнения А когда скетч по кругу пойдёт дальше ,снова миля. Как бы это сделать
@user-sf4em7vw9y
@user-sf4em7vw9y 7 жыл бұрын
с какого именно момента начинается работа счетчика? с первой строчки в void setup?
@asciipi3679
@asciipi3679 7 жыл бұрын
всё равно задержки получаются через одно место( хоть бери плату с дуинкой и пиши в кристал код на сях под авр расчёт таймингов это пожалуй самое слабое место ардуин я это прочувствовал пару месяцев назад
Уроки Ардуино #3 - условный оператор if и оператор выбора
5:55
Parenting hacks and gadgets against mosquitoes 🦟👶
00:21
Let's GLOW!
Рет қаралды 12 МЛН
Фишки Arduino, о которых ты не знал!
13:37
Заметки Ардуинщика
Рет қаралды 110 М.
Сравнение с функцией millis()
13:34
Arduino и прочие питомцы
Рет қаралды 17 М.
Arduino millis() function: 5+ things to consider
12:49
Programming Electronics Academy
Рет қаралды 138 М.
LCD1602 - это очень просто!
22:19
Гневисть
Рет қаралды 142 М.
Уроки Ардуино. Прерывания по таймеру
9:04
Заметки Ардуинщика
Рет қаралды 106 М.
Китайские тестеры компонентов - какой выбрать?
11:14
Заметки Ардуинщика
Рет қаралды 296 М.
Big Stepper Motors with Arduino
29:43
DroneBot Workshop
Рет қаралды 1,2 МЛН