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);
}
}
}
вроде понял в чем ошибка. исправил. может как нибуть код ужать, чтоб весил меньше?
может как нибуть код ужать, чтоб весил меньше?
С какой целью?
И каково целевое значение размера кода, которое Вас устроит?