2 реле + 2 пир датчика
- Войдите на сайт для отправки комментариев
Ср, 23/03/2016 - 12:20
помогите что не так в коде. датчики срабатвают реле тоже, но сразу оба
//Тестировалось на Arduino IDE 1.0.1 //Время калибровки датчика (10-60 сек. по даташиту) int calibrationTime = 30; //Время, в которое был принят сигнал отсутствия движения(LOW) long unsigned int lowIn1; //Время, в которое был принят сигнал отсутствия движения(LOW) long unsigned int lowIn2; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет boolean lockLow1 = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет boolean lockLow2 = true; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения boolean takeLowTime1; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения boolean takeLowTime2; //Пауза, после которой движение считается оконченным long unsigned int pause = 5000; int pirPin1 = 2; //вывод подключения PIR-1 датчика int ledPin = 13; //вывод сигнального диода int relayPin1 = 4; //реле-1 пин int pirPin2 = 3; //вывод подключения PIR-2 датчика int relayPin2 = 5; //реле-2 пин void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(pirPin1, INPUT); pinMode(relayPin1, OUTPUT); pinMode(pirPin2, INPUT); pinMode(relayPin2, OUTPUT); digitalWrite(relayPin1, HIGH); digitalWrite(relayPin2, HIGH); delay(4000); digitalWrite(pirPin1, LOW); digitalWrite(pirPin2, LOW); //дадим датчику время на калибровку Serial.print("Calibrating"); for(int i = 0; i < calibrationTime; i++) { Serial.print("."); delay(1000); //Во время калибровки будет мигать сигнальный диод i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW); delay(1000); } //По окончанию калибровки зажжем сигнальный диод digitalWrite(ledPin, HIGH); Serial.println(" done"); Serial.println("SENSOR ACTIVE"); delay(50); } void loop() { //Если обнаружено движение 1 if(digitalRead(pirPin1) == HIGH) { //Если до этого момента еще не включили реле 1 if(lockLow1) { lockLow1 = false; Serial.println("Motion detected-1"); //Включаем реле 1. digitalWrite(relayPin1, LOW); delay(50); } takeLowTime1 = true; } //Если обнаружено движение 2 датчик if(digitalRead(pirPin2) == HIGH) { //Если до этого момента еще не включили реле 2 if(lockLow2) { lockLow2 = false; Serial.println("Motion detected-2"); //Включаем реле 2. digitalWrite(relayPin2, LOW); delay(50); } takeLowTime2 = true; } //Ели движения нет 1 if(digitalRead(pirPin1) == LOW) { //Если время окончания движения еще не записано 1 if(takeLowTime2) { lowIn1 = millis(); //Сохраним время окончания движения takeLowTime1 = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения } //Если время без движение превышает паузу => движение окончено 1 if(!lockLow1 && millis() - lowIn1 > pause) { //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения 1 lockLow1 = true; digitalWrite(relayPin1, HIGH); Serial.println("Motion finished-1"); delay(50); } } //Ели движения нет 2 датчик if(digitalRead(pirPin2) == LOW) { //Если время окончания движения еще не записано 2 if(takeLowTime2) { lowIn2 = millis(); //Сохраним время окончания движения 2 takeLowTime2 = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения } //Если время без движение превышает паузу => движение окончено 2 if(!lockLow2 && millis() - lowIn2 > pause) { //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения 2 lockLow2 = true; digitalWrite(relayPin2, HIGH); Serial.println("Motion finished-2"); delay(50); } } }
вроде понял в чем ошибка. исправил. может как нибуть код ужать, чтоб весил меньше?
может как нибуть код ужать, чтоб весил меньше?
С какой целью?
И каково целевое значение размера кода, которое Вас устроит?