Страница 1 из 2

pir Датчики и длинна проводов

Добавлено: Сб янв 28, 2017 5:06 pm
LSE100
Приветствую всех,
Монтирую систему на реальном объекте и столкнулся с тем что pir датчики HC-SR501 ужасно глючат, на коротких проводах все норм, на длинных самопроизвольно срабатывают
Питание датчика от arduino 5V, ардуино запитываю от 12V, провода витая пара без экранировки

может есть у кого-то наработки по этой теме?


фото монтажа
https://yadi.sk/i/Mdkhx7OV3BTVit
https://yadi.sk/i/lUWDBkh83BTVpk
https://yadi.sk/i/YWJAgbmE3BTVuo

Код: Выделить всё

#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"


#include "DHT.h"

const int photoPin1 = A0;  // датчик света в кабинете
int val1 = 0;               //переменная храннения значения датчика света      
int raw = 0;



template<class T> inline Print &operator <<(Print &obj, T arg) { obj.print(arg); return obj; }


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xE4, 0xDE, 0x35 }; // MAC-адрес нашего устройства
byte ip[] = { 192, 168, 1, 120 };
byte subnet[] = { 255, 255, 255, 0 };
byte gateway[] = { 192, 168, 1, 1 };
byte dns_server[] = { 192, 168, 1, 1 };
// ip-адрес удалённого сервера
byte rserver[] = { 192, 168, 1, 130 };

long requestMillis;                                  // Задаем переменную времени последней передачи данных на сервер  температура
long interval = 200000;                            // Задаем максимальный интервал между передачами данных на сервер температура

long requestMillis_lig;                                  // Задаем переменную времени последней передачи данных на сервер  датчик света
long interval_lig = 400000;                            // Задаем максимальный интервал между передачами данных на сервер датчик света



#define pirPin1 22 // pir1_tualet_2fl   SW_tualet_2fl
#define pirPin2 23 // pir1_spaln_rodi   sw_spaln_rodi
#define pirPin3 24 // pir1_garderob     sw_garderob
#define pirPin4 25 // pir1_spaln_roma    sw_spaln_roma
#define pirPin5 26 // pir1_spaln_dets    sw_spaln_dets
#define pirPin6 27 // pir1_kabinet      sw_kabinet
#define pirPin7 28 // pir1_Hall_2fl    sw_Hall_2fl

#define DHTPIN_1 30// Пин DHT1   tualet_2fl
#define DHTPIN_2 31// Пин DHT2   spaln_rodi
#define DHTPIN_3 32// Пин DHT3   garderob
#define DHTPIN_4 33// Пин DHT4   spaln_roma
#define DHTPIN_5 34// Пин DHT5   spaln_dets
#define DHTPIN_6 35// Пин DHT6   kabinet
#define DHTPIN_7 36// Пин DHT7   Hall_2fl

#define DHTTYPE DHT11   // DHT 22  (AM2302)

int buttonState = 0;
 
int status1 = 0;
DHT dht_1(DHTPIN_1, DHTTYPE);
DHT dht_2(DHTPIN_2, DHTTYPE);
DHT dht_3(DHTPIN_3, DHTTYPE);
DHT dht_4(DHTPIN_4, DHTTYPE);
DHT dht_5(DHTPIN_5, DHTTYPE);
DHT dht_6(DHTPIN_6, DHTTYPE);
DHT dht_7(DHTPIN_7, DHTTYPE);


/**********************/
float old_temperature1=0;
float old_temperature2=0;
float old_temperature3=0;
float old_temperature4=0;
float old_temperature5=0;
float old_temperature6=0;
float old_temperature7=0;
float old_humidity=0;
float old_heatindex=0;
int old_light = 0; 
int old_door=0;
int old_movement_1=0;
int old_movement_2=0;
int old_movement_3=0;
int old_movement_4=0;
int old_movement_5=0;
int old_movement_6=0;
int old_movement_7=0;
int gateState = 0;
int old_Irms;
char buf[80];
int cmd = 0; //код выполняемой команды

/************************/

EthernetClient rclient;

