Датчик направления движения.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 

Всем доброго дня.

Представляю вам вот такой эксперимент. 

ИК датчик присутствия с определением направления движения объекта.

Устройство состоит из двух вот таких цифровых ИК датчиков (не дальномеров).

Дальность такого датчика не более десяти сантиметров, но для экспериментов пойдет.

 

Накидал вот такую программку. 

001bool flag=0;
002bool flag2=0;
003bool state=0;
004bool state2=0;
005 
006int val=0;
007 
008void setup()
009{               
010 Serial.begin(9600);
011 pinMode(A0,OUTPUT);
012 pinMode(A2,OUTPUT);
013 pinMode(A1,OUTPUT);
014      
015}
016 
017void loop()
018 
019{
020  
021   
022   
023  if(!digitalRead(9)&&!flag)
024  {
025    delay(50);
026     
027    flag=1;
028    if(flag2==0)
029    {
030     state=1;
031    }
032     
033  }
034   
035  if(!digitalRead(12)&&!flag2)
036  {
037    delay(50);
038     
039    flag2=1;
040    if(flag==0)
041    {
042     state2=1;
043    }
044     
045  }
046   
047  
048   
049   
050   
051   
052   if(digitalRead(12)&&digitalRead(9))
053  {
054     
055    if(!flag||!flag2)
056    {
057      state=0;
058      state2=0;
059      flag=0;
060      flag2=0;
061    }
062     
063     
064   if(flag&&state2)
065  {
066  val++;
067    digitalWrite(A0,HIGH);
068    digitalWrite(A2,LOW);
069  delay(100);
070     digitalWrite(A0,LOW);
071     digitalWrite(A2,LOW);
072  
073   
074  
075  flag=0;
076  flag2=0;
077  state2=0;
078  
079  }
080   
081   
082  if(flag2&&state)
083  {
084   val--;
085     digitalWrite(A2,HIGH);
086     digitalWrite(A0,LOW);
087  delay(100);
088     digitalWrite(A2,LOW);
089     digitalWrite(A0,LOW);
090     
091  
092  flag=0;
093  flag2=0;
094  state=0;
095     
096  }
097  }
098  if(val<=0)
099  {
100    digitalWrite(A1,LOW);
101   
102  }
103   
104  else
105  {
106    digitalWrite(A1,HIGH);
107  }
108     
109   
110  Serial.println(val);
111}

Алгоритм примерно такой. Когда на одном из датчиков появляется низкий уровень (датчики инверсные), переменной flag присваивается значение 1 . В то же время переменной state присваивается значение 1 .

Тем самым программа блокирует изменение второй переменной flag.

Когда сигнала на датчиках нет , но есть изменения в значениях state и state2 , программа совершает Определенные действия. В данном случае мигает светодиодами (когда значение val>0 включает средний светодиод), прибавляет/отнимает еденицу к переменной val и выводит ее значение на монитор.

Для того чтобы значение val изменилось должны сработать оба датчика. Программа игнорирует срабатывание только одного датчика и сбрасывает переменные в ноль.

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

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Вот видео эксперимента http://video.mail.ru/mail/heruvim219/5/30.html .

А вот тот же эксперимент , но с более "Дальнобойными" датчиками http://video.mail.ru/mail/heruvim219/5/33.html .

Sherzod
Offline
Зарегистрирован: 17.04.2016

Здравствуйте!

Хочу реализовать подсчет кол-во вошедших и вышедших людей из комнаты с ИК светодиодными датчиками. Подойдет ли для этого вот такой ИК светодиод: http://arduino-kit.ru/catalog/id/modul-ik-svetodioda

Слышал еще про TSOP. Что лучше для этой цели?

krepton85
Offline
Зарегистрирован: 02.02.2016

Всем привет, я наконецто реализовал этот проект, вот тут смотрите: https://youtu.be/vbfXED8Dfuk

dmitron1036
Offline
Зарегистрирован: 10.01.2016

скетчи давай

krepton85
Offline
Зарегистрирован: 02.02.2016

Так под видео есть же сцылки. :)

dmitron1036
Offline
Зарегистрирован: 10.01.2016

есть правила раздела "проекты".

Там есть требование выкладывать текст скетча сюда.

Что нам обсуждать? где нам обсуждать? на ютюбе?

Что я узнал из конкретно этой темы? если ничего - давайте её удалим.

