Цикл For

stboris
Offline
Зарегистрирован: 12.04.2015
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  все начинает работать.

Araris
Онлайн
Зарегистрирован: 09.11.2012

Измерьте ради интереса время выполнения digitalRead()

http://arduino.ru/forum/proekty/vremya-vypolneniya-funktsii 

stboris
Offline
Зарегистрирован: 12.04.2015

Не понимаю,.Цикл For находится внутри условия оределяемого функцией DigitalRead,и выполняется после аыполнения этого условия.Как может влиять время выполнения этой функции  DigialRead на  For?

__Alexander
Offline
Зарегистрирован: 24.10.2012

не выполнится

 if(activate_pin2_flag>=5000)

т.к. это 

for (int i=0; i <= 5000; i++)

досчитает только до 4999.

stboris
Offline
Зарегистрирован: 12.04.2015

Все работает,досчитывает если активированна функция Serial.read ,если ее закомментировать то задержка исчезает,и проискодит включение и выключение без задержки.Я не могу понять почему это происходит ,или как время срабатывания  Digital.read  влияет на это?Ну и как это все сделать,чтобы эта заержка работала без Serial.read?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что именно Вы хотели сделать? Что, по Вашему, должно происходить?

Логика этого кода непоятна. 

Объясните чего Вы хотите от этого кода.

stboris
Offline
Зарегистрирован: 12.04.2015

Прошу прощения не Serial.read , а Serial.println.Как это все сделать чтобы задержка рабоала без Serial.println

stboris
Offline
Зарегистрирован: 12.04.2015

От этого кода я хочу ,чтобы после выполнения 1-го условия выполнялся цикл For,определяющий задержку на включение Pin2.В случае выполнения 2-го условия  выполнялся цикл For определяющий задержку на выключение Pin2.И все работает ,если активировать функцию Serial.print..Если ее закомментировать,то задержка исчезает и включение /выключение поисходит сразу при выполнении условия

nevkon
Offline
Зарегистрирован: 20.01.2015

У вас есть эта задержка... 5000*n машинных циклов. Хотите задержку по времени используйте millis(), micros() или в худшем случае delay().

Сам наблюдал как игра нормально работающая на 286 процессоре начинала бешенно работать на 386 :)) Не используйте циклы на процессоре для задержек, а то они будут определяться частотой этого самого процессора.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

__Alexander пишет:

не выполнится

 if(activate_pin2_flag>=5000)

т.к. это 

for (int i=0; i <= 5000; i++)

досчитает только до 4999.

Вообще-то при условии i <= 5000 досчитает до 5001. При условии i < 5000 досчитает до 5000. Инкрементирование i происходит после сравнения. 

stboris
Offline
Зарегистрирован: 12.04.2015
activate_pin2_flag = digitalRead(timedelay_activate_pin2);//
if ((activate_pin2_flag==HIGH)&& (activate_pin2_flag2==LOW)) {
  
  unsigned long currentMillis4 = millis(); // текущее время в миллисекундах
  if(currentMillis4 - previousMillis4 >= DelayTime3){
previousMillis4 = currentMillis4;
   // Serial.print(activate_pin2_flag);
 activate_pin2_flag2=HIGH;
  }
} 

delay() неподходит так как вешает всю систему, millis() всем хороша,но плохо что она запускается сразу после загрузки и если использовать такой код,то к моменту выполнения условия currentMillis4 -prevousMillis4 будет гораздо больше DelayTime3  и задержки не будет.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Jeka_M пишет:

__Alexander пишет:

не выполнится

 if(activate_pin2_flag>=5000)

т.к. это 

for (int i=0; i <= 5000; i++)

досчитает только до 4999.

Вообще-то при условии i <= 5000 досчитает до 5001. При условии i < 5000 досчитает до 5000. Инкрементирование i выполняется после сравнения. 

Досчитать-то досчитает, но в цикл не попадет. Поэтому принято считать что максимальное значение i может достигать 5000 (4999)

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

stboris пишет:

activate_pin2_flag = digitalRead(timedelay_activate_pin2);//
if ((activate_pin2_flag==HIGH)&& (activate_pin2_flag2==LOW)) {
  
  unsigned long currentMillis4 = millis(); // текущее время в миллисекундах
  if(currentMillis4 - previousMillis4 >= DelayTime3){
previousMillis4 = currentMillis4;
   // Serial.print(activate_pin2_flag);
 activate_pin2_flag2=HIGH;
  }
} 

