не выходит из цикла for

phoedos
Offline
Зарегистрирован: 23.03.2017

Доброго здравия. Господа, есть ардуина, датчик температуры, кнопка

int t=0;
int set_temp=20;
t=dht.readTemperature();
 
if (lastOnTempButton == LOW && currentOnTempButton == HIGH)
 { 
   for (int i = 10; i >= 0; i--)
  {
    digitalWrite(FAN, HIGH);
    lcd.print(i);
    delay(1000);    
   }    
  }

При нажатии на кнопку логика срабатывает на 10сек. Работает как часы.

Теперь же, если добавить условие срабатывания логики по температуре, ардуина не выходит из цикла for.

if (t>set_temp)
{
   for (int i = 10; i >= 0; i--)
  {
    digitalWrite(FAN, HIGH);
    lcd.print(i);
    delay(1000);    
   }   
 }
else
{
digitalWrite(FAN, LOW);
}

Что хочу реализовать данным куском кода? При выполнении условия включать нагрузку на силовре реле на 1-2-3 минуты. Подскажите, как все таки выйти из цикла? Добра и печенек вам!

fogary
Offline
Зарегистрирован: 05.03.2016

Не здесь ли, случайно, проблема:

if (t>set_temp)

Зачение "t" какое получаете с датчика?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

phoedos пишет:
Подскажите, как все таки выйти из цикла?

Как определили, что не выходит из цикла? Что ожидается получить после его отработки?

Не получается ли у вас так, что по условию выполняется цикл, и при новом "витке" loop условие опять выполняется и вновь начинает работать цикл?

ПыСы. Прервать "насильно" любой цикл можно оператором break. Пропустить "виток" цикла оператор continue.

fogary
Если бы была проблема в условии, то цикл бы и не выполнялся.

phoedos
Offline
Зарегистрирован: 23.03.2017

зажимаю термопару пальцами, температура растет, попадаю под условие

результат Serial.println(i);

0
10
9
8
7
6
5
4
3
2
1
0
10
9
8
7
6
5
4
3
2
1
0
10
 

fogary
Offline
Зарегистрирован: 05.03.2016

OlegK пишет:

Если была проблема в условии, то цикл бы и не выполнялся.

В приведенном коде, переменной set_temp присвоено значение 20. Допустим, датчик возвращает значение больше 20, а весь код при этом крутиться внутри loop(). Вполне может создасться илюзия бесконечного цикла. Но конечно это все домыслы.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Ну, получается, что многократно прогоняется этот цикл, т.к. температура удовлетворяет условию t > set_temp
Вы ждёте, что будет по-другому?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

fogary пишет:
Вполне может создасться илюзия бесконечного цикла.

Ну, похоже у ТС как раз такое и происходит. Только проблема не в условии, а в логике.

phoedos, если нужна отработка цикла только один раз, то заводите флаг, в условии если (т>еее && флаг) то крутите цикл, а после цикла сбрасываете флаг в противоположное состояние. При понижении температуры возвращаете флаг обратно, что бы в след. раз цикл мог отработать...

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

phoedos пишет:

зажимаю термопару пальцами, температура растет, попадаю под условие

результат Serial.println(i);

1. Я не вижу в коде никакого "Serial.println(i);". Давайте Вы будете показывать нам именно тот код, который у Вас вызывает проблемы, а не цену на прошлогодний овёс.

2. Заодно печатайте значения t и set_temp непосредственно перед if

И сразу всё станет ясно.