Датчик движения свет вентилятор

ramzes.ru
Offline
Зарегистрирован: 19.11.2014

Решил в помещении поставить датчик движения для управления всетом, так как переодически забывают выключать свет. Свет включается и выключается нормально, но вот реле вытяжки не могу заставить корректно выключиться. Почему то после выключения занова включается освещение и так по кругу.

Куда копать?

//Время калибровки датчика (10-60 сек. по даташиту)
int calibrationTime = 30;        

//Время, в которое был принят сигнал отсутствия движения(LOW)
long unsigned int lowIn;         

//Пауза, после которой движение считается оконченным
long unsigned int pause = 10000;  
unsigned long holdTime = 0;
unsigned long blinkTime = 0;
//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow = true;
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime;  

int pirPin = 7;    //вывод подключения PIR сенсора
int ledPin = 8;
int ledPin2 = 9;
int CoolerPin = 10;
int LightPin = 11;

void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);
  pinMode(ledPin2, OUTPUT);
  digitalWrite(ledPin2, LOW);
  pinMode(CoolerPin, OUTPUT);
  digitalWrite(CoolerPin, LOW);
  pinMode(LightPin, OUTPUT);
  digitalWrite(LightPin, LOW);
  //дадим датчику время на калибровку
  Serial.print("calibrating sensor ");
  for(int i = 0; i < calibrationTime; i++){
    Serial.print(".");
    i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW);
    delay(1000);
  }
  Serial.println(" done");
  Serial.println("SENSOR ACTIVE");
  delay(50);
}

void loop(){

  if(digitalRead(pirPin) == HIGH) //Если обнаружено движение
  { 
    digitalWrite(ledPin, HIGH);   //LED включен
    if(lockLow) //Если до этого момента еще не включили реле
    {  
      lockLow = false;            
      Serial.println("---");
      Serial.print("motion detected at ");
      Serial.print(millis()/1000);
      Serial.println(" sec");
      digitalWrite(LightPin, HIGH);
      Serial.println("Light HIGH");
      //digitalWrite(CoolerPin, LOW);
      //Serial.println("Cooler LOW");
      digitalWrite(ledPin2, LOW); 
      delay(50);
    }         
    takeLowTime = true;
  }

  if(digitalRead(pirPin) == LOW){   //Ели движения нет    
     digitalWrite(ledPin, LOW);  //LED выключен
     if(takeLowTime)  //Если время окончания движения еще не записано
     {  
       lowIn = millis();          //Сохраним время окончания движения
       takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
     }
     if(!lockLow && millis() - lowIn > pause)  //Если время без движение превышает паузу => движение окончено 
     { 
       lockLow = true;     //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения                   
       Serial.print("motion ended at ");      //output
       Serial.print((millis() - pause)/1000);
       Serial.println(" sec");
       digitalWrite(LightPin, LOW);
       Serial.println("Light LOW");
       //digitalWrite(CoolerPin, HIGH);
       //Serial.println("Cooler HIGH");
       holdTime = millis();    // включаем таймер мигания светодиода 
       do 
       {
         digitalWrite(CoolerPin, HIGH);
         Serial.println("Cooler HIGH");
         digitalWrite(ledPin2, HIGH);
         Serial.println("LED2 HIGH");
         delay(200);
         digitalWrite(ledPin2, LOW);
         Serial.println("LED2 LOW");
         delay(200);
         
       }
       while(millis()-holdTime < 1000);
       blinkTime = millis();    // включаем таймер мигания светодиода 
       do 
       {
         digitalWrite(CoolerPin, LOW);
         Serial.println("Cooler LOW");
       }
       while(millis()-blinkTime < 10000);
       delay(50);
    }
  }
}

 Почему то когда используется команда digitalWrite(CoolerPin, LOW); весь цыкл запускается заново хотя движения нет

Все пометки сделаны для себя

vvadim
Offline
Зарегистрирован: 23.05.2012

попробуй уйти от while и do, замени на if

ramzes.ru
Offline
Зарегистрирован: 19.11.2014

vvadim пишет:

попробуй уйти от while и do, замени на if

а по каким критериям запускать вытяжку и через какое то время ее останавливать?