Вопрос новичка - как выйти из цикла ?

victorv
Offline
Зарегистрирован: 31.07.2015

Здравствуйте , вот и настало время задать не умный вопрос . Есть это

//////////////РЕЛЕ ВЫТЯЖКИ ///////////////////////
  if (digitalRead(12) == LOW && flag == 1) //если кнопка не нажата
    // и перемення flag равна 1 , то ...
  {
    delay(2000);//делаем задержку
    digitalWrite(11, HIGH); //выключаем свет
    digitalWrite(10, LOW); //включаем вытяжку
    // Вот тут проблема -не знаю что сделать , чтоб если "digitalRead(12)" вдруг стал " HIGH" не ждать минуту , а сразу выйти из цикла .

    delay(60000);
    digitalWrite(10, HIGH); //выключаем вытяжку
    flag = 0; //обнуляем переменную flag
     }
    else //если не нажата...
    {
    
    flag = 0; //обнуляем переменную flag
    digitalWrite(10, HIGH); //выключаем вытяжку
    }

Принцип такой -по датчику движения на 12 пин приходит "-" это включает освещение -11 пин , как только движения нет 11пин  выкл и на 60 сек вкл 10пин -вытяжка. Проблема в том, что пока работает 11 пин- вытяжка , не видно сигнала от датчика движения 12пин , и если в это время зайти - то придется ждать 60 сек до конца цикла .Помогите как написать этот цикл , видимо надо добавить команду прерывания цикла...посоветуйте . Спасибо .

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012
victorv
Offline
Зарегистрирован: 31.07.2015

согласен , а что по существу ?

 

Araris
Offline
Зарегистрирован: 09.11.2012

Ваша проблема - delay(60000); и от него придется избавляться.

Почитайте http://arduino.ru/tutorials/BlinkWithoutDelay , постарайтесь разобраться, как это работает.

 

victorv
Offline
Зарегистрирован: 31.07.2015

Araris пишет:

Ваша проблема - delay(60000); и от него придется избавляться.

Почитайте http://arduino.ru/tutorials/BlinkWithoutDelay , постарайтесь разобраться, как это работает.

 

Спасибо , буду разбираться .

Andrey-S
Offline
Зарегистрирован: 02.01.2015

victorv пишет:

Спасибо , буду разбираться .

Зато как разберетесь - сразу попреееееет)))... Это одна из основных полезных штук!

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

victorv пишет:

согласен , а что по существу ?

 

А это и есть по существу, у Вас нет циклов в приведенном куске. Поэтому можно предполагать всё, что угодно.

Не нужна помощь? Без проблем.

 

victorv
Offline
Зарегистрирован: 31.07.2015

Вот что получилось :

int FAN = 10; // пин вытяжка
int Light = 11; // пин свет
long OnTime = 20000; // время работы вытяжки , мс
int ledState = LOW;
int pinButton = 12; // пин, вход от датчика движения
int Flag = 0;
unsigned long previousMillis = 0;

void setup()
{
  pinMode(FAN, OUTPUT);
  pinMode(Light, OUTPUT);
  digitalWrite(FAN, HIGH);
  digitalWrite(Light, HIGH);
  digitalWrite(pinButton, LOW );

}

void loop()
{
  unsigned long currentMillis;
  if (digitalRead (pinButton) == HIGH && (Flag == 0))
  {
    digitalWrite(FAN, HIGH);// выключаем вытяжку
    digitalWrite(Light, LOW);//включаем свет
    delay (2000);
    Flag = 1;
  }  else  {
    digitalWrite(Light, HIGH);
    Flag = 0;

  }

  if (digitalRead (pinButton) == LOW)
  {
    currentMillis = millis();

    // проверяем сколько прошло времени,
    // если больше заданного - выключаем
    if (currentMillis - previousMillis >= OnTime)
    {
      ledState = LOW;
      previousMillis = 0;
      digitalWrite(FAN, HIGH);
      
    }
  }

  // если кнопка не нажата и Flag=1
  if (digitalRead (pinButton) == LOW && (Flag == 1))
  {
    previousMillis = currentMillis; // запоминаем время
    ledState = HIGH;
    digitalWrite(FAN, LOW);

  }
}

все работает как надо , но может что то можно улучшить - что пососетуете ?

 

Araris
Offline
Зарегистрирован: 09.11.2012

Люблю простые и понятные скетчи, респект.

Вместо digitalWrite(pinButton, LOW ); напишите лучше pinMode(pinButton,INPUT);

victorv
Offline
Зарегистрирован: 31.07.2015

Araris пишет:

Люблю простые и понятные скетчи, респект.

Вместо digitalWrite(pinButton, LOW ); напишите лучше pinMode(pinButton,INPUT);

 

Спасибо , исправил ... вот еще вопрос у меня датчик движения(HC-SR501) инфракрасный , но это в описании , на самом деле надо периодически частями тела двигать, чтобы он не выключался . Вот я и думаю- может поставить HC-SR04 ультразвуковой, по диаганали и мониторить дистанцию -уменшилась-включение, увеличилась -выкл ... все проще чем  долбаться с написанием программы  под датчик движения, чтоб несколько раз опрашивал и только потом делал вывод- что никого нет ?

Araris
Offline
Зарегистрирован: 09.11.2012

HC-SR501 на неподвижные объекты не реагирует, это датчик ДВИЖЕНИЯ. Так что все правильно, для определения наличия неподвижных объектов нужен ультразвуковой\инфракрасный дальномер, или что-то в этом роде.