Датчик движения свет вентилятор
- Войдите на сайт для отправки комментариев
Ср, 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
а по каким критериям запускать вытяжку и через какое то время ее останавливать?