#define PREFIX ""
WebServer webserver(PREFIX, 80);
  

/*********************************************************************************************************/
// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest() {
  Serial.println(buf); 
  if (rclient.connect(rserver, 80)) {
   Serial.println("OK"); 
   rclient.println(buf);
   rclient.println("Host: 192.168.1.3");
   rclient.println();   
   delay(2000);
   rclient.stop();
  } else {
   Serial.println("FAILED");     
  }

}

void setup()
{
  Ethernet.begin(mac, ip);
  webserver.begin();
  pinMode( photoPin1, INPUT );
  
  




  
  pinMode(pirPin1, INPUT); // Датчик движения pir1_tualet_2fl
  old_movement_1=digitalRead(pirPin1);
  digitalWrite(pirPin1, LOW); //начинаем работу движения нет

  pinMode(pirPin2, INPUT); // Датчик движения pir1_spaln_rodi
  old_movement_2=digitalRead(pirPin2);
   digitalWrite(pirPin2, LOW); //начинаем работу движения нет

  pinMode(pirPin3, INPUT); // Датчик движения pir1_garderob
  old_movement_3=digitalRead(pirPin3);
  digitalWrite(pirPin3, LOW); //начинаем работу движения нет

  pinMode(pirPin4, INPUT); // Датчик движения pir1_spaln_roma
  old_movement_4=digitalRead(pirPin4);
   digitalWrite(pirPin4, LOW); //начинаем работу движения нет
   
   pinMode(pirPin5, INPUT); // Датчик движения pir1_spaln_dets
  old_movement_5=digitalRead(pirPin5);
   digitalWrite(pirPin5, LOW); //начинаем работу движения нет
   
   pinMode(pirPin6, INPUT); // Датчик движения pir1_kabinet
   digitalWrite(pirPin6, LOW); //начинаем работу движения нет
  old_movement_6=digitalRead(pirPin6);

  pinMode(pirPin7, INPUT); // Датчик движения pir1_Hall_2fl
   old_movement_7=digitalRead(pirPin7);
   digitalWrite(pirPin7, LOW); //начинаем работу движения нет
  
  //pinMode(5, INPUT); // Датчик входной двери
 //digitalWrite(5, HIGH); 
// old_door=!digitalRead(5);
 
  //pinMode(9,OUTPUT); //В меге инициируем IR библиотеку через 9-й пин
 // digitalWrite(9, LOW);// Задаём низкий уровень сигнала
 
   Serial.begin(115200); // Скорость порта

    
  dht_1.begin();
  dht_2.begin();
  dht_3.begin();
  dht_4.begin();
  dht_5.begin();
  dht_6.begin();
  dht_7.begin();

}