krepton85
Offline
Зарегистрирован: 02.02.2016

Ок. Позже выложу.

Araris
Offline
Зарегистрирован: 09.11.2012

dmitron1036 пишет:

есть правила раздела "проекты".

Там есть требование выкладывать текст скетча сюда.

Что нам обсуждать? где нам обсуждать? на ютюбе?

Что я узнал из конкретно этой темы? если ничего - давайте её удалим.

dmitron1036, поделитесь ссылочкой пожалуйста, всегда хотел почитать правила раздела "проекты". Особенно интересно найти в них "требование выкладывать текст скетча сюда".

krepton85
Offline
Зарегистрирован: 02.02.2016

dmitron1036 пишет:

скетчи давай

Вот для arduino pro mini:

01// предназначен для использования с ИК фотоприемниками HL536AA3P
02// Внимание!!! не все современные ИК фотоприемники могут постоянно удерживать состояние LOW на выходе
03//при непрерывном облучении ИК излучением с их несущей частотой, такие ИК ФП не подойдут.
04 
05#include <Arduino.h>
06#include <TM1637Display.h>
07#define CLK 3
08#define DIO 2
09TM1637Display display(CLK, DIO);
10 
11const int ledPin_1 = 4; // ИК света-диод 1
12 
13const int ledPin_3 = 5;// индикация сработки ик луча 1 orange
14const int ledPin_4 = 6;// индикация сработки ик луча 2 red
15long counts; //количество людей в помещении
16 
17int ledPin_6 = 7; // реле пин
18int IN_IR_1 = 9; // вход ИК фото-приемника 1
19int IN_IR_2 = 8; // вход ИК фото-приемника 2
20 
21int State; //састоянии для алгоритма, определяющего направление движения
22char Send_serial; // для однакратной отправки буквы в сериал порт
23void setup() {
24  
25pinMode(ledPin_1, OUTPUT); 
26 
27pinMode(IN_IR_1, INPUT);
28pinMode(IN_IR_2, INPUT);
29pinMode(ledPin_3, OUTPUT);
30pinMode(ledPin_4, OUTPUT);
31pinMode(ledPin_6, OUTPUT);
32counts = 0;
33Serial.begin(9600);
34Send_serial = 'b';
35}
36void loop() {
37  tone(ledPin_1, 36000); //36кГц частота с каторой работает ИК фота - приемник по даташиту на HL536AA3P 36 кГц
38 
39if(digitalRead(IN_IR_1) == LOW) { // индикация работы ИК луча 1, если не пересечен то светадиод  ledPin_3 светит, иначе не светит
40  digitalWrite(ledPin_3, HIGH);
41}else{
42  digitalWrite(ledPin_3, LOW);
43}
44 
45if(digitalRead(IN_IR_2) == LOW) { // индикация работы ИК луча 2, если не пересечен то светадиод  ledPin_4 светит, иначе не светит
46  digitalWrite(ledPin_4, HIGH);
47}else{
48  digitalWrite(ledPin_4, LOW);
49}
50//////////////Алгоритм опредиляющий направление движения/////////////
51  
52if(digitalRead(IN_IR_1) == LOW  && digitalRead(IN_IR_2) == LOW) State = 0;
53 
54if(digitalRead(IN_IR_1) == HIGH && digitalRead(IN_IR_2) == LOW && State == 0) State = 1;
55if(digitalRead(IN_IR_2) == HIGH && digitalRead(IN_IR_1) == LOW && State == 1) State = 2; //1 человек вошел
56 
57 
58if(digitalRead(IN_IR_2) == HIGH && digitalRead(IN_IR_1) == LOW && State == 0) State = 4;
59if(digitalRead(IN_IR_1) == HIGH && digitalRead(IN_IR_2) == LOW && State == 4) State = 5; //  1 человек вышел
60 
61 
62if (State == 2) {
63  counts = counts +1;
64   
65   State = 0;
66   }
67 
68if (State == 5) {
69  counts = counts -1;
70   
71  State = 0;
72  }
73   
74if(counts > 0){
75digitalWrite(ledPin_6, HIGH);
76if(Send_serial == 'b'){
77  Serial.println('a');//для отправки wi fi модулю, команда на включения
78  Send_serial = 'a';
79}
80}
81if(counts <= 0) {
82  digitalWrite(ledPin_6, LOW);
83 if(Send_serial == 'a'){
84  Serial.println('b');//для отправки wi fi модулю, команда на выключения
85  Send_serial = 'b';
86 }
87}
88if(counts < 0) counts = 0; //обнуляем отрицательные значения количества
89 
90 
91 uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
92 display.setBrightness(0x0f);
93 
94 display.showNumberDec(counts, false, 4, 0); //выводим колличество человек на дисплэй.
95//Serial.print("counts:  ");
96//Serial.println(counts);
97}

