1 (2014-03-27 00:25:30 отредактировано alexpzas)

Тема: Проблема с PIR датчиком

Доброго времени суток. Вродебы простая задача но столкнулся со след. проблемой - есть вот такой датчик http://arduino.shopium.ua/products/arduino-pir-sensor/ , по срабатыванию датчика должен включаться свет в комнате с пом. реле,на ардуину залил стандартный скетч из примеров

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, езультат тотже (((

2

Re: Проблема с PIR датчиком

К сожалению отклика так и не дождался (( но есть положительный момент, сам переписал код и он рабочий.

// Рабочая версия
#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);
      }
  }
}