delay() неподходит так как вешает всю систему, millis() всем хороша,но плохо что она запускается сразу после загрузки и если использовать такой код,то к моменту выполнения условия currentMillis4 -prevousMillis4 будет гораздо больше DelayTime3  и задержки не будет.

 

А какая Вам разница сколько будет в миллис? проверяйте просто в нужный Вам интервал на разницу.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

JollyBiber пишет:

Досчитать-то досчитает, но в цикл не попадет. Поэтому принято считать что максимальное значение i может достигать 5000 (4999)

Да, Вы правы. Но ведь при i <= 5000 цикл всё равно выполнится 5000 раз, так что дело не в этом.

stboris
Offline
Зарегистрирован: 12.04.2015

Разница определяется DelayTime3=5000  при инициализации переменной,previousMilis=0 определяется при инициализации переменной,currentMillis4=millis() определяется при выполнении условия.Но ели Если условие выполнилось через несколько часов после загрузки,то и интервал определяемый currentMillis-previousMillis будет гораздо больше DelayTime3,так как currentMillis4 получит значение Millis() на текущий момент времени.Или как?

Arhat109
Offline
Зарегистрирован: 26.05.2015

На первый.

Как определена переменная, которой присваивается значение тут:

activate_pin2_flag=i;

?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да она у Вас работает. Просто задержка маленькая и Вы её не замечаете. А когда вставляете println (это очень "долгая" функция) задержка становится более заметной.

Кстати, что там у Вас делает break в конце цикла? Не стоит его раскомментировать.

stboris
Offline
Зарегистрирован: 12.04.2015

break в конце цикла это арефакт и он будет удален

stboris
Offline
Зарегистрирован: 12.04.2015
int activate_pin2_flag=0;//Для обработкм состояния входа pin2

Вот так

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

stboris пишет:

Разница определяется DelayTime3=5000  при инициализации переменной,previousMilis=0 определяется при инициализации переменной,currentMillis4=millis() определяется при выполнении условия.Но ели Если условие выполнилось через несколько часов после загрузки,то и интервал определяемый currentMillis-previousMillis будет гораздо больше DelayTime3,так как currentMillis4 получит значение Millis() на текущий момент времени.Или как?

millis()

Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.

и зачем Вам currentMillis4=millis() ? В чем смысл? Лишний ход? Пересмотрите концепцию.

инфа с какого-то левого сайта "arduino.ru"

stboris
Offline
Зарегистрирован: 12.04.2015

Я изменял задержку в цикле ставил 20000,результат тото же

__Alexander
Offline
Зарегистрирован: 24.10.2012

stboris пишет:

Я изменял задержку в цикле ставил 20000,результат тото же

раз на то пошло, объяви всё как long long и сравнивай вот так

for (long long i =0; i <=  0xFFFFFFFFFFFFFFFF; i++)

 

 

 

stboris
Offline
Зарегистрирован: 12.04.2015

Я не понимаю,как тогда контролировать этоит интервал.?В случае периодически меняющихся состояний(мигание светодиода например) эта концепция полностью себя оправдывает.Но как контролировать заданный интервал в случае случайного по времени выполнения условияя не могу  понять

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Заведите еще одну булевскую переменную которая будет превалировать над условием по миллису

stboris
Offline
Зарегистрирован: 12.04.2015

Попробую

stboris
Offline
Зарегистрирован: 12.04.2015
currentMillis4= millis();
 if (checkmillis==LOW) previousMillis4=currentMillis4;
 
 if((digitalRead(timedelay_activate_pin2)== HIGH)&&(system_active==LOW)&&(activate_pin2_flag==1)){
 checkmillis=HIGH;
if (currentMillis4 - previousMillis4 >= DelayTime3){
 digitalWrite(alarm_relay_pin , HIGH);
activate_pin2_flag=0; 
 checkmillis=LOW;
}
 }
if(((digitalRead(timedelay_activate_pin2)== LOW)&&(system_active==LOW)&&(activate_pin2_flag==0))||(boot_init_pin2==HIGH)){
checkmillis=HIGH;
if (currentMillis4 - previousMillis4 >= DelayTime3) { 
 digitalWrite(alarm_relay_pin , LOW);  
 activate_pin2_flag=1;
 boot_init_pin2=LOW;  //boot_init_pin2  для установки всех флагов при загрузке,устанавливается HIGH при инициализации пременной
 checkmillis=LOW;   // 
}
}

