ВКЛ ВЫКЛ света в комнате

arter
Offline
Зарегистрирован: 16.01.2015
#include <LiquidCrystal.h>
#include "Ultrasonic.h"

// Trig - 2, Echo - 3
Ultrasonic IN2(2, 3);     // сонар в двери

// Trig - 6, Echo - 5
Ultrasonic START2(11, 10);  // сонар для подсчета

const int RelayChn3 = 13; // реле
//lcd
//pin 4  --  RS
//pin 5  --  E
//pin 6  --  D4
//pin 7  --  D5
//pin 8  --  D6
//pin 9  --  D7

LiquidCrystal lcd(4,5,6,7,8,9);

int i=0;                 // количество людей

unsigned long IN2_2= 0;    //когда сработал IN1
unsigned long START2_2= 0; //когда сработал START2
unsigned long previousMillis21= 0;
unsigned long IN_interval21= 2000; //  интервал измерения IN сонаром
unsigned long previousMillis22= 0;
unsigned long START_interval22= 2000; // интервал измерения START сонаром
unsigned long previousMillis23= 0;
unsigned long START_interval23= 1000; //  время подсчета количества людей

void setup()
{
  Serial.begin(9600);   
  lcd.begin(16, 2);  // start the serial port
  pinMode (RelayChn3, OUTPUT);
  digitalWrite(RelayChn3, HIGH);
  

}

void loop()
{
  float distIN2 = IN2.Ranging(CM);   
  delay(20);
  float distSTART2 = START2.Ranging(CM); 
  delay(20);
   
 
 // ОТРАБОТКА СОНАРА IN2__В ДВЕРЯХ
 
  if(distIN2 < 60){
   IN2_2= millis(); 
   previousMillis21 = millis();
              }
             
  // ВРЕМЯ ЗАМЕРА 0.5 сек.           
 if(previousMillis21 && (millis()-previousMillis21 >= IN_interval21))
	{ if(START2_2==0) {IN2_2=0;}
  
  previousMillis21 = 0;
   
	} 

// ОТРАБОТКА СОНАРА START__контроль в помещении
if(distSTART2 < 80){
   START2_2= millis(); 
   previousMillis22 = millis();
              }
             
  // ВРЕМЯ ЗАМЕРА 0.5 сек.           
 if(previousMillis22 && (millis()-previousMillis22 >= START_interval22))
	{
  if(IN2_2==0) {START2_2=0;}
  previousMillis22 = 0; 
  
	}   
lcd.setCursor(10, 0); 
  lcd.print(distSTART2);
// ПОДСЧЕТ ЛЮДЕЙ плюс

       if (IN2_2 > 100&&START2_2 >100&&( IN2_2 < START2_2))
        {
          i=i+1;
         IN2_2=0;
         START2_2=0;          
        }                
   if(previousMillis23 && (millis()-previousMillis23 >= START_interval23))
      {  
   previousMillis23 = millis();
    IN2_2=0;
    START2_2=0;  
       }  
 lcd.setCursor(0, 0); 
  lcd.print(distIN2);
// минус
// ПОДСЧЕТ ЛЮДЕЙ 

       if (IN2_2 > 100&&START2_2 > 100&&i >= 1&&( IN2_2 > START2_2))
             {
          i=i-1;
         IN2_2=0;
         START2_2=0;          
        
               }
   if(previousMillis23 && (millis()-previousMillis23 >= START_interval23))
      {
          
   previousMillis23 = millis();
       }
    
  // Если i=0 и выход
   if (IN2_2 > 100&&START2_2 > 100&&i ==0 &&( IN2_2 > START2_2))
        {
         IN2_2=0;
         START2_2=0;
         i=0;
        }  
  lcd.setCursor(7, 1); 
  lcd.print(i);
 
 // ВКЛЮЧЕНИЕ СВЕТА
if(i>=1)
 { 
   digitalWrite(RelayChn3, LOW);
 } else {
   digitalWrite(RelayChn3, HIGH);
         }
  if(previousMillis23 && (millis()-previousMillis23 >= START_interval23))
      {
          
   previousMillis23 = millis();
       }

 

доброго времени суток идея умного дома.

есть 2 ультрасоника, и реле и УНА. сонары расположены друг от друга примерно на 20-30 см, реле соответственно вкл выкл свет в комнате.

надо что бы пройдя над сонарами в одну сторону свет включился, если прошел кто то еще, он их посчитал, теперь при выходе пока все не выйдут реле не отключится,

собственно так этот код и работает, но есть тонкости... иногда при выходе сонары считают как будто один входит и тут же выходит, так получается , если 2 зашло и сонары тупанули, то выходить приходиться троим или четвером.

а в идеале надо, что бы сонары считали в обе стороны, и на вход и на выход, и если переходя их одной комнаты в другую, то в одной комнате свет выключается а в другой включается. по принципу если в комнате 0 человек то в комнате свет не горит, если больше 0 то горит

Coolerr
Offline
Зарегистрирован: 30.06.2014

А сами сонары так умеют? Не понял сразу, сонары стоят последовательно? Время опроса по моему большое.

inspiritus
Offline
Зарегистрирован: 17.12.2012

... а если прошли двое в обнимку :)

Coolerr
Offline
Зарегистрирован: 30.06.2014

Или проползли ? :)))))))))

Coolerr
Offline
Зарегистрирован: 30.06.2014

Обработка энкодера самый по моему мнению нормальный вариант.

arter
Offline
Зарегистрирован: 16.01.2015

сонары так умеют! HС-SR04. код работает, время опроса уменьшил, стало лучше, но проблема осталась, но уменшить растояние до 20-30 см (сейчас 50-60 см), и при перекрывании обоих сонаров начинает беспорядочно работать счетчик (а основном на +)

arter
Offline
Зарегистрирован: 16.01.2015

inspiritus пишет:

... а если прошли двое в обнимку :)

при выходе по очереди ктото останется без света, или пусть так же заходят

arter
Offline
Зарегистрирован: 16.01.2015

Coolerr пишет:

Или проползли ? :)))))))))

 

вы дома часто ползайте по полу?)))

arter
Offline
Зарегистрирован: 16.01.2015

Coolerr пишет:

Обработка энкодера самый по моему мнению нормальный вариант.

 

есть где про это можно прочитат

Coolerr
Offline
Зарегистрирован: 30.06.2014

arter пишет:

вы дома часто ползайте по полу?)))

Ну, жизненные ситуации всякие бывают ))))))).

http://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder

Araris
Araris аватар
Онлайн
Зарегистрирован: 09.11.2012