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

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем alexpzas, 26 мар 2014.

  1. alexpzas

    alexpzas Нуб

    Доброго времени суток. Вродебы простая задача но столкнулся со след. проблемой - есть вот такой датчик 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, езультат тотже (((
     
  2. alexpzas

    alexpzas Нуб

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