для версии с wi fi ДУ сектчь для самого модуля esp8266 esp-01:

01#include <Arduino.h>
02 
03#include <ESP8266WiFi.h>
04#include <ESP8266WiFiMulti.h>
05 
06#include <ESP8266HTTPClient.h>
07 
08#define USE_SERIAL Serial
09 
10ESP8266WiFiMulti WiFiMulti;
11int incomingByte = 0;
12void setup() {
13   
14 USE_SERIAL.begin(9600);
15 USE_SERIAL.println('1');
16 USE_SERIAL.println('2');
17 USE_SERIAL.println('3');
18 WiFiMulti.addAP("ваш ssid роутера", "пароль от роутера");
19  
20 
21}
22 
23void loop() {
24  if((WiFiMulti.run() == WL_CONNECTED)) {
25USE_SERIAL.println("WIFi_connected");
26        HTTPClient http;
27        if(Serial.available() > 0) incomingByte = Serial.read();
28        if(incomingByte == 'a'){
29          USE_SERIAL.println('a');
30          http.begin("<a href="http://192.168.0.128:2010/?PIN8=on" rel="nofollow">http://192.168.0.128:2010/?PIN8=on</a>"); //HTTP прямая ссылка на включение нагрузки arduino pin web server
31        }
32        if(incomingByte == 'b'){
33          USE_SERIAL.println('b');
34          http.begin("<a href="http://192.168.0.128:2010/?PIN8=off" rel="nofollow">http://192.168.0.128:2010/?PIN8=off</a>"); //HTTP прямая ссылка на выключение нагрузки arduino pin web server
35        }
36        int httpCode = http.GET();
37        if(httpCode > 0) {
38            // HTTP header has been send and Server response header has been handled
39            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
40 
41            // file found at server
42            if(httpCode == HTTP_CODE_OK) {
43                String payload = http.getString();
44                USE_SERIAL.println(payload);
45            }
46        } else {
47            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
48        }
49        http.end();
50    }
51    delay(100);
52}

Еще раз настоятельно уверяю - не все ИК фотоприемники подайдут т.к. не все могут удерживать непреривно на выходе низкий уровень, при непреривном облучении ИК излучением с несущей частотой. У некоторых фотоприемников есть ограничение не только по несущей частоте но и по частоте передачи данных, она должна быть в определенном деапозоне например от 1 до 3 кГц, это значит такой фотоприемник не подайдет, он на выход может только в импульсном режиме выводить информацию. Если вы все же собрали устройство с неподходящими Ик ФП то света-диоды индикации работы датчиков не будут светится, при облучении ИК ФП.

Схемма : 

 

dmitron1036
Offline
Зарегистрирован: 10.01.2016

esp8266 esp-01 в wi-fi сетях с кодированием (WPA2) работает?

антенку внешнюю подключить можно?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

dmitron1036 пишет:

esp8266 esp-01 в wi-fi сетях с кодированием (WPA2) работает?

ESP8266 работает с WEP, WPA, WPA2, WPA+WPA2

dmitron1036 пишет:

антенку внешнюю подключить можно?

К esp-01 нет. Антеннки цепляются к esp-02, esp-05, esp-07 у которых есть разъем IPX для внешней антенны.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

как точка доступа esp8266 работать может?

krepton85
Offline
Зарегистрирован: 02.02.2016

dmitron1036 пишет:

как точка доступа esp8266 работать может?


Да. А вообще зависит многое от прошивки, но точку доступа на любой поддерживает. На оригинальной AT прошивке например можно создать только tcp/ udb сервер/клиент, не подлерживает http протакол, а если ардуинить прямо в модуль то тут много интересных протаколов / сервисов.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

dmitron1036 пишет:

как точка доступа esp8266 работать может?

Может даже одновременно и точкой доступа и клиентом работать.

Craftman
Offline
Зарегистрирован: 14.03.2018

Можете пожалуйста розьяснить как это собрать. И  что для этого нужно заранее спасибо