Очередная задержка без delay
- Войдите на сайт для отправки комментариев
Пт, 16/09/2016 - 22:12
Собрал на ардуине терморегулятор. Все работает как надо.
Вкратце алгоритм работы выглядит следующим образом
#define enablePin 8 #define ledPin 13 ... void setup() { pinMode(enablePin,INPUT); pinMode(ledPin,OUTPUT); ... } void loop() { if(digitalRead(enablePin)==HIGH) { ... // подключаем LCD // включаем светодиод // подаем управляющий сигнал на нагреватель delay(20000) // включаем задержку на 20-30 секунд // после задержки считываем показания температуры и выполняем необходимые действия ... } // выключаем терморегулятор }
При повторной подаче сигнала на 8 вывод процедура должна повториться. Решил избавиться от delay. Для упрощения пытаюсь пока выполнить все это с помощью кнопки и светодиода - при нажатии кнопки светодиод загорается через определенный интервал, после отпускания сразу гаснет. Вот код
int ledPin = 13; int enablePin=8; unsigned long previousMillis = 0; const long interval = 20000; void setup() { pinMode(ledPin, OUTPUT); pinMode(enablePin, INPUT); } void loop() { if (digitalRead(enablePin) == HIGH) { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; digitalWrite(ledPin, HIGH); } previousMillis = 0; } else { digitalWrite(ledPin, LOW); } }
Но в ходе моделирования возникли проблемы
1. при повторном нажатии кнопки задержка отсутствует
2. если кнопку нажать не сразу после включения ардуины,а через время большее чем заданный интервал, то светодиод тоже загорается без задержки
Помогите допилить код.
Удалите 25 строчку.
Вероятно, проблема в переменной previousMillis. Если ее инициализировать при нажатии кнопки, то должно работать как надо. Например добавить флажок, определяющий состояние удержания кнопки. В начале, флаг = false. После нажатия, если флаг == false, то previousMillis = millis() и флаг = true. После отжатия, флаг = false.
Ответ на первый и второй вопрос, кроется в том, что Вы присваиваете "previousMillis = 0;" в строках 4 и 25, причем присвоение в строке 22 будет замещено присвоением в строке 25. Если после рестарта прошло более 20 секунд,то условие "if (currentMillis - previousMillis >= interval)" будет выполнятся с первой попытки ("millis() - 0 >= 20000").
Решил избавиться от delay.
Цель? Если всё работает как надо, то зачем избавляться? Какая разница будет оно стоять в цикле-delay или в цикле-loop? Или Вы просто поупражняться хотите?
Цель? Если всё работает как надо, то зачем избавляться? Какая разница будет оно стоять в цикле-delay или в цикле-loop? Или Вы просто поупражняться хотите?
хочу использовать сторожевого пса, а он, как вы понимаете, при таких задержках работает не совсем корректно. Да и во время delay информация на дисплее и поступающая от датчиков информация "замораживается". Ну и поупражняться лишним тоже никогда не будет.
Удалите 25 строчку.
Ее я как раз и поставил когда пытался решить проблемы. Если убираю, то 1 вопрос отпадает, но остается второй. Заметил что если нажать и сразу отпустить кнопку, а затем опять нажать то и во втором случае (т.е. когда период между нажатиями превышает время задержки) задержка начинает отрабатываться.
upd: Пока пришла идея использовать следующий костыль - разбить один большой delay на несколько маленьких, а между ними вставить wdt_reset. Но из-за спортивного интереса все-таки хочу добить задержку без delay.
хочу использовать сторожевого пса, а он, как вы понимаете, при таких задержках работает не совсем корректно.
Не понимаю. В чём некорректность работы WatchDog и чем ему помешают delay?
Тоже не понимаю. Если Вы уберёте delay, но не будете опрашивать датчики и обновлять дисплей чаще, чем сейчас, она будет точно также "замораживаться".
Это я понимаю и считаю правильным! Удачи!
Не понимаю. В чём некорректность работы WatchDog и чем ему помешают delay?
Максимальное время таймера wdt 8 секунд
если задержка больше этих 8 секунд, то в это время команда wdt_reset() соответственно не действует, МК думает что программа зависла и происходит перезагрузка системы.
Фу, ты, блин, думал и впрямь проблема :))) Ставите делай хоть на 4 секунды, дергаете ресет и снова на те же 4 - не вижу проблемы.
Ну пока так и сделал
Вместо if используйте while (currentMillis - previousMillis <= interval) wdt_reset(); - будет задержка на сколько хотите и WDT будет сброшен.
Вероятно, проблема в переменной previousMillis. Если ее инициализировать при нажатии кнопки, то должно работать как надо. Например добавить флажок, определяющий состояние удержания кнопки.
Добавил флаг, заработало
Простите меня за бред который напишу( щас взьедятся все кто гоняется за байтами), но если вы упражняетесь для себя то начните использовать классы хранящие состояние всей системы единомоментно, код будет намного более читаем, понятен и с большей легкостью поддаватся любым правкам..... ака начните применять ООП...
я читая данный форум заметил что сдесь не модно советовать такое применять, хотя это крайне странно =) если ваша программа сжирает 30кб кода и в мк уже не лезет больше то чтото не так кодом, или с выбором мк =) но пока вы не столкнулись с таким ограничением, и под 99% задач встречающихся сдесь - никогда эти задачи не выйдут за пределы 10к кода и 2к озу =)
ToRcH2565, целый час прошёл, а Вас ещё не сожрали - все на выборах?
ToRcH2565! А есть примеры, по затратам флеша/памяти при решении одной и той же задачи на ООП и без ООП? Очень интересно сравнить. Время выполнения тоже интересно. Красивое, легко читаемое, изложение программы конечно хорошо, но микроконтроллеры заточены на быструю реакцию, прерывания. Как с этим в ООП?
заточены на быструю реакцию, прерывания. Как с этим в ООП?
Нормально, если у программиста голова на месте. А если нет, то ему ничто не поможет.
Всё зависит от того как напишите, из моих наблюдений только расход озу больше, процентов на 10....
Ну и если не делать "титановые велосипеды для кнопки" то сильного перерасхода не будет, а в некоторых случаях будет прирост засчет верного (т.к. проще писать\читать\исправлять легко понятный код) написания =)
Ну и если не делать "титановые велосипеды для кнопки" то сильного перерасхода не будет, а в некоторых случаях будет прирост засчет верного (т.к. проще писать\читать\исправлять легко понятный код) написания =)
нет - так не пойдёт.
вначале ты пишешь код, который более экономно расходует ресурсы МК - сравниваешь с класс титановый велосипед для тактовой кнопки, и только после этого делаешь заявление, что делать класс титановый велосипед для тактовой кнопки не нужно.
*нужно отвечать за свои слова, а не просто голословно что-то заявлять.
Запросто,
bool Button(int pin)
{
}
вот только вы не верно прочли мой коментарий, и критика была не в том что класс не делает своей работы, а в том что в большинстве случаев вам он не нужен, точней все его заморочки, и если для простого дебаунца одного пина использовать таких монстров то перерасход будет поболья 10% и может достигать 90%
вначале ты пишешь код, который более экономно расходует ресурсы МК - сравниваешь с класс титановый велосипед для тактовой кнопки,
Сделано выше в сообщении
и только после этого делаешь заявление, что делать класс титановый велосипед для тактовой кнопки не нужно.
Вам часто нужно всё что делает этот класс? тогда делайте то что там реализовано =) вам нужен одинарный \двойной клик и дебаунц? делайте только их =) в моем посте шла речь о том что не нужно делать космическую ракету чтобы потом стрелять с нее лазером по жукам в огороде =)
Запросто,
это дешёвый троллинг.
вот только вы не верно прочли мой коментарий, и критика была не в том что класс не делает своей работы, а в том что в большинстве случаев вам он не нужен, точней все его заморочки, и если для простого дебаунца одного пина использовать таких монстров то перерасход будет поболья 10% и может достигать 90%
если я тебя правильно понял, то возможны случаи, когда и дуино не нужна - тогда эффективность использования ресурсов МК стремится к бесконечности, а код - к идеалу.
я правильно понял твои оправдания?
Вам часто нужно всё что делает этот класс? тогда делайте то что там реализовано =) вам нужен одинарный \двойной клик и дебаунц? делайте только их =) в моем посте шла речь о том что не нужно делать космическую ракету чтобы потом стрелять с нее лазером по жукам в огороде =)
кто запрещает закомментить в класс титановый велосипед для тактовой кнопки, не нужное тебе лично?
Ладно если вы меня и в правду не поняли, берем тот класс(честно я даже сильно в него не вчитывался) и первое что бросилось мне в глаза....
меням на
И тем самым немного экономим озу =) или не так?
Секрет быстрого и эффективного программирования это опыт и наработки (свои , чужие библиотеки или готовые решения )программиста. Если каждый раз писать с нуля , что с классами ,что без будет сложно и с большим колличеством ошибок. Так что,ToRcH2565, если у вас нет своих классов на все случаи жизни, то пользы от классов для вас будет не много.
И тем самым немного экономим озу =) или не так?
Самое удивительное не так. Скомпилируйте пустой скетч. А потом с вашими заменами и рассмотрите результат.
Ладно если вы меня и в правду не поняли, берем тот класс(честно я даже сильно в него не вчитывался) и первое что бросилось мне в глаза....
меням на
И тем самым немного экономим озу =) или не так?
ок. и, о чём это свидетельствует?
что класс писать не нужно или о том, что я не профессиональный программист?
от того, что ты оптимизируешь код класса - он от этого не перестанет существовать и на его месте не появится твой сферический код в вакууме, который экономит ресурсы МК, в отличии от класса.
ок. и, о чём это свидетельствует?
вначале ты пишешь код, который более экономно расходует ресурсы МК - сравниваешь с класс титановый велосипед для тактовой кнопки, и только после этого делаешь заявление, что делать класс титановый велосипед для тактовой кнопки не нужно.
За сим прошу откланятся, я потопал печатать говнокод на делфях =)
Запросто,
bool Button(int pin)
{
}
вот только вы не верно прочли мой коментарий, и критика была не в том что класс не делает своей работы, а в том что в большинстве случаев вам он не нужен, точней все его заморочки, и если для простого дебаунца одного пина использовать таких монстров то перерасход будет поболья 10% и может достигать 90%
Просветите - а delay зачем в этом коде?
я просил предоставить оригинальный код, выполняющий функции класс титановый велосипед для тактовой кнопки, подтверждающий твоё заявление - не нужно улучшать, изучать, иметь желание...
просто подтвердить свои слова.
Просветите - а delay зачем в этом коде?
Это он так ловит фронт и спад при нажатии на кнопку. В маленьких примерах пройдет. А для больших большая дрянь.
ООП...
я читая данный форум заметил что сдесь не модно советовать такое применять, хотя это крайне странно =)
Ничего не странно. ООП - это инструмент, со своими плюсами и минусами. И для МК плюсы редко проявляются, а минусы сильно заметны. Потому его не часто вспоминают. Ну и на форуме столяров про электросварку не популярно ;)
При этом ООП тем полезней, чем дальше от железа, от аппаратной специфики. Собственно это и ограничивает его в МК. Лишние ресурсы памяти тоже бывают проблемой, но не настолько. Второе важное требование - использование его по полной, включая наследование и соответственно с иерархией классов. До этого программа ардуиновская не часто доростает. А без наследования ООП превращается в баловство с дополнительной писаниной.
Но бывают случаи когда ООП не просто уместно, но и эффективно. Например при реализации сложных меню, GUI и т.д. Еще был интересный вариант - видеоэффекты на ленте Ws2812b. Нижний уровень - вывод буфера на ассемблерной вставке, ввод ИК команд - машина состояний, а все визуальные эффекты, сценарии и т.д. - иерархия классов. Такай вышла ИМХО оптимальная архитектура.
Второе важное требование - использование его по полной, включая наследование и соответственно с иерархией классов.
Но согласитесь, используя его не на полную, а беря часть, обьеткы\классы, вместо чисто функционального кода - имеем неплохой прирост в скорости разработки и удобстве чтения кода... наследование, у меня просто по привычке часто выходит его использовать там где оно нафик ненужно, тут мне сложно судить о степени его необходимости в связи с некой проф деформацией =)
До этого программа ардуиновская не часто доростает. А без наследования ООП превращается в баловство с дополнительной писаниной.
Зачастую простой код по управлению мелкой ерундой я реализую в виде одного из уровней многоуровнего меню, что в дальнейшем упрощает сборку всех железок в одну кучу, видимо сужу с этой колокольни и вижу в наследовании плюсы =)
Можно ссыль на код? хотелось бы почитать =)
Второе важное требование - использование его по полной, включая наследование и соответственно с иерархией классов.
Но согласитесь, используя его не на полную, а беря часть, обьеткы\классы, вместо чисто функционального кода - имеем неплохой прирост в скорости разработки и удобстве чтения кода... наследование, у меня просто по привычке часто выходит его использовать там где оно нафик ненужно, тут мне сложно судить о степени его необходимости в связи с некой проф деформацией =)
До этого программа ардуиновская не часто доростает. А без наследования ООП превращается в баловство с дополнительной писаниной.
Зачастую простой код по управлению мелкой ерундой я реализую в виде одного из уровней многоуровнего меню, что в дальнейшем упрощает сборку всех железок в одну кучу, видимо сужу с этой колокольни и вижу в наследовании плюсы =)
Можно ссыль на код? хотелось бы почитать =)
Второе важное требование - использование его по полной, включая наследование и соответственно с иерархией классов.
Но согласитесь, используя его не на полную, а беря часть, обьеткы\классы, вместо чисто функционального кода - имеем неплохой прирост в скорости разработки и удобстве чтения кода... наследование, у меня просто по привычке часто выходит его использовать там где оно нафик ненужно, тут мне сложно судить о степени его необходимости в связи с некой проф деформацией =)
До этого программа ардуиновская не часто доростает. А без наследования ООП превращается в баловство с дополнительной писаниной.
Зачастую простой код по управлению мелкой ерундой я реализую в виде одного из уровней многоуровнего меню, что в дальнейшем упрощает сборку всех железок в одну кучу, видимо сужу с этой колокольни и вижу в наследовании плюсы =)
Можно ссыль на код? хотелось бы почитать =)
факты:
класс титановый велосипед для тактовой кнопки - монстр, который тратит ресурсы в пустую(с)ToRcH2565
===================
выполняем рекомендации по оптимизации кода класс титановый велосипед для тактовой кнопки
Ладно если вы меня и в правду не поняли, берем тот класс(честно я даже сильно в него не вчитывался) и первое что бросилось мне в глаза....
меням на
И тем самым немного экономим озу =) или не так?
до оптимизации -
static
const
===================
без комментариев - анализируем, делаем выводы...
Зачастую простой код по управлению мелкой ерундой я реализую в виде одного из уровней многоуровнего меню, что в дальнейшем упрощает сборку всех железок в одну кучу, видимо сужу с этой колокольни и вижу в наследовании плюсы =)
Вот была тема по применению классов в одной концепции.
http://arduino.ru/forum/programmirovanie/klass-protsessy-i-programma-bli...
Хотя сейчас я пользуюсь этим.
Спасибо конечно что привели в пример, но подобным(только слегка более ООП образным) я пользуюсь всегда =)
есть Init есть run(на самом деле много больше(load reinit pause waitfor) и их может быть сколько угодно (имеется ввиду классов) простите под рукой ничего ненайду такого(все исходники на внешнем винте, а он остался в машине) но суть именно в том что каждый класс содержит некий минимум стандартных процедур аля Init,Run,..... и каждая вызывается при каждом проходе цикла Setup(init) loop(run). без задержек, просто если время для класса не наступило - он пропускает итерацию, и ждет следующей =)
Это позволяет в любом проекте оч быстро разобратся что за чем и для чего, плюс в любой момент времени можно повесится на обработчик данных, и добавив всего один класс, не переписывая половины проекта, допустим начать передавать данные на внешний контроллер, или собрать 2-3-4 проекта в один =)
ToRcH2565. Разумеется, хорошо на каждый подключаемый модуль иметь свой класс. И в этом классе указать ноги, и все модуль готов. Замечательно. А ведь на деле все так и есть. Просто все эти классы спрятаны в подключаемые библиотеки. И обычный начинающий пользователь их в упор не видит.
ПС: Найдите на компьютере файл Servo.h и раскройте.
ToRcH2565. Разумеется, хорошо на каждый подключаемый модуль иметь свой класс. И в этом классе указать ноги, и все модуль готов. Замечательно. А ведь на деле все так и есть. Просто все эти классы спрятаны в подключаемые библиотеки. И обычный начинающий пользователь их в упор не видит.
ПС: Найдите на компьютере файл Servo.h и раскройте.
Тут речь скорее о том что стоит свои поделки делать так же =) в виде класса =) а то как оно выглядит я и так в курсе =)
Можно ссыль на код? хотелось бы почитать =)
Я его в общем и не публиковал. Точней попробовал - http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812 ранний вариант, меня там раскритиковали за отсутствие идей ))) В общем интереса к нему не было, ну я его и пишу понемногу, втихаря, не высовываясь. Собственно функция вывода не менялась, а вот эффекты весьма разраслись. Также ИК пульт добавил. Но если публиковать для повторения другими, так тут тоже засада, пульты разные, адаптировать под другие не хочу
Я в ту тему немного закинул, сейчас код не причесан, выкладывать весь проект совсем не охота, да и интереса к нему не наблюдалось. По применению ООП, в нем я думаю понятно.
Доброго времени суток, знает ли кто-то способ, как сделать задержку без торможения скетча: хотел вывести на жк дисплей координаты шаговика, но сам движок сильно тормозил.
Доброго времени суток, знает ли кто-то способ, как сделать задержку без торможения скетча: хотел вывести на жк дисплей координаты шаговика, но сам движок сильно тормозил.
конечно знаем. Используй миллис, Даже пример такой есть - "блинк без delay"
А вообще - неужели даже ту ветку, в которую запостил свой вопрос - лень прочитать? Она ж не зря так называется
В том-то и проблема - всё равно замедляет.
Разговор ни о чем.
Где скетч?
Где схема?
Что именно хочется получить?
Как получается на самом деле?
Что не устраивает?
значит руки кривые :)
Что замедляет? Кого замедляет? На сколько замедляет?
ХЗ какой скетч, залитый в ХЗ какую схему, ХЗ что замедляет на ХЗ сколько.
ХЗ!
Дак сделать-то понятно как - ПО-ДРУГОМУ.