Как то так.Может не оптимально но работает.Спасибо всем принявшим участие в обсуждении.Отдельная благодарность JollyBiber

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

оптимизировать можно всегда и до бесконечности, а вот код форматировать надо сразу. Легче читать и Вам и непричастным. Смотрите Ваш код:

currentMillis4= millis();

if (checkmillis==LOW) {
    previousMillis4=currentMillis4;
}

if((digitalRead(timedelay_activate_pin2)== HIGH)&&(system_active==LOW)&&(activate_pin2_flag==1)){
    checkmillis=HIGH;
    if (currentMillis4 - previousMillis4 >= DelayTime3){
        digitalWrite(alarm_relay_pin , HIGH);
        activate_pin2_flag=0; 
        checkmillis=LOW;
    }
}

if(((digitalRead(timedelay_activate_pin2)== LOW)&&(system_active==LOW)&&(activate_pin2_flag==0))||(boot_init_pin2==HIGH)){
    checkmillis=HIGH;
    if (currentMillis4 - previousMillis4 >= DelayTime3) { 
        digitalWrite(alarm_relay_pin , LOW);  
        activate_pin2_flag=1;
        boot_init_pin2=LOW;  //boot_init_pin2  для установки всех флагов при загрузке,устанавливается HIGH при инициализации пременной
        checkmillis=LOW;   // 
    }
}

 

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

JollyBiber пишет:

оптимизировать можно всегда и до бесконечности, а вот код форматировать надо сразу. Легче читать и Вам и непричастным. Смотрите Ваш код:

привет сидетелям Секты форматирования им. Лешака!

форматируй-неформатируй, а что надо использовать при форматировании кода пробелы или табуляции? что бы непонимающие, но опытные программисты понимали легче?

какой длины пробелы-табуляции? 2 или 8? 4 отвергаю, как пораженческий, 2 - как бесполезный, 8 - наше всё! 32 - любителям работать за двумя мониторами.

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Да хоть картинки вставляй - лтшь бы читалось легко и понятно.

Ширина отступа определяется константой ширины эпидермиса до линии капилляров в процентном отношении альвеол на кубометр вдыхаемого кислорода.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

JollyBiber пишет:

Да хоть картинки вставляй - лтшь бы читалось легко и понятно.

ясно. форматирование кода, как повод докопаться до пейсателя кода... или, таки, расскажешь, откуда этот мифологический бред про форматирование - пробелы-табы, длина, где эти правила, несоблюдением которых свидетели форматирования упрекают?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Недопереспал?

Где увидел мои упреки? Я посоветовал ТС после решения проблемы. Или ты считаешь что код в посте 25 читается легче чем в посте 26?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

После написания необходимо осуществить тонкую, прецезионную настройку до желаемого уровня по шкале Траллеса.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

JollyBiber пишет:

Где увидел мои упреки?

я увидел паттерн поведения Свидетеля форматирования кода.

У последователей секты наблюдается выборочная слепота - они понимают, что код неформатирован, но с трудом понимают смысл содержимого кода, если код неформатирован, они рекомендуют форматировать код по неизвестным никому правилам.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а я бы еще названия переменным, пинам давал покороче и попроще

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Клапауций 999 пишет:

JollyBiber пишет:

Где увидел мои упреки?

я увидел паттерн поведения Свидетеля форматирования кода.

У последователей секты наблюдается выборочная слепота - они понимают, что код неформатирован, но с трудом понимают смысл содержимого кода, если код неформатирован, они рекомендуют форматировать код по неизвестным никому правилам.

Попробуй научиться видеть всю картину целиком, а не отдельные паттерны. Результат тебя поразит!

bwn
Онлайн
Зарегистрирован: 25.08.2014

jeka_tm пишет:

а я бы еще названия переменным, пинам давал покороче и попроще

А ТС виноват, что их всякие программеры так в примерах обзывают? )))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нет. но никто же не мешает поменять. понятнее самому будет

stboris
Offline
Зарегистрирован: 12.04.2015

Я думаю  суть не в том  как переменную назвать,а в том как она использоваться будет.Думаю тема закрыта.Еще рраз всем спасибо и до новых встреч

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

stboris пишет:

Я думаю  суть не в том  как переменную назвать,а в том как она использоваться будет.

В этом Вы ошибаетесь, поверьте старому программисту.

Маяквоского читали? Помните как у него:

Если тебе корова имя,
У тебя должно быть молоко и вымя!
А если нет ни молока, ни вымени,
То черта ль в твоём коровьем имени.

Так и спеременными.