Как выполнить 5 функций по очереди через 1 секунду с помощью millis()
- Войдите на сайт для отправки комментариев
Пнд, 19/10/2020 - 23:52
Как выполнить 5 функций по очереди через 1 секунду с помощью millis()?
unsigned long timer; void setup() { Serial.begin(9600); } void loop() { if (millis() - timer >= 1000) { Serial.println("Функция 1"); } if (millis() - timer >= 2000) { Serial.println("Функция 2"); } if (millis() - timer >= 3000) { Serial.println("Функция 3"); timer = millis(); } }
Пробовал такой способ, не получается.
опять ленивые студенты поперли...
опять ленивые студенты поперли...
Да не студент уже. :)
Вроде пишешь код как можешь, программирование тяжело дается. Вот обращаюсь к Вам знающим за небольшой помощью, редко даже, пытаюсь самостоятельно, учусь как силы и время есть.
P.S. Может даже этот ответ поможет многим новичкам и не будут вопросить ;)
vosara, Спасибо за помощь! Уважение и здоровья тебе!
Да не студент уже. :)
Вроде пишешь код как можешь, программирование тяжело дается.
так вы не на код, а на логику работы смотрите.
попробуйте переписать код, в котором будет счетчик на миллис и флаг исполнения... после каждого нового миллис меняем счетчик и ставим флаг, а после исполнения роняем флаг - таким образом событие будет выполняться только один раз. строк будет больше, за-то они будут ваши.
Да не студент уже. :)
Вроде пишешь код как можешь, программирование тяжело дается.
так вы не на код, а на логику работы смотрите.
попробуйте переписать код, в котором будет счетчик на миллис и флаг исполнения... после каждого нового миллис меняем счетчик и ставим флаг, а после исполнения роняем флаг - таким образом событие будет выполняться только один раз. строк будет больше, за-то они будут ваши.
Если использовать флаг, то будет выполнятся 2 действия, т.е. 2 функции вкл и выкл. Я так делал с помощью флага.
А вот чтобы выполнять цепочку функций последовательно, подсказали использовать оператор CASE.
Или можно как то использовать флаг не применяя оператор CASE.
Или можно как то использовать флаг не применяя оператор CASE.
Или можно как то использовать флаг не применяя оператор CASE.
Хм. Очень интересно, надо попробовать. Спасибо.
Если использовать флаг, то будет выполнятся 2 действия, т.е. 2 функции вкл и выкл. Я так делал с помощью флага.
А вот чтобы выполнять цепочку функций последовательно, подсказали использовать оператор CASE.
Или можно как то использовать флаг не применяя оператор CASE.
По сути дела, есть такое понятие, как конечный автомат. У конечного автомата есть переменная состояния. Вот флаг - это частный случай переменной состояния, когнда имеется всего два варианта действия. Ясли действий больше, то и переменная состояния может принимать бОльшее количество значений. Например, если функций - 3, то 3 значения. А если 3 функции и "останов" - то 4 значения и т.п.
В общем, книжки надо читать. Хотя конечный автомат - достаточно простая конструкция, до которой можно додуматься самостоятельно. Ну а если не получается, - остается только читать книжки.
Или можно как то использовать флаг не применяя оператор CASE.
Хм. Очень интересно, надо попробовать. Спасибо.
я бы чуток не так написал
Немного покумекал, вот так получилось, может быть так себе код, но работает.
Если нужно остановить цикл, в конце Функции 3 flag = 0;
ua6em, Спасибо, немного дописал код, изначально не работал. :)
Если интервел везде 1 сек, то можно и так:
Если интервел везде 1 сек, то можно и так:
так не пойдёт, мы не знаем время выполнения фунций, присваивать значение миллис надо после выполнения функции
пост 11 строка 18, 27, 36 - зачем? чтобы строк было больше? эти строки прикрасно ложатся в таймер т.к. он равномерный, в посте 10 просто пример, а вы даже не обдумали его. подумайте, что нужно дописать в строку 12 (пост11)?
на кой строки 20 и 29? что они делают? и как работает таймер который в строке 12 ? блин - элементарные вещи на уровне логики... включайте ее уже. Там от программирования ничего нет... Вы по английски читать умеете? так прочитайте и вникните - там почти сочинение, а не код
Если интервел везде 1 сек, то можно и так:
так не пойдёт, мы не знаем время выполнения фунций, присваивать значение миллис надо после выполнения функции
Мой код вообще не про это.
Таймер можно где угодно сбрасывать.
Если интервел везде 1 сек, то можно и так:
так не пойдёт, мы не знаем время выполнения фунций, присваивать значение миллис надо после выполнения функции
твой код вообще лаконичней, перечитал 1-й пост ( через 1 секунду...) и дальше без уточнений, в твоём примере, тактирование по переднему фронту, функций, если сбрасывать таймер в теле функции, после её окончания, то по заднему фронту, а как надо??? ТС, тебе как надо-то?
У нас С++ или что? Классы надо использовать! Классы!
Поосторожнее, господа. На классах Квон гешефт делает, а он - страшный человек.
До супер кода конечно не дорос, как написал asam в 17 посте. Вот простенький долепил для новичков самое то, с возможностью отключения выполнения всех функций, количество функций и функция зацикливания.
ну размахались. Чем короче тем лучше.
Предлагаю сократить код Кактуса - нафига у него две переменные, flag и counter, хватит и одной
УПС, сорри... получился код Восары из первого ответа :)
и чего вам всем не хватает в нем?
ну размахались. Чем короче тем лучше.
Предлагаю сократить код Кактуса - нафига у него две переменные, flag и counter, хватит и одной
УПС, сорри... получился код Восары из первого ответа :)
и чего вам всем не хватает в нем?
В том что этот не цикличный :)
В том что он не цикличный :)
какая же вам нужна цикличность? После выполнения третьей функции снова первую и так по кругу?? добавьте одну строчку - будет "цикличный"
В том что он не цикличный :)
какая же вам нужна цикличность? После выполнения третьей функции снова первую и так по кругу?? добавьте одну строчку - будет "цикличный"
Типа того, все правильно. Просто убрал этот код у Kakmyc дабы сократить. :) Ладно, все пучком и так много вариантов, думаю тут уже все настолько изжевано, что можно выбрать 3 варианта выполнений функций.
Ладно, все пучком и так много вариантов, думаю тут уже все настолько изжевано, что можно выбрать 3 варианта выполнений функций.
не все изжевано, delay забыли запретить использовать :))))))
делает, то он делает, но я тут с его кнопкой день просидел как дурак, оказалось переменную текущей миллис Квон вынес за пределы класса, перетаскивал из рабочей программы и, потерял эту часть кода, ужо думал, что пины палёные, стал смотреть библиотеку Гайвера для работы с кнопками, да это же просто эталон!!! )))
делает, то он делает, но я тут с его кнопкой день просидел как дурак, оказалось переменную текущей миллис Квон вынес за пределы класса, перетаскивал из рабочей программы и, потерял эту часть кода, ужо думал, что пины палёные, стал смотреть библиотеку Гайвера для работы с кнопками, да это же просто эталон!!! )))
У вас все проекты на мега2560 ?
Откуда столько место под эти комбайны кнопочные ?
Мне трёх месяцев хватило, для разработки именно того функционала, чтоо мне требуется.
750 байт флеша на конструктор и функции, плюс по 8 байт ОЗУ на каждый экземпляр.
Да, я просто в афуе, от таких баранойдов.
Решил проверить на жадность обработчик водопроводчика, ппц там даже примеры не компилируются.
Это вообще как ?
Открываешь из IDE примеры библиотек, в итоге компилятор не видит файл *.h
Мне трёх месяцев хватило, для разработки именно того функционала, чтоо мне требуется. 750 байт флеша на конструктор и функции, плюс по 8 байт ОЗУ на каждый экземпляр.
8 Байт на кнопку? За 3 месяца можно было бы и оптимизировать.
Мне трёх месяцев хватило, для разработки именно того функционала, чтоо мне требуется. 750 байт флеша на конструктор и функции, плюс по 8 байт ОЗУ на каждый экземпляр.
8 Байт на кнопку? За 3 месяца можно было бы и оптимизировать.
Попробуй.
Отслеживание длинного/короткого нажатий с любым количеством мультикликов. Хоть дабл, хоть трипл, хоть двадцатипятирипл.
Даже наверное наврал, не 8, а 13-15 байт на экземпляр, точно не помню.
А морзе нету?
А че титановые велосипеды уже не в тренде?
Нет, в тренде давным-давно карбоновые.
А мне вот Atmega328P не хватает памяти для кучи тоновых мелодий (tone), типа плеера, много они жрут памяти. Либо переходить на Atmega2560 или искать альтернативу с отдельной памятью, только не знаю можно ли читать (tone) из внешней памяти и какой.
А мне вот Atmega328P не хватает памяти для кучи тоновых мелодий (tone), типа плеера, много они жрут памяти.
А вы их в какой памяти храните - в той что 2К или в той что 32К байта?
А мне вот Atmega328P не хватает памяти для кучи тоновых мелодий (tone), типа плеера, много они жрут памяти.
А вы их в какой памяти храните - в той что 2К или в той что 32К байта?
Я пробовал в обоих памяти, в памяти для переменных - не хватает и в памяти флэшь, тоже забивается под завязку, слишком много строк уходит под тоновые мелодии, все мелодии как полноценная музыка, вот поэтому не хватает памяти на устройстве. Либо использовать мид файл на внешней памяти и проигрывать с нее как вариант, но хотелось бы чтобы играло по строкам tone, можно чтобы читал из текстового файла строки (tone).
все мелодии как полноценная музыка
Это на tone() у вас полноценная музыка? интересно было бы код посмотреть... заодно и посмотрим, как вы строки храните
все мелодии как полноценная музыка
Это на tone() у вас полноценная музыка? интересно было бы код посмотреть... заодно и посмотрим, как вы строки храните
Такой вариант пишет в память для переменных
либо такой вариант, пишет в флэшь память
В каждом варианте более 1500 тоновых строк для полноценной 1й мелодий, а этих к примеру мелодий 5 штук точно не влезет на Atmega328 :)
а с PROGMEM то же не влезает ?
В каждом варианте более 1500 тоновых строк для полноценной 1й мелодий, а этих к примеру мелодий 5 штук точно не влезет на Atmega328 :)
Легко влезет.
Достаточно хранить передаваемые параметры из массива, а массив спрятать в PROGMEM
либо такой вариант, пишет в флэшь память
этот вариант ничего общего с записью во флеш не имеет.
Кроме того, параметры функций delay() и tone() - целые числа, поэтому запись типа delay(125.0); - это бредятина
либо такой вариант, пишет в флэшь память
этот вариант ничего общего с записью во флеш не имеет.
Кроме того, параметры функций delay() и tone() - целые числа, поэтому запись типа delay(125.0); - это бредятина
delay(125.0); Это пауза между нотами, почему бредятина? Не я же разработал такую работу tone :)
В каждом варианте более 1500 тоновых строк для полноценной 1й мелодий, а этих к примеру мелодий 5 штук точно не влезет на Atmega328 :)
на ноту - 1 байт,
на длительность - 1 байт,
итого - 2 байта.
1500 тоновых сток - 3000 байтов.
5 мелодий - 15000 байтов ака 14.65 кБайт, что явно меньше 32 кБайт.
Что-то у Вас не в порядке с арифметикой.
PS. Разбор MIDI файла на Ардуино - то еще удовольствие. Если типа 0, то еще можно, а если типа 1 (а таких большинство), то без внешней памяти - проблематично.
delay(125.0); Это пауза между нотами, почему бредятина? Не я же разработал такую работу tone :)
с точки зрения программирования - бред, потому что делеи могут быть только целыми.
Но главное - изучите все-таки. что такое PROGMEM и как на самом деле эффективно хранить данные во флеш. Думаю, у вас все в памяти поместится со свистом...
delay(125.0); Это пауза между нотами, почему бредятина? Не я же разработал такую работу tone :)
Потому что - бредятина.
Внимательно перечитайте описание tone.
delay(125.0); Это пауза между нотами, почему бредятина? Не я же разработал такую работу tone :)
Потому, что эти значения должны иметь другой тип данных.
В каждом варианте более 1500 тоновых строк для полноценной 1й мелодий, а этих к примеру мелодий 5 штук точно не влезет на Atmega328 :)
на ноту - 1 байт,
на длительность - 1 байт,
итого - 2 байта.
1500 тоновых сток - 3000 байтов.
5 мелодий - 15000 байтов ака 14.65 кБайт, что явно меньше 32 кБайт.
Что-то у Вас не в порядке с арифметикой.
PS. Разбор MIDI файла на Ардуино - то еще удовольствие. Если типа 0, то еще можно, а если типа 1 (а таких большинство), то без внешней памяти - проблематично.
andriano, вот вот и я думаю как же может влезть. Все верно, при компиляции объем памяти показывает сколько занимают ноты и ардуино иде об этом пищит :)
5 мелодий - 15000 байтов ака 14.65 кБайт, что явно меньше 32 кБайт.
andriano, вот вот и я думаю как же может влезть.
выше все подсчитано вроде? Или не можете сравнить 15К и 32 ?
5 мелодий - 15000 байтов ака 14.65 кБайт, что явно меньше 32 кБайт.
andriano, вот вот и я думаю как же может влезть.
выше все подсчитано вроде? Или не можете сравнить 15К и 32 ?
Забыл еще сказать, про дополнительный код типа плеера и управления устройством и переключения мелодий, он тоже весит примерно 20к. 20к +15к =35к :) Вот и от сюда не хватает места. Да мало этого места, мало!
Nayn, не торопитесь отвечать на каждое сообщение , вы так пишете откровенную ерунду, лишь бы написать. Думайте немного, прежде чем ответить.
Забыл еще сказать, про дополнительный код типа плеера и управления устройством и переключения мелодий, он тоже весит примерно 20к. 20к +15к =35к :) Вот и от сюда не хватает места. Да мало этого места, мало!
а это уже откровенное вранье пошло....