Максим, в ардуино так устроено, что при запуске программы на выполнение управление передается в функцию setup( ), в которой обычно производится инициализация всего что нам надо для работы. Она выполняется один раз и далее управление передается в функцию loop( ), в которой, как правило, мы делаем обработку в цикле, и в этом цикле постоянно работает наша программа. Выход из этого цикла означает выход из программы. Поэтому если вынести инициализацию переменной за пределы указанных функций, это место не получит управления. Для этого переменную Т надо инициализировать в одной из этих функций или в функции, которая вызывается из этих функций. И еще уточнение : в 17:50 у тебя оговорка - локальные переменные создаются не в цикле, а в теле функции, тогда они видны только внутри этой функции. В частности, когда мы создаем переменную в теле функции loop( ) она является локальной для этой функции.
Максим, такие задачи и более сложные имеют свой алгоритм. У Вас алгоритм в текстовой форме, легко запутаться. Хорошо составленный алгоритм это половина успеха, если не больше.
Все равно с millis осталось много темных мест по применению, таймер по переднему, заднему фронту, таймер при появлении сигнала на включение держит 5 секунд и выключается, таймер наоборот через 5 сек включает чтото, как организовать счетчики, счетчики моточасов, бутылок, сигналов, включений, можно конечно самому придумать, но если есть опытный преподаватель то КПД таких придумываний будет больше и это будет доступно всем, есть масса других простых вариантов уроков, управление с помощью МОСФЕТ и обычных транзисторов, реле, сейчас непосредственно для меня непонятно как организовывать параллельно много LOOP функций и объединять их в одной программе и конечно же все так же подробно разжевывать каждый такт происходящего. Автору большое спасибо за проделанный труд.
Добрый день. Было бы еще наглядней, если показать параллельную работу двух светодиодов, что с delay одновременно не получится, если включение или отключения светодиодов стоят в разных условиях, а перейдя на millis уже такое получится, т.к. программа не встает в паузу, а продолжает с такой же большой скоростью бегать по строчкам loop.
В качестве обучения можете реализовать такую систему и опубликовать в комментариях ссылку) всем было бы приятно посмотреть на разные варианты, а я мог бы дать обратную связь по качеству кода, если бы вы хотели такую получить) Новых видео я сейчас не записываю, так что простите если такая задумка не появится на моем канале :(
23:40 тут Вы говорите, что надо поместить last=!current; //присвоить последнему значению - кнопка отпущена. в функцию таймера, а в if(current != last) присвоить последнему значению - нажата last = current; или я что-то не так понял? Еще раз большое спасибо за Ваш труд!
Спасибо автору. но вопрос. Зачем "столько текста" если даже не можете написать код так как она должна выглядеть? Вот в начале вы говорите - функция Милис возвращает количество миллисекунд. ???? ВОЗВРАЩАЕТ ??? откуда и куда ??? Считает от начала запуска контроллера - Наверное ... но возвращает? Объясните пожалуйста
Извините :( Вызов любой функции может что то принимать и что то возвращать. Что функция делает знать не обязательно. millis() вернет количество миллисекунд с момента запуска микроконтроллера. Милисекунды считаются за счет аппаратного таймера и прерывания которое увеличивает буффер этих самых миллисекунд. Рекомендую указывать временную метку на проблемное место в видео, чтобы я мог хотябы найти :( А можете дополнительно разобраться и дополнить видео своим замечательным комментарием
@@maksymgrom1631 Простите просто "я в танке". 8 дней сижу над Ардуино и не могу ничего сделать. И здесь ваши уроки. По теме но очень длинные и я немного не сдержался. К сожалению я так до сих пор не могу понять как функция может что-нибудь возвращать? Принимать какое-то значение или менять его, выполнять ряд действий - ОК ПОНИМАЮ .... но все пишут возвращать ... я завис. Куда вернуть? Вы пишете: " millis() вернет количество миллисекунд с момента запуска микроконтроллера. " Я понимаю так - millis () внутренний счетчик который изначально есть. Мы не можем к нему что-нибудь добавить или обнулить его. И к нему можно обратиться в любое время чтобы узнать сколько прошло времени от запуска процессора. и это можно сделать множество раз в течение программы. Мы не сможем обнулить этот счетчик он просто считает. Я не прав? Так что эта функция возвращает?
@@anjeym0nblan89 Сложно подобрать формат который будет удобный для абсолютно всех зрителей И не менее сложно вести серию уроков с одной и той же подачей и имея первый опыт съемки видео на ютуб Так что уроки далеко не идельны и доп обработка там очень слабая, извините за такое качество обучающего материала и терпения в изучении :)
Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней будь добр быть компетентным
Для работы таймера это не существенная информация. Таймер считает относительное время, разница двух unsigned long вернет такой же тип данных. Я об этом говорил в этом курсе. Даже при переполнении результат будет одинаковый
Прошу помощи, пожалуйста разжуйте мне как это понять: stepTime = 1; void loop(){ millisStart = millis(); while(millis() - millisStart < stepTime){ do{ ... }while(условие) millisStart = 0L; } ... } плюс возможно увеличение / уменьшение stepTime во время выполнения кода. Как (millis() - millisStart < stepTime) может оставаться истиной, или когда оно может быть истиной?
Странный код, но после старта, цикл будет работать пока не пройдет время, т.е. Контроллер зациклится в этом месте на 1 мс. Потому что перед заходом в цикл была сохранена временная метка. В цикле уже будет считаться смещение времени от метки
как сделать таймер на миллис что бы несколько светодиодов мигали каждый по своему времени ? покажите нужно для программы у меня там будет порядка 15 -20 задержек на миллс
Помогите мне, нигде не могу найти ничего серьёзного по типу управления тремя реле одновременно по фиксированному времени. По типу одно реле переключается периодами: 18 часов включено и 6 выключено, а другое реле 12 включено и 12 выключено, а третье что бы сначала включалось раз в день периодами в несколько десятков минут (допустим 4 периода)!
теоретически это будет работать? Можно сделать так, чтобы считывало не деньги, а время и работал он с жетоноприёмником (не купюроприёмником)? Заранее спасибо!
@@themusic9676 По описанию в статье выглядит работоспособным. Опыта по изготовлению таких устройств у меня нет. Приемник жетонов или чего либо, или промо кодов, должен увеличивать счет в системе (желательно в энерго независимую память) При запуске включается таймер и минусует счет погласно времени, при достижении 0 аппарат должен быть остановлен. Водные автоматы работают по подобному принципу. На Ардуино такое сделать можно, и не трудно. Логика микроконтроллера довольно простая будет в этом случае. Возможно стоит подготовить такой прототип в качестве урока, но я сейчас загружен :(
@@maksymgrom1631 Если всё таки будет время, сделайте пожалуйста подробное видео (если будет не трудно мне ссилочку сбросите), я и не только будем весьма благодарны.
Только благодаря вашему ролику понял как работает millis
Максим, в ардуино так устроено, что при запуске программы на выполнение управление передается в функцию setup( ), в которой обычно производится инициализация всего что нам надо для работы. Она выполняется один раз и далее управление передается в функцию loop( ), в которой, как правило, мы делаем обработку в цикле, и в этом цикле постоянно работает наша программа. Выход из этого цикла означает выход из программы. Поэтому если вынести инициализацию переменной за пределы указанных функций, это место не получит управления. Для этого переменную Т надо инициализировать в одной из этих функций или в функции, которая вызывается из этих функций. И еще уточнение : в 17:50 у тебя оговорка - локальные переменные создаются не в цикле, а в теле функции, тогда они видны только внутри этой функции. В частности, когда мы создаем переменную в теле функции loop( ) она является локальной для этой функции.
Максим, такие задачи и более сложные имеют свой алгоритм. У Вас алгоритм в текстовой форме, легко запутаться. Хорошо составленный алгоритм это половина успеха, если не больше.
Все равно с millis осталось много темных мест по применению, таймер по переднему, заднему фронту, таймер при появлении сигнала на включение держит 5 секунд и выключается, таймер наоборот через 5 сек включает чтото, как организовать счетчики, счетчики моточасов, бутылок, сигналов, включений, можно конечно самому придумать, но если есть опытный преподаватель то КПД таких придумываний будет больше и это будет доступно всем, есть масса других простых вариантов уроков, управление с помощью МОСФЕТ и обычных транзисторов, реле, сейчас непосредственно для меня непонятно как организовывать параллельно много LOOP функций и объединять их в одной программе и конечно же все так же подробно разжевывать каждый такт происходящего. Автору большое спасибо за проделанный труд.
Спасибо огромное.Все прекрасно обьяснили.Удачных Вам проектов.
Здравствуйте, Максим! Очень нравятся ваши видео. А когда ожидать следующий урок?
Добрый день.
Было бы еще наглядней, если показать параллельную работу двух светодиодов, что с delay одновременно не получится, если включение или отключения светодиодов стоят в разных условиях, а перейдя на millis уже такое получится, т.к. программа не встает в паузу, а продолжает с такой же большой скоростью бегать по строчкам loop.
В качестве обучения можете реализовать такую систему и опубликовать в комментариях ссылку) всем было бы приятно посмотреть на разные варианты, а я мог бы дать обратную связь по качеству кода, если бы вы хотели такую получить)
Новых видео я сейчас не записываю, так что простите если такая задумка не появится на моем канале :(
@@maksymgrom1631 если доберусь до этого урока, до обязательно оставлю тут ссылку:)ввиду такой ситуацией пришлось и до съёмок дойти
23:40 тут Вы говорите, что надо поместить
last=!current; //присвоить последнему значению - кнопка отпущена.
в функцию таймера, а в if(current != last) присвоить последнему значению - нажата
last = current;
или я что-то не так понял?
Еще раз большое спасибо за Ваш труд!
Спасибо автору. но вопрос. Зачем "столько текста" если даже не можете написать код так как она должна выглядеть?
Вот в начале вы говорите - функция Милис возвращает количество миллисекунд. ???? ВОЗВРАЩАЕТ ??? откуда и куда ??? Считает от начала запуска контроллера - Наверное ... но возвращает? Объясните пожалуйста
Извините :(
Вызов любой функции может что то принимать и что то возвращать. Что функция делает знать не обязательно.
millis() вернет количество миллисекунд с момента запуска микроконтроллера. Милисекунды считаются за счет аппаратного таймера и прерывания которое увеличивает буффер этих самых миллисекунд.
Рекомендую указывать временную метку на проблемное место в видео, чтобы я мог хотябы найти :(
А можете дополнительно разобраться и дополнить видео своим замечательным комментарием
@@maksymgrom1631 Простите просто "я в танке". 8 дней сижу над Ардуино и не могу ничего сделать. И здесь ваши уроки. По теме но очень длинные и я немного не сдержался.
К сожалению я так до сих пор не могу понять как функция может что-нибудь возвращать? Принимать какое-то значение или менять его, выполнять ряд действий - ОК ПОНИМАЮ .... но все пишут возвращать ... я завис. Куда вернуть?
Вы пишете: " millis() вернет количество миллисекунд с момента запуска микроконтроллера. "
Я понимаю так - millis () внутренний счетчик который изначально есть.
Мы не можем к нему что-нибудь добавить или обнулить его. И к нему можно обратиться в любое время чтобы узнать сколько прошло времени от запуска процессора. и это можно сделать множество раз в течение программы. Мы не сможем обнулить этот счетчик он просто считает. Я не прав? Так что эта функция возвращает?
@@anjeym0nblan89 Сложно подобрать формат который будет удобный для абсолютно всех зрителей
И не менее сложно вести серию уроков с одной и той же подачей и имея первый опыт съемки видео на ютуб
Так что уроки далеко не идельны и доп обработка там очень слабая, извините за такое качество обучающего материала и терпения в изучении :)
Максим,приведите пример еще с абстракцией,пожалуйста
Добрый день
ruclips.net/video/F5h9jW21mwk/видео.html
Возможно урок с объектом даст больше информации
ПРИВЕТ АКАК ПРРСТПОСОБИТЬ ДЛЯ ИНКУБАТОРА ПЕРЕВОРОТ ЛОТКА И ПРОДУВ ВЕНТИЛЯТОРА ПРЕОДИЧЕСКИ К ПРМИЕРУ РАЗ В СУТКИ ИИ Л ДВА
Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней
будь добр быть компетентным
Для работы таймера это не существенная информация. Таймер считает относительное время, разница двух unsigned long вернет такой же тип данных. Я об этом говорил в этом курсе. Даже при переполнении результат будет одинаковый
Прошу помощи, пожалуйста разжуйте мне как это понять:
stepTime = 1;
void loop(){
millisStart = millis();
while(millis() - millisStart < stepTime){
do{
...
}while(условие)
millisStart = 0L;
}
...
}
плюс возможно увеличение / уменьшение stepTime во время выполнения кода.
Как (millis() - millisStart < stepTime) может оставаться истиной, или когда оно может быть истиной?
Странный код, но после старта, цикл будет работать пока не пройдет время, т.е. Контроллер зациклится в этом месте на 1 мс. Потому что перед заходом в цикл была сохранена временная метка. В цикле уже будет считаться смещение времени от метки
Контроллер будет обрабатывать только этот цикл пока там истина, код за пределами цикла будет игнорироваться
как сделать таймер на миллис что бы несколько светодиодов мигали каждый по своему времени ? покажите нужно для программы у меня там будет порядка 15 -20 задержек на миллс
В таймере нужно использовать функцию micros вместо millis т.е. таймер будет работать в микросекундах а не в милисекундах
Помогите мне, нигде не могу найти ничего серьёзного по типу управления тремя реле одновременно по фиксированному времени. По типу одно реле переключается периодами: 18 часов включено и 6 выключено, а другое реле 12 включено и 12 выключено, а третье что бы сначала включалось раз в день периодами в несколько десятков минут (допустим 4 периода)!
xxx_pussydestroyer_ 420blazeit_xxx посмотрите 19 - 21 уроки, как раз об этом
Наверно Сенсей дает только уроки....Вам не в детский сад нужно.
такие вещи на ура программируются codesys
Добрый день! Подскажите пожалуйста, как сделать чтобы две кнопки управляли двумя нагрузками через один таймер обратного отсчета?
Добрый день.
Можно более подробно описать логику?
@@maksymgrom1631 где-то так - habr.com/ru/post/320458/
теоретически это будет работать? Можно сделать так, чтобы считывало не деньги, а время и работал он с жетоноприёмником (не купюроприёмником)? Заранее спасибо!
@@themusic9676 По описанию в статье выглядит работоспособным.
Опыта по изготовлению таких устройств у меня нет.
Приемник жетонов или чего либо, или промо кодов, должен увеличивать счет в системе (желательно в энерго независимую память)
При запуске включается таймер и минусует счет погласно времени, при достижении 0 аппарат должен быть остановлен.
Водные автоматы работают по подобному принципу. На Ардуино такое сделать можно, и не трудно. Логика микроконтроллера довольно простая будет в этом случае. Возможно стоит подготовить такой прототип в качестве урока, но я сейчас загружен :(
@@maksymgrom1631 Если всё таки будет время, сделайте пожалуйста подробное видео (если будет не трудно мне ссилочку сбросите), я и не только будем весьма благодарны.
Чтобы понять про таймеры пришлось с 0 серии смотреть ))
Блин полный нудение
Максим, где можно скачать код вашей программы?
Ислам Урус в лаборатории, ссылка под видео, и там можно его скачать
Сайт с лабораторией переехал, добавляю обновленную ссылку + обновил описание видео
www.tinkercad.com/things/kk49SeOZpFU
Спасибо
у автора редкое отсутствие способностей что либо преподавать