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

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

Сообщение alexpzas » 26 мар 2014, 01:25

Доброго времени суток. Вродебы простая задача но столкнулся со след. проблемой - есть вот такой датчик
http://learn.adafruit.com/pir-passive-infrared-proximity-motion-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 минуты. Но сейчас срабатывает только на первое движение а на последующие нет реакции(если они входят в этот отведённый интервал установленный регулятором на датчике). Помогите пожалуйста решить проблему.
alexpzas
 
Сообщения: 8
Зарегистрирован: 13 июл 2013, 00:10
programming: c

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

Сообщение alexpzas » 26 мар 2014, 01:31

кстати переменную long unsigned int pause = 1000; ставил значение и 180000, езультат тотже (((
alexpzas
 
Сообщения: 8
Зарегистрирован: 13 июл 2013, 00:10
programming: c

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

Сообщение alexpzas » 28 мар 2014, 02:09

К сожалению , отклика так и не дождался, но есть положительный момент, сам переписал код и он рабочий. вот код , если кому интересно
Код: Выделить всё
// Рабочая версия
#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);
      }
  }
}

alexpzas
 
Сообщения: 8
Зарегистрирован: 13 июл 2013, 00:10
programming: c


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

© 2009-2019 |  О проекте  |  Политика Конфиденциальности  |