Датчик движения свет вентилятор
- Войдите на сайт для отправки комментариев
Ср, 17/12/2014 - 15:51
Решил в помещении поставить датчик движения для управления всетом, так как переодически забывают выключать свет. Свет включается и выключается нормально, но вот реле вытяжки не могу заставить корректно выключиться. Почему то после выключения занова включается освещение и так по кругу.
Куда копать?
//Время калибровки датчика (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); весь цыкл запускается заново хотя движения нет
Все пометки сделаны для себя
попробуй уйти от while и do, замени на if
попробуй уйти от while и do, замени на if
а по каким критериям запускать вытяжку и через какое то время ее останавливать?