Цикл For
- Войдите на сайт для отправки комментариев
Втр, 30/06/2015 - 22:39
if ((digitalRead(timedelay_activate_pin2)== HIGH)&&(system_active==LOW)){ for (int i=0; i <= 5000; i++){ activate_pin2_flag=i; // Serial.println(activate_pin2_flag); if(activate_pin2_flag>=5000) digitalWrite(alarm_relay_pin , HIGH); if((digitalRead(activate_system_pin)==HIGH)||(digitalRead(timedelay_activate_pin2)==LOW))break; //break; } } else if ((digitalRead(timedelay_activate_pin2)==LOW)&&(system_active==LOW)){ for (int j=0; j <= 5000; j++){ activate_pin2_flag2=j; //Serial.println(activate_pin2_flag2); if(activate_pin2_flag2>=5000) digitalWrite(alarm_relay_pin , LOW ); if((digitalRead(activate_system_pin)==HIGH)||(digitalRead(timedelay_activate_pin2)==HIGH))break; //break; } }
Непонятно почему цикл For не работает : нет задержки на включение и отключение ,а при активации функции Serial.print все начинает работать.
Измерьте ради интереса время выполнения digitalRead()
http://arduino.ru/forum/proekty/vremya-vypolneniya-funktsii
Не понимаю,.Цикл For находится внутри условия оределяемого функцией DigitalRead,и выполняется после аыполнения этого условия.Как может влиять время выполнения этой функции DigialRead на For?
не выполнится
т.к. это
досчитает только до 4999.
Все работает,досчитывает если активированна функция Serial.read ,если ее закомментировать то задержка исчезает,и проискодит включение и выключение без задержки.Я не могу понять почему это происходит ,или как время срабатывания Digital.read влияет на это?Ну и как это все сделать,чтобы эта заержка работала без Serial.read?
А что именно Вы хотели сделать? Что, по Вашему, должно происходить?
Логика этого кода непоятна.
Объясните чего Вы хотите от этого кода.
Прошу прощения не Serial.read , а Serial.println.Как это все сделать чтобы задержка рабоала без Serial.println
От этого кода я хочу ,чтобы после выполнения 1-го условия выполнялся цикл For,определяющий задержку на включение Pin2.В случае выполнения 2-го условия выполнялся цикл For определяющий задержку на выключение Pin2.И все работает ,если активировать функцию Serial.print..Если ее закомментировать,то задержка исчезает и включение /выключение поисходит сразу при выполнении условия
У вас есть эта задержка... 5000*n машинных циклов. Хотите задержку по времени используйте millis(), micros() или в худшем случае delay().
Сам наблюдал как игра нормально работающая на 286 процессоре начинала бешенно работать на 386 :)) Не используйте циклы на процессоре для задержек, а то они будут определяться частотой этого самого процессора.
не выполнится
т.к. это
досчитает только до 4999.
Вообще-то при условии i <= 5000 досчитает до 5001. При условии i < 5000 досчитает до 5000. Инкрементирование i происходит после сравнения.
delay() неподходит так как вешает всю систему, millis() всем хороша,но плохо что она запускается сразу после загрузки и если использовать такой код,то к моменту выполнения условия currentMillis4 -prevousMillis4 будет гораздо больше DelayTime3 и задержки не будет.
не выполнится
т.к. это
досчитает только до 4999.
Вообще-то при условии i <= 5000 досчитает до 5001. При условии i < 5000 досчитает до 5000. Инкрементирование i выполняется после сравнения.
Досчитать-то досчитает, но в цикл не попадет. Поэтому принято считать что максимальное значение i может достигать 5000 (4999)
delay() неподходит так как вешает всю систему, millis() всем хороша,но плохо что она запускается сразу после загрузки и если использовать такой код,то к моменту выполнения условия currentMillis4 -prevousMillis4 будет гораздо больше DelayTime3 и задержки не будет.
А какая Вам разница сколько будет в миллис? проверяйте просто в нужный Вам интервал на разницу.
Досчитать-то досчитает, но в цикл не попадет. Поэтому принято считать что максимальное значение i может достигать 5000 (4999)
Да, Вы правы. Но ведь при i <= 5000 цикл всё равно выполнится 5000 раз, так что дело не в этом.
Разница определяется DelayTime3=5000 при инициализации переменной,previousMilis=0 определяется при инициализации переменной,currentMillis4=millis() определяется при выполнении условия.Но ели Если условие выполнилось через несколько часов после загрузки,то и интервал определяемый currentMillis-previousMillis будет гораздо больше DelayTime3,так как currentMillis4 получит значение Millis() на текущий момент времени.Или как?
На первый.
Как определена переменная, которой присваивается значение тут:
activate_pin2_flag=i;
?
Да она у Вас работает. Просто задержка маленькая и Вы её не замечаете. А когда вставляете println (это очень "долгая" функция) задержка становится более заметной.
Кстати, что там у Вас делает break в конце цикла? Не стоит его раскомментировать.
break в конце цикла это арефакт и он будет удален
Вот так
Разница определяется DelayTime3=5000 при инициализации переменной,previousMilis=0 определяется при инициализации переменной,currentMillis4=millis() определяется при выполнении условия.Но ели Если условие выполнилось через несколько часов после загрузки,то и интервал определяемый currentMillis-previousMillis будет гораздо больше DelayTime3,так как currentMillis4 получит значение Millis() на текущий момент времени.Или как?
millis()
Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.
и зачем Вам currentMillis4=millis() ? В чем смысл? Лишний ход? Пересмотрите концепцию.
инфа с какого-то левого сайта "arduino.ru"
Я изменял задержку в цикле ставил 20000,результат тото же
Я изменял задержку в цикле ставил 20000,результат тото же
раз на то пошло, объяви всё как long long и сравнивай вот так
Я не понимаю,как тогда контролировать этоит интервал.?В случае периодически меняющихся состояний(мигание светодиода например) эта концепция полностью себя оправдывает.Но как контролировать заданный интервал в случае случайного по времени выполнения условияя не могу понять
Заведите еще одну булевскую переменную которая будет превалировать над условием по миллису
Попробую
Как то так.Может не оптимально но работает.Спасибо всем принявшим участие в обсуждении.Отдельная благодарность JollyBiber
оптимизировать можно всегда и до бесконечности, а вот код форматировать надо сразу. Легче читать и Вам и непричастным. Смотрите Ваш код:
оптимизировать можно всегда и до бесконечности, а вот код форматировать надо сразу. Легче читать и Вам и непричастным. Смотрите Ваш код:
привет сидетелям Секты форматирования им. Лешака!
форматируй-неформатируй, а что надо использовать при форматировании кода пробелы или табуляции? что бы непонимающие, но опытные программисты понимали легче?
какой длины пробелы-табуляции? 2 или 8? 4 отвергаю, как пораженческий, 2 - как бесполезный, 8 - наше всё! 32 - любителям работать за двумя мониторами.
Да хоть картинки вставляй - лтшь бы читалось легко и понятно.
Ширина отступа определяется константой ширины эпидермиса до линии капилляров в процентном отношении альвеол на кубометр вдыхаемого кислорода.
Да хоть картинки вставляй - лтшь бы читалось легко и понятно.
ясно. форматирование кода, как повод докопаться до пейсателя кода... или, таки, расскажешь, откуда этот мифологический бред про форматирование - пробелы-табы, длина, где эти правила, несоблюдением которых свидетели форматирования упрекают?
Недопереспал?
Где увидел мои упреки? Я посоветовал ТС после решения проблемы. Или ты считаешь что код в посте 25 читается легче чем в посте 26?
После написания необходимо осуществить тонкую, прецезионную настройку до желаемого уровня по шкале Траллеса.
Где увидел мои упреки?
я увидел паттерн поведения Свидетеля форматирования кода.
У последователей секты наблюдается выборочная слепота - они понимают, что код неформатирован, но с трудом понимают смысл содержимого кода, если код неформатирован, они рекомендуют форматировать код по неизвестным никому правилам.
а я бы еще названия переменным, пинам давал покороче и попроще
Где увидел мои упреки?
я увидел паттерн поведения Свидетеля форматирования кода.
У последователей секты наблюдается выборочная слепота - они понимают, что код неформатирован, но с трудом понимают смысл содержимого кода, если код неформатирован, они рекомендуют форматировать код по неизвестным никому правилам.
Попробуй научиться видеть всю картину целиком, а не отдельные паттерны. Результат тебя поразит!
а я бы еще названия переменным, пинам давал покороче и попроще
А ТС виноват, что их всякие программеры так в примерах обзывают? )))
нет. но никто же не мешает поменять. понятнее самому будет
Я думаю суть не в том как переменную назвать,а в том как она использоваться будет.Думаю тема закрыта.Еще рраз всем спасибо и до новых встреч
Я думаю суть не в том как переменную назвать,а в том как она использоваться будет.
Маяквоского читали? Помните как у него:
Если тебе корова имя,
У тебя должно быть молоко и вымя!
А если нет ни молока, ни вымени,
То черта ль в твоём коровьем имени.
Так и спеременными.