Уроки Arduino #4 - функции времени
Вставка
- Опубліковано 14 бер 2017
- В этом уроке мы с вами научимся пользоваться временнЫми функциями 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 - Наука та технологія
Хорошее видео.
Замечу лишь, что кормить животных раз в 23 дня чересчур расточительно)
@Тарас Атавин Jl9 ну нах крокодила кормить
@Тарас Атавин Гениально)
смотрю по лайкам , все меньше и меньше людей доходят до следующих курсов , но у вас самое доходчивое и понятное обьяснение среди всех.. от души благодарю..вы лучший учитель
Качество уроков на высоте , приятно слушать и не засыпаешь , вот только без практики это всё забудется
2:17
Прошу заметить, что
выражение: if(millis() - last_time > 5000){}
Срабатывает на 1 миллисекунду позже указанного, поэтому правильнее ставить ">="
Мля , на миллисекунду полив позже сработал, цветы уже завяли)))
дельное замечание, спасибо
После этой команды идёт код, который тоже занимает время, поэтому значение last_time будет кратно этому числу, таким образом погрешность может быть ещё больше
Сколько миллисекунд ты писал этот коммент?)
@@yeru6427 хороший вопрос)
очень хорошо объясняете! пишите примеры,хорошо подготавливаетесь,прям сразу хочется все это слушать! Все записываю в блокнот,от души спасибо! :)
Очень полезное видео! спасибо за труды!!!
Спс большое за уроки. Только побольше бы:) Самые понятные уроки из тех что я видел.
Спасибо большое . Я не программист но Ваш урок мне очень помог создать скетч для управления пиролизным котлом.
КРУТО!!!!!!!!!!!!! Спасибо!!! И как всегда что то новенькое, там где казалось и так все понятно. У тебя талант всякие вкусности выдавать!!!
а в чём проблема молодой человек?
Круто! Самый лучший канал по ардуино
Это великолепнейший цикл уроков. Теперь он всегда у меня в закладках. Все время чего нибудь да забуду. Спасибо тебе за все. А можно в тебя денюжкой что-ли кинуть, чтобы можно было с уверенностью ждать новых выпусков (на обоих каналах(но хотелось бы побольше обучалок по ардуино ))
Спасибо большое за информацию. Практически все легко и приятно глазу. Я раньше только знал как папку создать а сейчас чуть больше чем ранее 🤗
Спасибо вам за столь полезные видео!!!
Спасибо, жду видео с уходом дуины в спящий режим)
Дождался
Отлично ведешь уроки.
Продолжай!!!!
Спасибо большое!!! Очень познавательное видео!
побыстрее бы следующие видео, очень понравилось
Хорошо бы рассказать про таймер, в видео показана циклическое выполнение действия. А хотелось бы послушать про таймер - запуск таймера по событию, событие по окончанию работы таймера.
Знаю, что поздновато, но почему нельзя просто взять и в цикле прописать изменения цифры по истечению одной секунды например? Типа: пока не нажали "стоп", будем считать количество секунд и выводить их на экран, а потом, если итоговое значение меньше ожидаемого - выведем надпись: "вы слишком жирный, кэп! Бегите быстрее" ^_^
@@0neme760 а каким способом вы хотите реализовать данный таймер: внутренним таймеров Atmega328 или же функцией Delay?
Не забывайте, что и без вашего участия в микроконтроллере всегда отсчитываются такты, а оно же и время. Просто вы должны научиться использовать это.
@@vladimirlee5928 Это прекрасно! Приведите пример и мы все чему-то научимся. Лично я использовал таймер Атмега, ибо, как говорилось в видео, делэй тупит все выполнение программы, на самолетиках его использовать нельзя. Ну или на каком-нибудь самодельном ИВЛ )
@@0neme760 Погодите. Здесь нам нужно определиться. Вы используете голый процессор или ардуино? Из первого вашего комментария мне было не понятно. Поэтому я и говорю, что в Ардуино уже автоматически таймер настроен который считает время millis() и micros(), а в голом микроконтроллере таймеры нужно настраивать самостоятельно уже.
@@vladimirlee5928 с голыми контролерами я почти не работал. В данном случае ардуино
Ура, новый выпуск!
так просто и так гениально!! ты меня выручил)))
Спасибо за видео, оч помогло для моего проекта)
Классный ролик получился!
2:50 Вот оно!!!! то, не зная чего я не смог перейти на ардуино с промышленных контроллеров! Теперь можно продолжить экезекуцию. Спасибо!
спс за видео Алекс👍🏻 как раз таки не понимал эти задержки. Доходчиво объяснил, успехов!!! Будет возможность сделай видос про многозадачность. Спасибо!)
Спасибо, мне очень нужно описание работы millis
Спасибо за подсказку как сделать многозадачность.
Про кратность подумал когда поставил видосик на паузу и разбирал, а потом ты сам продемонстрировал этот вариант)
Алекс, у тебя получаются очень лаконичные уроки. Все четко и по делу: Круто!
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);
Я что то не пойму нифига(((
мне кажется последний однострочный вариант содержит несколько ошибок.
1. для приведение к секундам выполняется деление на 100 (хотя голосом все правильно сказал - делить надо на 1000).
2. из-за округления код срабатывает гораздо чаще чем нужно. например если millis() вернет 6405 или 6425 после округления получится одно и то же - в результате несколько запусков в одном интервале
все верно. Округляем при выводе на экран ) Serial.println(round(last_time / 1000));
@Тарас Атавин
А по-русски: в реальном условии - не округляем.
Она и без округления лажает.
Вредная штука, если бездумно использовать.
Кусок вывода в терминал вот такого кода:
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
@Тарас Атавин
Если надо объяснять - то не надо объяснять.
@Тарас Атавин
Вам ближе по-украински.
Если при компиляции скетча с последним примером вылетает ошибка: "invalid operands of types 'double' and 'int' to binary 'operator%" можно записать так: "if (int (round(millis() / 300)) % 2 == 0)"
PS Огромное Спасибо за уроки!!!
3:24 кормить кота раз в 21 день)))
@Тарас Атавин Ебать! Я прозрел!
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
WakeUp4L1fe
а вконце пример с переменной нексттайм, направление знака неравенства не перепутан?
Спасибо, поправил
+WakeUp4L1fe спасибо! Добавлю в методичку
В таком случае, когда nextTime переполнится, условие if (nextTime
xumux
тоже верно.
может можно в таких случаях както перегрузить ардуину раз в 50дней?
или использовать модуль, вроде одно ложное срабатывание, а не постоянное.
Полезно, спасиб
Спасибо, ты помог мне с пересчетом данных в лупе датчика INA226 через 1/3 сек. А то delay(300) тормозила всю общую прогу, даже часы и те останавливались на 1/3 сек. Теперь пересчет и отображение характеристик тока отображается, как и нужно для нормального восприятия, а не бегущие цифры после запятой. (моя паяльная станция) .
Эх, жаль нельзя сразу два лайка поставить :) То что нужно и как раз вовремя для моей программы :)
Спасибо тебе огромное! Очень полезные видео) Начав смотреть твой канал тоже решил себе заказать ардуино)) И организовать на нем кормилку для котов)
Сдохнет твой кот. Имхо в кормилку из холодильника кто то тоже должен класть еду. Можно конечно пойти дклее и автоматизировать процесс достования из холодильника. Затем создаётся робот который ходит в магаз и покупает жратву коту и кормит кота. есть шанс стать миллионером ))))))
Спасибо за дельный совет от водителя такси:) А делать выводы по одному предложению у Вас очень хорошо получается... Кто то сказал что она будет полностью автоматической? если бы я мог собрать такую хрень - то уже давно был бы миллионером, а пока просто стоит задача чтоб коты могли жрать днем пока дома никого нет.
Спасибо за видео и попутного ветра
Ещё не посмотрел, а лайк поставил)
Привіт друже, ремарка long та int займать однакових 4 байта.А от long long 8 байт)Дякую тобі за твою титанічну роботу. Удачі:)
Хороший видео урок! Возможно, для новичков, стоило указать, что если мы не присваиваем переменной число, то в ней, как правило, по умолчанию хранится 0. Таким образом last_time , в начале, хранит 0, а по достижении millis() 5000 перезаписывается на 5000 и т.д.
да, как раз на этом комментарии вопрос и отпал :)
Мне пришло просто сто раз пересмотреть, и тупо догадаться и представить что именно так и должно быть.
Ошибка всех обучалок, автор некоторые моменты умалчивает, забывает что люди не умеют читать мысли
@@Mr.Drug. может он верил что Кто то смотрет все видео А в каком то с прошлых Он говорыл Что Переменая изначально 0 если ми ничего не указали.Хотя мог повторить мейби
Alex, подскажи а как с помощью "millis()" реализовать моргание надписи на дисплее с настраиваемыми временами. Например: 1 сек. индикации, 1 сек. паузы? Ну типа аналог стандартного блинка, только без использования "delay". Спасибо.
Сделай урок по прерываниям
По мере увеличения числа в миллис, контроллер не начинает тормозить?
нет. это отдельный блок в микроконтроллере.
Доброго времени. Правильно ли я тогда понимаю, что для использование в слайдере для таймлапс, (это когда фотокамера установлена на слайдере и должны происходить два действия. Камера смещается на заданное расстояние, к примеру на один или два шага двигателя, останавливается, срабатывает затвор камеры. Камера вновь перемещается и так до края слайдера.) необходимо использовать millis()?
А существуют ли переменные, для которых можно задать числовое значение, допусти kek== 1, kek ==2, для того, чтобы считать, например минуты
Ты так внятно объясняешь за 5 минут, не же ли нудные лекции училки 45мин.))))
Сделай видео о том как подключить камеру к ардуино
Расскажи как выводить информацию на сдвоенный (x3, x4 итд) семисегментный индикатор и чем отличается способ с одиночными индикаторами и сдвиговыми регистрами. И как на SD-флешке создавать файл с логами. Не обязательно в ближайшем видео, а вообще когда-нибудь
как поступить, если нам нужно, чтобы часть программы срабатывала раз в 5 сек? Ведь часть, которая ниже if(millis)...может выполняться больше 5 сек
с какого именно момента начинается работа счетчика? с первой строчки в void setup?
У последнего предложенного варианта с целочисленным делением минус в том, что если время срабатывания по каким-либо причинам пропустится (остальной код долго выполнялся, или в нем был delay()), то тело условия не сработает, что может вызвать ошибки. Первый вариант сработает и при опоздании.
Последний способ просто класс!! Блин лет 5 на си пишу - никогда подобную конструкцию не использовал. Мне стыдно...очень((
нужно видео про спячку ардуины!!!
спасибо alex. millis() работает. но как сделать чтоб задержка срабатывала в начале цикла loop() при включении микроконтроллера. по примеру сначала выполнение условия а потом идёт задержка то есть 1 пауза 1 пауза и т.д
как сделать пауза 1 пауза 1 пауза 1 и т.д.. alex буду особенно признателен за ответ
не могу найти видео со спящим режимом. или такого выпуска еще не было?
Алекс а могли бы Вы снять видио с разбором где в одном скейче выполняются две операции например открываем серво привод по температуре и закрываем соответсвено по ней, и также по времени к примеру два раза в день включалось рэле минут на 5-10 . и соотвествено я так понимаю тут уже нужны часы реального времени.
Вот теперь точно понятно))) Хоть один человек смог нормально объяснить.
Подскажите, пожалуйста, а как сделать, если мне надо чтобы светодиод загорелся на 5 секунд только, а не по циклу?
Т.е. взяли с какого-то датчика данные и если какое-то условие сработало, то мне надо чтоб светодиод загорелся только на 5 секунд?
Спасибо.
Подскажите пожалуйста. Гавер в видосе объявил переменную last_time типа unsigned long, но не указал значение. Дальше ты вроде бы как не присваивал её значения. Как понять чему равна переменная last_time. 2:02
Typical ,он не указал значение ,он просто объявил last_time как переменную(можно сказать равна нулю),Millis- время после включения ардуино.Теперь условие : когда время после включения - 0 станет > 5000, то выполняется условие и мы перезаписываем last_time ( last_time= Millis=5000)и когда получается что last_time=5000, то не выполняется условие и мы ждём когда пройдёт ещё 5секунд (тогда будет Millis будет равен 10000 и будет снова выполнятся условие)и так бесконечно и при этом остальной код тоже выполняется
при первом заходе в if не понятно чему будет равен last_time. его нужно где-то определить
он при объявлении автоматически инициализируется нулём
Здравствуйте. Почему функции round нет в справочниках по ардуино ?
Почему в последнем примере в связке if else отсутствуют фигурные скобки?
можно ли просить у вас совета по скетчам?
со скетчем не поможете ? что бы серво 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).
Привет всем, скажите пожалуйста кто нибудь, как реализовать мою простую задачу.
Мне нужно чтоб после нажатия на кнопку и удержании её, на каком-то цифровом Пине появился HIGH потенциал но с задержкой в секунду.
Но только при нажатой кнопке.
в место delaymicroseconds() лучше использовать delay_us() на малых значениях параметров, экспериментировал на своей ардуино мега 2560 + осциллограф : delaymicroseconds(1) дает задержку около 20 микросекунд насколько я помню, а вот delay_us(1) дает задержку в 5 микросекунд ровно, даже фронты более менее в норме.Главный цикл loop не использовал, просто дергал ногой в while цикле, так быстрее всего.
+Alexei Belousov спасибо, добавлю в пособие
@@ArduNotes в PDF версии 1.1 (от 15.01.2019) нет ничего про delay_us - почему? не работает? забыли?
С 23 сутками не будет работать правильно... Сработает условие на 23й день, потом на 46й, а потом через 4 дня (на 50е сутки) сбросится миллис и пройдёт ещё 23 суток до условия, и того 27 дней до выполнения условия.
А что если добавить проверку переполнения переменной и в случае такового события присваивать переменной значение равное пройденным 4 дням?
Нет, все правильно будет работать. Там другая математика, отрицательных чисел нет, смотрите урок "математические операции". Числа идут по кругу, почти как на циферблате часов. Если считать в днях, то после 50 идёт 0, и наоборот перед 0 будет 50. То есть 0-1=50! 0-2=49,...0-46=5! А 18-46=23>=23 условие выполнилось на 18 день после перехода через 0. То есть через 23 дня! Только считать надо в миллисекундах
Для понимания почему нужно использовать именно unsigned long , полезно было бы объяснить, что происходит при переполнении переменной.
Алекс а в примере с "дебонсом" во втором if такую строчку " && millis() - last_press > 100 " тоже надо ?
нет, если кнопка отпущена, то она отпущена, дребезга при отпускании не будет
совсем заработался я , этот вопрос задавал для 6 урока . Главное , что ты понял .
Низкий поклон тебе за науку !
+Заметки Ардуинщика
Ну не знаю, у меня кнопка при отпускании срабатывает
А если счётчик переполнится? И наш Last_time будет равен 4.294.966.000 допустим то код будет выглядеть так, millis опять стал 0 и будет
(0 - last_time(4.294.966.000) > 1000) , так получается что условие больше не выполнится или будет выполнять я раз в 50 суток? И надо будет перезапускать МК? Или как это работает?
Алекс Гайвер, скажите, почему в этой от конструкции (в низу) "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");
как сделать таймер на миллис что бы несколько светодиодов мигали каждый по своему времени ? покажите нужно для программы у меня там будет порядка 15 -20 задержек на миллс
А этот код по идее корректно работать будет около 50 суток ведь так? По идее надо еще проверку поставит что
millis()- last_time>0
Нет. Проверка "millis()- last_time>0" лишняя - уже ж есть проверка "millis() - last_time > 5000" которая полностью её замещает. Другими словами если какое-то число больше 5000, то оно и подавно будет больше 0.
@@user-bk9bj8hf5j привет
@@user-eu8kn6to2m Привет! :)
@@user-bk9bj8hf5j хочу сделать измеритель потребления на счетчик на Ардуино. Там лампочка моргает, и каждые 3200 раз проходит 1квт/ч. И, измеряя, время между моргания и светодиода можно определять текущую подключенную нагрузку. фоторезистор будет и через транзистор логика. Думаю хватит скорости. Там светодиод 0.1с это 11квт, такой нагрузки не будет наверно, максимум 5 кат т.е. 0,5 с. На прерываниями делать, если то как измерить время между прерываниями? Как идея?
@@halyapin Нет. И тип переменной "last_time" и тип возвращаемого функцией "mills()" - "unsigned long" (беззнаковое целое), поэтому результат вычитания тоже будет типа "unsigned long", а число этого типа не может быть отрицательным *никогда*.
cool
конструкция мне пригодилась
if (millis() - last_time > 1000) {
last_time = millis();
//что делать);
Спасибо!
А зачем перед last_time ставить "-" ? Автор не объяснил
Очень бы хотелось увидеть урок 4.1 "борьба с переполнением переменной / обновлением millis"...
+Вячеслав Бард в пособии в пдф все написано
Пошел изучать. Спасибо!
Проштудировал, но там не нашел универсального решения.
Там ведь все то, что было здесь в комментариях.
Оба варианта не предусматривают ситуацию, когда отсчет начался перед самым достижением предельного значения (допустим за 5 секунд до обнуления millis), а отсчитать должен ровно 60 секунд. Один вариант подгонит переменную к 0 и сработает раньше времени, другой прибавит слишком много и не будет достигнут ни когда.
Вариант только писать еще более изощренную логику с прибавлением времени и проверкой на переполнение, если проверка не пройдена - менять...
Что-то вроде:
if((nextTime 4294967295){
nextTime = nextTime-4294967295;
}
}
Но эта конструкция может дать сбои, если nextTime будет равен 4294967295 или на пару милисекунд меньше. Тогда контроллер пропустит срабатывание...
@@Werbard Нашли способ решения проблемы? :)
@@yungfloppa при переполнении переменная переходит через ноль. Вариантов два. Если не критично - забить, будет просто двойное срабатывание. Если критично - проверять после присвоения значения и делать соответствующие поправки.
"переполнение millis" - это значит он в итоге остановится или в 0 уйдет? его перезапустить можно без рестарта?
Уйдет в 0, но конструкция с таймером продолжит отрабатывать интервалы. Максимально подробно написано тут alexgyver.ru/lessons/time/
@@ArduNotes благодарствую
Давай новый видосик про эту тему только с учетом комментарии и объяснением с примером физическим)
А можно к фукции millis присвоить своё значение? Иногда нужно ускорить или пропустить счет millis.
Можно! Где-то видел, не могу найти! Можно в библиотеке гайвера про энергосбережение и сон покапаться, там есть корректировка миллис. Но тебе то это зачем ?
3:05 Мне эта конструкция показалась немного замудреной. Не проще ли было бы использовать деление с остатком?
if((millis() % 5000) == 0){
// код для выполнени
}
так ненужно было бы каждый раз переменную переписывать, да и переменная вообще не нужна. Или % для Ардуино очень напряжен? (в плане ресурсов: такты, байты).
А разве millis это не число с плавающей точкой?
В таком случае ,если выполняется какая то полезная работа параллельно , то будут теряться миллисекунды и без остатка поделить не получится, пока делал проект , полностью это осознал.
не могу понять как работает переменная в круглых скобках unsigned long в операторе if (millis() - last_time > (unsigned long)23 * 24 *60 *69 100 ) для чего она там нужна ??
а как сделать допустим я подаю на один пин логическую 1 а на выходе мне надо что бы выходила логиеская еденица и длилась она 4 секунды!!!
я правильно понял, что по умолчанию переменной last_time присваивается значение 0 ?
а то, что-то как-то непонятно :(
да да ... сам спросил, сам ответил - да 0
@@Helg1002 Хорош)))
Как посчитать сколько миллисекунд нажата кнопка на ардуино с помощью таймера?
А можно с помощью millis мигалку сделать?
Компилятор IDE 1,8,8 ругается на оператор умножения. Как исправить?
а как будет работать выражение
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
условие не выполнится
или тут что-то работает по другому?
Произойдет переполнение переменной и все будет нормально
Может кому то пригодится, скетч посылает значения в монитор порта от 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
Каков бы не был период срабатывания 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 дня
}
}
не понял одно сегодня Использовал этот участок кода.. поставил для датчиков температуры и атмосферного давления. через каждые 10 минут .. Что будет при переполнении счетчика millis
Ничего
В самом конце видео показан код(с lolo 1 и lolo2), где программа проверяет кратность числа - 2, немогу понять почему он работает, если после оператора if нет фигурных скобок - {}, может кто-нибудь объяснить?
Зачем фигурные скобки, если там после if только один оператор?
на millis() -ах луче код работает т.к. когда я взял на % ардуина как бешеная просчитывает, на примере вкл. выкл. светодиода она истерично промигивалась пропускала / глючила ( ну код постоянно ломился через условие == 0 , а когда millis() и знак > но верняк всё чётко стабильно , спс . И го побольше простых гайдов без библиотек , по возможности , что бы можно было понять суть кода? я пытался изложить мысль как смог. Как по датчику ардуину будить, и по этому же дачику ( света) ложить спать ?
Как сделать так, чтобы ограничить действие например: Нажать кнопку можно только раз в час и действие будет производиться только раз в час! Например: Наливаем воду в стакан, нажал кнопку стакан наполнился, но при повторном нажатии оно реагировать не будет пока не пройдет час.