void loop()
{    

  webserver.processConnection();

  
  // pir1_tualet_2fl
 int current_movement_1=digitalRead(pirPin1);
//  Serial.println(current_movement_1);
if (current_movement_1!=(int)old_movement_1) {
    old_movement_1=(int)current_movement_1;
    sprintf(buf, "GET /objects/?object=pir1_tualet_2fl&op=m&m=statusChanged& HTTP/1.0", (int)current_movement_1);
    sendHTTPRequest();
}
    
  // pir1_spaln_rodi
  int current_movement_2=digitalRead(pirPin2);
 // Serial.println(current_movement_2);
 if (current_movement_2!=(int)old_movement_2) {
    old_movement_2=(int)current_movement_2;
    
    sprintf(buf, "GET /objects/?object=pir1_spaln_rodi&op=m&m=statusChanged& HTTP/1.0", (int)current_movement_2);
    sendHTTPRequest();
    }


 // pir1_garderob
  int current_movement_3=digitalRead(pirPin3);
 // Serial.println(current_movement_2);
 if (current_movement_3!=(int)old_movement_3) {
    old_movement_3=(int)current_movement_3;
    
    sprintf(buf, "GET /objects/?object=pir1_garderob&op=m&m=statusChanged& HTTP/1.0", (int)current_movement_3);
    sendHTTPRequest();
    }
       

 // pir1_spaln_roma
  int current_movement_4=digitalRead(pirPin4);
 // Serial.println(current_movement_4);
 if (current_movement_4!=(int)old_movement_4) {
    old_movement_4=(int)current_movement_4;
    
    sprintf(buf, "GET /objects/?object=pir1_spaln_roma&op=m&m=statusChanged& HTTP/1.0", (int)current_movement_4);
    sendHTTPRequest();
    }
// pir1_spaln_dets 
  int current_movement_5=digitalRead(pirPin5);
 // Serial.println(current_movement_5);
 if (current_movement_5!=(int)old_movement_5) {
    old_movement_5=(int)current_movement_5;
    
    sprintf(buf, "GET /objects/?object=pir1_spaln_dets&op=m&m=statusChanged& HTTP/1.0", (int)current_movement_5);
    sendHTTPRequest();
    }

    // pir1_kabinet
  int current_movement_6=digitalRead(pirPin6);
 // Serial.println(current_movement_6);
 if (current_movement_6!=(int)old_movement_6) {
    old_movement_6=(int)current_movement_6;
    
    sprintf(buf, "GET /objects/?object=pir1_kabinet&op=m&m=statusChanged& HTTP/1.0", (int)current_movement_6);
    sendHTTPRequest();
    }

    // pir1_Hall_2fl
  int current_movement_7=digitalRead(pirPin7);
 // Serial.println(current_movement_7);
 if (current_movement_7!=(int)old_movement_7) {
    old_movement_7=(int)current_movement_7;
    
    sprintf(buf, "GET /objects/?object=pir1_Hall_2fl&op=m&m=statusChanged& HTTP/1.0", (int)current_movement_7);
    sendHTTPRequest();
    }

// температура tualet_2fl

  
if ((millis() - requestMillis) > interval)      // Если последняя передача данных на сервер была более 30 минут назад (например температура не менялась)...
{
  float current_temp1=0;
  float current_hum1=0;
  
  current_temp1=dht_1.readTemperature();
  current_hum1=dht_1.readHumidity();
   if (isnan(current_temp1) || isnan(current_hum1))
   {
    Serial.println("Failed to read from DHT");
//    requestMillis = millis();
  } else {

if (old_temperature1!=(float)current_temp1) {
  
   int temp1 = (current_temp1 - (int)current_temp1) * 100; // выделяем дробную часть
   sprintf(buf, "GET /objects/?object=temp_tualet_2fl&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp1, abs(temp1));   
   sendHTTPRequest();


 old_temperature1=(float)current_temp1;
// requestMillis = millis();
}
}
}

// температура spaln_rodi
if ((millis() - requestMillis) > interval)      // Если последняя передача данных на сервер была более 30 минут назад (например температура не менялась)...
{
  float current_temp2=0;
  float current_hum2=0;
  
  current_temp2=dht_2.readTemperature();
  current_hum2=dht_2.readHumidity();
   if (isnan(current_temp2) || isnan(current_hum2))
   {
    Serial.println("Failed to read from DHT");
  //  requestMillis = millis();
  } else {

if (old_temperature2!=(float)current_temp2) {
  
   int temp2 = (current_temp2 - (int)current_temp2) * 100; // выделяем дробную часть
   sprintf(buf, "GET /objects/?object=temp_spaln_rodi&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp2, abs(temp2));   
   sendHTTPRequest();


 old_temperature2=(float)current_temp2;
// requestMillis = millis();
}
}
}

// температура garderob

  
if ((millis() - requestMillis) > interval)      // Если последняя передача данных на сервер была более 30 минут назад (например температура не менялась)...
{
  float current_temp3=0;
  float current_hum3=0;
  
  current_temp3=dht_3.readTemperature();
  current_hum3=dht_3.readHumidity();
   if (isnan(current_temp3) || isnan(current_hum3))
   {
    Serial.println("Failed to read from DHT");
  //  requestMillis = millis();
  } else {

if (old_temperature3!=(float)current_temp3) {
  
   int temp3 = (current_temp3 - (int)current_temp3) * 100; // выделяем дробную часть
   sprintf(buf, "GET /objects/?object=temp_garderob&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp3, abs(temp3));   
   sendHTTPRequest();


 old_temperature3=(float)current_temp3;
// requestMillis = millis();
}
}
}

// температура spaln_roma

  
if ((millis() - requestMillis) > interval)      // Если последняя передача данных на сервер была более 30 минут назад (например температура не менялась)...
{
  float current_temp4=0;
  float current_hum4=0;
  
  current_temp4=dht_4.readTemperature();
  current_hum4=dht_4.readHumidity();
   if (isnan(current_temp4) || isnan(current_hum4))
   {
    Serial.println("Failed to read from DHT");
  //  requestMillis = millis();
  } else {

if (old_temperature4!=(float)current_temp4) {
  
   int temp4 = (current_temp4 - (int)current_temp4) * 100; // выделяем дробную часть
   sprintf(buf, "GET /objects/?object=temp_spaln_roma&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp4, abs(temp4));   
   sendHTTPRequest();


 old_temperature4=(float)current_temp4;
// requestMillis = millis();
}
}
}

// температура spaln_dets

  
if ((millis() - requestMillis) > interval)      // Если последняя передача данных на сервер была более 30 минут назад (например температура не менялась)...
{
  float current_temp5=0;
  float current_hum5=0;
  
  current_temp5=dht_5.readTemperature();
  current_hum5=dht_5.readHumidity();
   if (isnan(current_temp5) || isnan(current_hum5))
   {
    Serial.println("Failed to read from DHT");
   // requestMillis = millis();
  } else {

if (old_temperature5!=(float)current_temp5) {
  
   int temp5 = (current_temp5 - (int)current_temp5) * 100; // выделяем дробную часть
   sprintf(buf, "GET /objects/?object=temp_spaln_dets&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp5, abs(temp5));   
   sendHTTPRequest();


 old_temperature5=(float)current_temp5;
 //requestMillis = millis();
}
}
} 

// температура pir1_kabinet

  
if ((millis() - requestMillis) > interval)      // Если последняя передача данных на сервер была более 30 минут назад (например температура не менялась)...
{
  float current_temp6=0;
  float current_hum6=0;
  
  current_temp6=dht_6.readTemperature();
  current_hum6=dht_6.readHumidity();
   if (isnan(current_temp6) || isnan(current_hum6))
   {
    Serial.println("Failed to read from DHT");
  //  requestMillis = millis();
  } else {

if (old_temperature6!=(float)current_temp6) {
  
   int temp6 = (current_temp6 - (int)current_temp6) * 100; // выделяем дробную часть
   sprintf(buf, "GET /objects/?object=temp_kabinet&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp6, abs(temp6));   
   sendHTTPRequest();


 old_temperature6=(float)current_temp6;
// requestMillis = millis();
}
}
}

// температура Hall_2fl

  
if ((millis() - requestMillis) > interval)      // Если последняя передача данных на сервер была более 30 минут назад (например температура не менялась)...
{
  float current_temp7=0;
  float current_hum7=0;
  
  current_temp7=dht_7.readTemperature();
  current_hum7=dht_7.readHumidity();
   if (isnan(current_temp7) || isnan(current_hum7))
   {
    Serial.println("Failed to read from DHT");
//    requestMillis = millis();
  } else {

if (old_temperature6!=(float)current_temp7) {
  
   int temp7 = (current_temp7 - (int)current_temp7) * 100; // выделяем дробную часть
   sprintf(buf, "GET /objects/?object=temp_Hall_2fl&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp7, abs(temp7));   
   sendHTTPRequest();


 old_temperature7=(float)current_temp7;
 requestMillis = millis();
}
}
}



//датчик света

  
if ((millis() - requestMillis_lig) > interval_lig)      // Если последняя передача данных на сервер была более 30 минут назад (например температура не менялась)...
{
  val1 = analogRead(photoPin1);  // считываем значение с фоторезистора
  Serial.println(val1);
  sprintf(buf, "GET /objects/?object=lightsensor&op=m&m=lightChanged&l=%i HTTP/1.0", (int)val1);
   sendHTTPRequest();
  //val1 = val1/4;                 // конвертируем из 0-1023 к 0-255
//  analogWrite(ledPin1,val);     // устанавливаем значение
  requestMillis_lig = millis();
}

   
}

 

Re: pir Датчики и длинна проводов

Добавлено: Сб янв 28, 2017 10:18 pm
slgeo
Свои фото сами то смотрели?

Re: pir Датчики и длинна проводов

Добавлено: Вс янв 29, 2017 1:00 am
immortal
включите в скрипт обработку "дребезг контактов" либо функцией millis() либо библиотекой
#include "Bounce.h";
уверен есть ещё масса способов программного подавления дребезга, при чем pir датчик смело можно ставить антидребезг длительный

Re: pir Датчики и длинна проводов

Добавлено: Вс янв 29, 2017 7:41 am
akouz
В плате PIR сенсора в питании стоит линейный регулятор HT7133-1. Согласно даташиту на этот регулятор, у него на входе должен стоять конденсатор 10 мкФ. Однако на плате сенсора этого конденсатора нет, жадные китайцы сэкономили несколько центов. Вместо конденсатора они поставили диод, защищающий от переполюсовки питания.

Когда провода между источником питания 12В и платой сенсора короткие, регулятор работает нормально, поскольку на выходе источника 12В есть свой конденсатор. А когда провода длинные, то регулятор теряет устойчивость, самовозбуждается, из-за этого идут ложные срабатывания сенсора.

Напаяйте электролитический конденсатор 10 мкФ 35В на выводы питания платы PIR сенсора. А лучше даже прямо на выводы регулятора HT7133-1, тогда не будет сказываться вредное влияние диода на входе регулятора.

Re: pir Датчики и длинна проводов

Добавлено: Вс янв 29, 2017 9:54 pm
iapet
Дешевое хорошим не бывает. Тут не китайцы центы сэкономили, а топикстартер. Никогда не приходило в голову подумать почему в профессиональных системах используют OPTEX, а не HC-SR501? А иногда стоит...

Re: pir Датчики и длинна проводов

Добавлено: Пн янв 30, 2017 9:15 am
slgeo
immortal писал(а):включите в скрипт обработку "дребезг контактов" либо функцией millis() либо библиотекой
#include "Bounce.h";
уверен есть ещё масса способов программного подавления дребезга, при чем pir датчик смело можно ставить антидребезг длительный
Почему то программный способ сильно на костыль смахивает. Думаю, подобные вещи должны быть решены аппаратно, что и предложили следом.
В любом случае китайским датчикам не доверил бы ни грамма охранных функций, максимум - фиксация присутствия.

Re: pir Датчики и длинна проводов

Добавлено: Пн янв 30, 2017 8:51 pm
Руслан
У человека на ардуино собрано все и воткнуто прям в плату без какой либо защиты и подтяжек, а вы про OPTEX и проф.охранные датчики.
китайские тут как раз к месту.
Кстати они очень даже ничего,с срабатывают уверенно и за 1.5 года ни один не заглючил еще у меня.

Re: pir Датчики и длинна проводов

Добавлено: Вт янв 31, 2017 4:10 am
akouz
Руслан писал(а): Кстати они очень даже ничего,с срабатывают уверенно и за 1.5 года ни один не заглючил еще у меня.
На внутренней шине питания 3.3В нет ни одного керамического конденсатора, а стоит один-единственный электролит 22 мкФ неведомого качества. Скорей всего самый дешевый с малым сроком службы. Когда электролит высохнет, у вас тоже начнутся глюки.

Re: pir Датчики и длинна проводов

Добавлено: Вт янв 31, 2017 7:44 am
Руслан
akouz писал(а): Когда электролит высохнет, у вас тоже начнутся глюки.
может быть, не спорю. вечного ничего нет
выкину этот и куплю еще за 50руб ;)

Re: pir Датчики и длинна проводов

Добавлено: Вт янв 31, 2017 8:13 am
akouz
Руслан писал(а): может быть, не спорю. вечного ничего нет
выкину этот и куплю еще за 50руб
А как вы обнаружите, что он вышел из строя?