Доброго времени суток. Вродебы простая задача но столкнулся со след. проблемой - есть вот такой датчик http://arduino.shopium.ua/products/arduino-pir-sensor/ , по срабатыванию датчика должен включаться свет в комнате с пом. реле,на ардуину залил стандартный скетч из примеров Код (Text): 01 //Время калибровки датчика (10-60 сек. по даташиту) 02 int calibrationTime = 30; 03 04 //Время, в которое был принят сигнал отсутствия движения(LOW) 05 long unsigned int lowIn; 06 07 //Пауза, после которой движение считается оконченным 08 long unsigned int pause = 1000; 09 10 //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет 11 boolean lockLow = true; 12 //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения 13 boolean takeLowTime; 14 15 int pirPin = 41; //вывод подключения PIR датчика 16 int ledPin = 50; //вывод сигнального диода 17 int relayPin = 40; //реле пин 18 int PhotoRPin = A8; //Фоторезистор 19 int PhotoRValue; 20 21 void setup() 22 { 23 Serial.begin(9600); 24 25 pinMode(pirPin, INPUT); 26 pinMode(ledPin, OUTPUT); 27 pinMode(relayPin, OUTPUT); 28 29 //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять HIGH на LOW 30 digitalWrite(relayPin, LOW); 31 delay(4000); 32 digitalWrite(pirPin, LOW); 33 34 //дадим датчику время на калибровку 35 for(int i = 0; i < calibrationTime; i++) 36 { 37 //Во время калибровки будет мигать сигнальный диод 38 i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW); 39 delay(1000); 40 } 41 //По окончанию калибровки зажжем сигнальный диод 42 digitalWrite(ledPin, HIGH); 43 Serial.println("SENSOR ACTIVE"); 44 delay(50); 45 dht.begin(); 46 } 47 48 void loop() 49 { 50 51 { 52 PhotoRValue = analogRead(PhotoRPin); 53 Serial.println(PhotoRValue); 54 delay(1000); 55 } 56 //Если обнаружено движение 57 if(digitalRead(pirPin) == HIGH) 58 { 59 //Если до этого момента еще не включили реле 60 if(lockLow) 61 { 62 lockLow = false; 63 64 //Включаем реле. 65 //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять LOW на HIGH 66 if (PhotoRValue<50) 67 { 68 digitalWrite(relayPin, HIGH); 69 digitalWrite(ledPin, HIGH); 70 delay(50); 71 } 72 } 73 takeLowTime = true; 74 } 75 76 //Ели движения нет 77 if(digitalRead(pirPin) == LOW) 78 { 79 //Если время окончания движения еще не записано 80 if(takeLowTime) 81 { 82 lowIn = millis(); //Сохраним время окончания движения 83 takeLowTime = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения 84 } 85 //Если время без движение превышает паузу => движение окончено 86 if(!lockLow && millis() - lowIn > pause) 87 { 88 //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения 89 lockLow = true; 90 digitalWrite(relayPin, LOW); 91 digitalWrite(ledPin, LOW); 92 delay(50); 93 } }} Проблема в следующем - при движении датчик срабатывает и свет включается но через определённый интервал (выставленный физически регулятором на самом датчике ) свет гаснет не зависимо от того было ли движение в течении этого времени или нет. По логике нужно так , что после первого движения включается свет , потом если через время, например 3 минуты, движения небыло - свет выключается, если за это время было движение, то отсчёт опять обнуляется и опять ждём 3 минуты. Но сейчас срабатывает только на первое движение а на последующие нет реакции(если они входят в этот отведённый интервал установленный регулятором на датчике). Помогите пожалуйста решить проблему. кстати переменную long unsigned int pause = 1000; ставил значение и 180000, езультат тотже (((
К сожалению , отклика так и не дождался, но есть положительный момент, сам переписал код и он рабочий. вот код , если кому интересно Код (Text): // Рабочая версия #include <LiquidCrystal.h> LiquidCrystal lcd(3, 4, 25, 24, 23, 22); #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); //Время калибровки датчика (10-60 сек. по даташиту) int calibrationTime = 30; //Время, в которое был принят сигнал движения(HIGH) long unsigned int timee; //Пауза, после которой движение считается оконченным // 5 минут , таймер-резистр самого датчика стоит на минимуме 5 сек. long unsigned int pause = 300000; int pirPin = 41; //вывод подключения PIR датчика int ledPin = 50; //вывод сигнального диода (реле включено) int ledPin2 = 44; //вывод сигнального диода 2 (нет движения) int relayPin = 40; //реле пин int PhotoRPin = A8; //Фоторезистор int PhotoRValue; void setup() { Serial.begin(9600); lcd.begin(16, 2); lcd.print("Microklimat:"); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(relayPin, OUTPUT); digitalWrite(relayPin, LOW); delay(500); digitalWrite(pirPin, LOW); //дадим датчику время на калибровку for(int i = 0; i < calibrationTime; i++) { //Во время калибровки будет мигать сигнальный диод i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW); delay(1000); } //По окончанию калибровки зажжем сигнальный диод digitalWrite(ledPin, LOW); digitalWrite(ledPin2, LOW); Serial.println("SENSOR ACTIVE"); delay(50); dht.begin(); } void loop() { //выводим температуру и влажность на екранчик lcd.setCursor(0, 1); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { lcd.print("Temp-ra error"); } else { lcd.print("C="); lcd.print(t); lcd.print(" H="); lcd.print(h); } { PhotoRValue = analogRead(PhotoRPin); delay(1000); } //Если обнаружено движение if(digitalRead(pirPin) == HIGH) { // Записываем время когда началось дижение timee=millis(); digitalWrite(ledPin2, LOW); // Проверяем освещённость в комнате if (PhotoRValue<50) { //Включаем реле. digitalWrite(relayPin, HIGH); digitalWrite(ledPin, HIGH); // delay(50); } } //Ели движения нет if(digitalRead(pirPin) == LOW) { digitalWrite(ledPin2, HIGH); //Если время без движение превышает паузу => движение окончено if(millis()- timee > pause) { digitalWrite(relayPin, LOW); digitalWrite(ledPin, LOW); // delay(50); } } }