счетчик - датчик кол-ва человек в комнате

Кренделек
Offline
Зарегистрирован: 24.04.2017

Прошу проконсультировать по железу. 

Задача: включать свет в комнате если в ней кто либо есть. Если пришло несколько, то помнить кол-во и при выходе последнего гасить свет. 

рассматривал 2 pir датчика в дверном проеме, но почитал, что ему надо время на восстановление "способности видеть" следующего и минимальное растояние 3 метра.

Также рассматриваю 2 ky-022  и напротив постаить светодиод, который, как я понял, должен светить "частотой".

Какие варианты еще возможны?

 

negavoid
Offline
Зарегистрирован: 09.07.2016

Raspberry Pi, видеокамера, opencv и распознавание фигур.

alex_r61
Offline
Зарегистрирован: 20.06.2012

negavoid пишет:

Raspberry Pi, видеокамера, opencv и распознавание фигур.

Чё так мелко? Intel Server за 5 штук баксов и ни копейкой меньше.  PIR датчики тормознутые, пробовал, работало только если проходили по одному и не быстро. Но ту мелкие стали носиться и усё накрылось.))) Надо ик барьер ставить, причём два луча, это лучше работает.

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

Кренделек пишет:

Какие варианты еще возможны?

Я делал на двух парах лазер - фоторезистор. С одной стороны дверного проёма светит лазерок на фоторезистор на другой стороне проёма. Фоторезистор от боковых засветок прикрыт тубусом. Работает, но усложнено конструктивно, нужна чёткая фиксация положения источников и приёмников.

В данный момент у меня стоит "на прогоне" счётчик входящих/выходящих на двух vl53l0x, этот вариант конструктивно гораздо проще, скетч практически тот же.

Кренделек, дойдёте до программной части - спрашивайте, со скетчем помогу.

alex_r61
Offline
Зарегистрирован: 20.06.2012

Я ещё на дверь геркон вешал, т.е. дверь закрыта - вся "светомузыка" выключена.

Кренделек
Offline
Зарегистрирован: 24.04.2017

Araris пишет:

Кренделек пишет:

Какие варианты еще возможны?

Я делал на двух парах лазер - фоторезистор. С одной стороны дверного проёма светит лазерок на фоторезистор на другой стороне проёма. Фоторезистор от боковых засветок прикрыт тубусом. Работает, но усложнено конструктивно, нужна чёткая фиксация положения источников и приёмников.

В данный момент у меня стоит "на прогоне" счётчик входящих/выходящих на двух vl53l0x, этот вариант конструктивно гораздо проще, скетч практически тот же.

Кренделек, дойдёте до программной части - спрашивайте, со скетчем помогу.

А чем была вызвана необходимость использовать пару лазер- фоторезистор? сколько это стоило со всей обвязкой?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Пара для определения направления.... неуже ли не понятно ?

Кренделек
Offline
Зарегистрирован: 24.04.2017

brokly пишет:

Пара для определения направления.... неуже ли не понятно ?

Для тех кто в танке поясню: почему лазер и фоторезистор, а не светодиод и фототранзистор. 

И, Да, зачем две пары мне пояснять не нужно.

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

Кренделек пишет:

А чем была вызвана необходимость использовать пару лазер- фоторезистор? сколько это стоило со всей обвязкой?

Необходимости не было, просто была под рукой пара 5mW-лазеров и кулёчек фоторезисторов. Обвязки они не требуют, разве что пару резисторов на подтяжку, цены, соответственно, копеечные.

Кренделек
Offline
Зарегистрирован: 24.04.2017

Заказал сейчас с десяток vs1838 на али и Мегу2560.  Щас надо подобрать светодиоды для их взаимопонимания. таймер подберу-закажу и есть задумка связь организовать до  андроид телефона. чтоб не на дисплее глазеть, а на диване в телефоне смотреть где что как работает.

yray
Offline
Зарегистрирован: 08.01.2015

Araris пишет:

дойдёте до программной части - спрашивайте, со скетчем помогу.

Подскажете код для счетчика на двух vl53l0x ?

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

yray пишет:

Подскажете код для счетчика на двух vl53l0x ?

С удовольствием, оговорюсь лишь, что где-то здесь на форуме я позже видел более простую и изящную реализацию алгоритма подсчёта людей, сейчас не нашёл, может кто-то из коллег подскажет ?

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

Схема :

Скетч :

// Алгоритм подсчёта следующий:
// чтобы проход человека был засчитан, необходима
// последовательность срабатывания датчиков
// 00
// 10
// 11
// 01
// 00 в "прямом" проходе
// и
// 00
// 01
// 11
// 10
// 00 в "обратном" проходе
// Все прочие последовательности не засчитываются.
// Продолжительность прохода не учитывается, можно стоять в дверях 
// сколь угодно долго, а затем вернуться, либо пройти,
// проход будет незасчитан/засчитан соответственно. 
#define DEBUG 1    
//
#include <Wire.h>
#include <VL53L0X.h>
//
#define VL53L0X_XSHUT1_PIN    7 // Эти пины понадобятся для изменения адреса второго VL53L0X с 41 на 42
#define VL53L0X_XSHUT2_PIN    8 // Эти пины понадобятся для изменения адреса второго VL53L0X с 41 на 42
//
#define VL53L0X1_ADDRESS     41 // строка просто для информации, дефолтный адрес VL53L0X. 
#define VL53L0X2_ADDRESS     42 // это новый адрес второго датчика
VL53L0X VL53L0X_1;
VL53L0X VL53L0X_2;
#define minDistance         600 // ширина дверного проёма у меня 70 с чем-то см, срабатывание датчиков будем засчитывать, если измерено расстояние менее 60-ти см.
bool VL53L0X_1_state = false;   // флаг срабатывания первого датчика
bool VL53L0X_2_state = false;   // флаг срабатывания второго датчика
bool VL53L0X_1_already = false; // флаг "первый датчик уже сработал" 
bool VL53L0X_2_already = false; // флаг "второй датчик уже сработал" 
bool VL53L0X_together = false;  // флаг "оба датчика уже сработали" 
byte VL53L0X_first = 0;         // принимает значения 0,1,2 , показывает, какой из датчиков сработал первым
int HumanCounter = 0;
int OldHumanCounter = 0;

void setup()
{
/////////// На старте сразу "гасим" пины XSHUT обоих датчиков
pinMode(VL53L0X_XSHUT1_PIN, OUTPUT);
pinMode(VL53L0X_XSHUT2_PIN, OUTPUT);
//
#ifdef DEBUG
 Serial.begin(9600);
 Serial.println("");
 Serial.println(F("Two VL53L0X HumanCounter."));
#endif  
Wire.begin();
/////////// Меняем адрес второго датчика и "поднимаем" оба датчика
pinMode(VL53L0X_XSHUT2_PIN, INPUT);
delay(10);
VL53L0X_2.setAddress(VL53L0X2_ADDRESS);
pinMode(VL53L0X_XSHUT1_PIN, INPUT);
delay(10);
/////////// Запускаем оба VL53L0X
VL53L0X_1.init();
VL53L0X_2.init();
VL53L0X_1.setTimeout(250);
VL53L0X_2.setTimeout(250);
// To use continuous timed mode instead, provide a desired inter-measurement period in ms.
VL53L0X_1.startContinuous(50);
VL53L0X_2.startContinuous(50);
}

void loop()
{
////////// Читаем показания датчиков и выставляем флаги срабатывания
unsigned int Distance1 = VL53L0X_1.readRangeContinuousMillimeters();  
unsigned int Distance2 = VL53L0X_2.readRangeContinuousMillimeters();  
VL53L0X_1_state = (Distance1 < minDistance);
VL53L0X_2_state = (Distance2 < minDistance);
////////// Вот тут самое главное - анализируем флаги срабатывания и прочие флаги. Расписано неоптимально, зато подробно.
if ( !VL53L0X_1_state && !VL53L0X_2_state) // VL53L0X_1 off, VL53L0X_2 off
 {
 if ( VL53L0X_first > 0 && VL53L0X_together && VL53L0X_1_already && VL53L0X_2_already)
  {
  if ( VL53L0X_first == 1) // IN
   {
   HumanCounter++;
   }  
  else // OUT
   {
   HumanCounter--;
   }
  }
 VL53L0X_1_already = false;
 VL53L0X_2_already = false;
 VL53L0X_together = false;
 VL53L0X_first = 0;
 }  
else if ( VL53L0X_1_state && !VL53L0X_2_state) // VL53L0X_1 ON, VL53L0X_2 off
 {
 VL53L0X_1_already = true;
 if ( !VL53L0X_2_already )
  {
  VL53L0X_first = 1; 
  }
 }  
else if ( !VL53L0X_1_state && VL53L0X_2_state) // VL53L0X_1 off, VL53L0X_2 ON
 {
 VL53L0X_2_already = true;
 if ( !VL53L0X_1_already )
  {
  VL53L0X_first = 2;
  }
 }  
else if ( VL53L0X_1_state && VL53L0X_2_state) // VL53L0X_1 ON, VL53L0X_2 ON
 {
 if ( VL53L0X_1_already && VL53L0X_2_already && VL53L0X_together ) 
  {
  if ( VL53L0X_first == 1 ) 
   {
   VL53L0X_2_already = false;
   }
  if ( VL53L0X_first == 2 ) 
   {
   VL53L0X_1_already = false;
   }
  }
 VL53L0X_together = true;
 }  
////////// Конец анализа.
if ( HumanCounter != OldHumanCounter ) 
 {
 #ifdef DEBUG
 Serial.print(F("HumanCounter = "));
 Serial.println(HumanCounter);
 #endif  
 }
OldHumanCounter = HumanCounter;
}

Библиотека и все прочее - здесь : https://www.dropbox.com/sh/qubrwqpkdxd5do2/AACCeNbGvCoo0kzkZtRk-0qda?dl=0

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Одобряю!

vl53l0x очень хорошие датчики.

yray
Offline
Зарегистрирован: 08.01.2015

Спасибо. Второй датчик не имеет смысла шунтировать если у него используется дефолтный адрес, ничего принципиального, но можно съэкономить один пин мк и не тянуть лишний провод используя не 6 а 5 проводный шлейф например из usb кабеля. Также второй датчик шунтируем и запускаем скетч, первомый датчик назначает себе дефолтный адрес, снимаем шунт и инициализируем второй новым адресом. У нас получится два датчика с разными адресами.

yray
Offline
Зарегистрирован: 08.01.2015

Я код счетчика ичпользовал такой 

if ( !s1 && !s2) // IR1 off, IR2 off.
 //if ( !IR1_state && !IR2_state) // IR1 off, IR2 off.
    {
      if ( IR1IR2_first > 0 && IR1IR2_already && IR1_already && IR2_already)
         {
          if ( IR1IR2_first == 1) {hn++;}
          else {hn--;}
         }
     IR1_already = 0;
     IR2_already = 0;
     IR1IR2_already = 0;
     IR1IR2_first = 0;
     } 
  if ( s1 && !s2) // IR1 on, IR2 off.
     {
     IR1_already = 1;
     if ( !IR2_already ) {IR1IR2_first = 1;}
     } 
  if ( !s1 && s2) // IR1 off, IR2 on.
     {
     IR2_already = 1;
     if ( !IR1_already ) {IR1IR2_first = 2;}
     }
  if ( s1 && s2) // IR1 on, IR2 on.
     {IR1IR2_already = 1;} 

  if ( hn < 0 ) {hn = 0;}
  if ( hn != ho ){
    Serial.print("Chel:");
    Serial.println(hn);
    client.publish(topic_in,String(hn)); // отправляем в топик для людей количество людей
ho = hn;

Но его качество работы сильно зависит от скорости как самого скетчя так и прохода через датчики.

На ардуино все работало нормально а вот перенес на ESP8266 и библиотека VL53L0X.h стала намертво вешать еспшку да так что и через сторожевой таймер не перезапускается. 

Есть еще библиотека от VL53L0X от адафрут, она не вешает есп, но крайне убога, тормозна и датчики с ней работают не стабильно.

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

yray пишет:

Я код счетчика ичпользовал такой 

А, ну так это он и есть, самый первый вариант на инфракрасных датчиках.

От скорости скетча действительно зависит, на "длинном loop" проблематично работает, даже при использовании прерываний.

yray
Offline
Зарегистрирован: 08.01.2015

Возможно там нужен таймаут: чтото типа сработал первый датчик, запускаем таймаут, скажем пол секунды,и ждем сработки второго, если в течении таймаута сработал второй увеличиваем счетчик, если нет, обнуляем состояние первого и наоборот соответственно.

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

Не соглашусь, я специально акцентировал, что

016 // Продолжительность прохода не учитывается, можно стоять в дверях
017 // сколь угодно долго, а затем вернуться, либо пройти,
018 // проход будет незасчитан/засчитан соответственно.
 

Это опыт из реальной жизни, так сказать )). Обкатку счётчика на достоверность счёта проводит моя жена, иногда удивляя меня тем, как всё же можно обмануть два датчика в тесноватой прихожей.

Кстати, у меня в работающем счётчике на входной двери задействован также датчик состояния двери (откр/закр), весьма помогает достоверности счёта.

alex_r61
Offline
Зарегистрирован: 20.06.2012

Araris пишет:

Это опыт из реальной жизни, так сказать )). Обкатку счётчика на достоверность счёта проводит моя жена...

Надо ещё пару киндеров подключить к обкатке, эти любую логику сломают и мозг вынесут :)

yray
Offline
Зарегистрирован: 08.01.2015

Araris это я про свой код говорил, ваш еще не испытывал, но обязательно попробую, как смогу добиться нормальной работы дальномеров с ЕСП

yray
Offline
Зарегистрирован: 08.01.2015

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

Penumbra
Offline
Зарегистрирован: 06.08.2017

можно поставить 2 ик диода и приемника  вместо лазера. каждый ИК диод работае на своей частоте - тем самым вы защитите себя от ложных срабатываний (засветов) .. е сли помещение маленькое, аля сартир, то можно и ёмкостной датчик зафигарить..

yray
Offline
Зарегистрирован: 08.01.2015

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

Penumbra
Offline
Зарегистрирован: 06.08.2017

yray пишет:

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

ик диодов на 280р можно купить ведро и маленькую тележку, + если каждый ик диод работает на своей частоте то нет необходимости в точной настройке (как пульт от тв навел примерно в сторону датчика и все) 

с помощью дальномера определить колво входящих и выходящих людей будет тяжеловато.. а с диодом тупо считать количество перекрытий с учетом если перекрылся сначала первый а потом второй то в +1 пипл а если сначала перекрывается второй а потом первый то -1 чел .. логика примитивная..

дешиво и сердито.. хотя для настоящего ардуинщика на примитивную схему надо навесить с десяток шилдов и чем дороже тем круче :)))

yray
Offline
Зарегистрирован: 08.01.2015

Всмысле - с помощью дальномера определить колво входящих и выходящих людей будет тяжеловато.. ??? Эта тема как раз об определениии входящих/выходящих и подсчета чила оставшихся, вы тему то вообще смотрели, или так просто написать чтобы было?Причем речь идет о действующих конструкциях а не теоретических изысканиях. 

Про диоды про все так просто вы придумали или эта действующая конструкция? Потому что я очень сомневаюсь что просто два свето и фото диода будет нормально считать. Ибо даже заводские датчики E18-D80NK с точно настроенными линзами, модуляторами/демодуляторами, регуляторами, усилителями и компараторами работают в таком режиме далеко не стабильно, может потому что китайского производства, но факт остается фактом, именно практическое примение дальномеров в таком режиме даёт максимально простую в монтаже/ настройке и стабильную в работе конструкцию

yray
Offline
Зарегистрирован: 08.01.2015

Araris пишет:
Это опыт из реальной жизни, так сказать )). Обкатку счётчика на достоверность счёта проводит моя жена, иногда удивляя меня тем, как всё же можно обмануть два датчика в тесноватой прихожей.

Подскажите зачем вы использовали VL53L0X_1.startContinuous(50); это же вносит паузу в измерения, может как раз она и приводит к "обманыванию" датчика? Или этот параметр был как то эксперементально подобран?

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

Я пробовал с нулевой паузой, с 50, 100, 150, разницы особо и не заметил. Сейчас стоит 50 исключительно для "экономии тактов процессора" ))).

yray
Offline
Зарегистрирован: 08.01.2015

А сколько у вас расстояние между датчиками ?

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

Сантиметров 10-12.

andrewkik
Offline
Зарегистрирован: 09.11.2018

Araris пишет:

Кренделек пишет:

Какие варианты еще возможны?

Я делал на двух парах лазер - фоторезистор. С одной стороны дверного проёма светит лазерок на фоторезистор на другой стороне проёма. Фоторезистор от боковых засветок прикрыт тубусом. Работает, но усложнено конструктивно, нужна чёткая фиксация положения источников и приёмников.

В данный момент у меня стоит "на прогоне" счётчик входящих/выходящих на двух vl53l0x, этот вариант конструктивно гораздо проще, скетч практически тот же.

Кренделек, дойдёте до программной части - спрашивайте, со скетчем помогу.

Привет. а как с одним датчиком сделать. чтоб просто срабатывал когда кто-то через косяк дверной пройдет? готовый есть скетч? поделись. спасибо!

andrewkik
Offline
Зарегистрирован: 09.11.2018

vl53l0x я об этом датчике имел ввиду.

yray
Offline
Зарегистрирован: 08.01.2015

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

andrewkik
Offline
Зарегистрирован: 09.11.2018

Пробовал. Вот это и не получается. Я не программист, к сожалению

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

andrewkik пишет:

Привет. а как с одним датчиком сделать. чтоб просто срабатывал когда кто-то через косяк дверной пройдет? готовый есть скетч? поделись. спасибо!

Делюсь:

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;
#define alarmPin  12

void setup()
{
pinMode(alarmPin, OUTPUT);
Wire.begin();
sensor.init();
sensor.setTimeout(500);
sensor.startContinuous(50);
}

void loop()
{
unsigned int distance = sensor.readRangeContinuousMillimeters(); 
digitalWrite( alarmPin, (distance <= 100) );
} 

 

andrewkik
Offline
Зарегистрирован: 09.11.2018

Спасибо дружище! Дай Бог тебе здоровья! Попробую.

andrewkik
Offline
Зарегистрирован: 09.11.2018

А выход инвертировать?

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

ОК, последняя подсказка:

digitalWrite( alarmPin, (distance <= 100) );

заменить на

digitalWrite( alarmPin, !(distance <= 100) );

либо на

digitalWrite( alarmPin, (distance > 100) );

andrewkik пишет:
Я не программист, к сожалению

Это не работает, здесь во всяком случае.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

digitalWrite( alarmPin, (distance >= 100) );

andrewkik
Offline
Зарегистрирован: 09.11.2018

точно.  а програмно как? то есть мне надо обозначить что  

digitalWrite( alarmPin, LOW (distance <= 100) );

перед этим задав в void setup

digitalWrite( alarmPin, HIGH );

и растояние в мм здесь, я сообразил и поправил на 1000

b707
Offline
Зарегистрирован: 26.05.2017

andrewkik пишет:

точно.  а програмно как?

заканчивай тупить.

Тебе и дали программно, не лезь с правками, коли не понимаешь.

MaksVV
Offline
Зарегистрирован: 06.08.2015

попробовал скетч и схему из поста #14. Что-то меня сомнения стали мучать, что будет стабильно определять количество людей. Собрал на столе, человека имитирую перемещением книги через зону измерения датчиков. Расстояние между датчиками от края до края бредборда , т.е. см 7 . Если быстро проводить книгой , то "не видит" прохода человека.  

VL53L0X_1.startContinuous(50); делал 10 и меньше - изменений никаких, как и писал Araris. 

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

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

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

Ну да, ну да, на "больших" скоростях мы упираемся в быстродействие аппаратной реализации, тут уж придётся или датчики разносить на большее расстояние, либо датчики пересечения луча вместо дальномеров ставить.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Ок, полевые испытания покажут

yray
Offline
Зарегистрирован: 08.01.2015

Быстродействия вроде бы хватает, у меня проблема вылезла в другом - датчики отваливаются. Если с одним датчиком схема работает месяцами, если не годами, без нареканий то с двумя датчиками начинаются отвалы и зависания. Причём зависает не ардуинка, а именно датчики перестают отвечать, думал даже по таймеру передёргивать питание датиков, но забил.  Пробовал два датчика на ESP8266, мало того что процессор есп гораздо быстрее так ещё и шину можно заставить работать быстрее, но там их работа приводит тоже к зависанию, уже есп, да как что иногда и сторожевой таймер не срабатывает. В общем грустно всё с ними. Забил на них, поставил такие датчики https://aliexpress.ru/item/1996058803.html но тоже не фонтан, во первых 80см это конечно же не правда, во вторых сами датчика иногда живут своей жизнью, вероятно они работают на одной частоте и взаимное излучение мешает. Пока не нашёл нормального варианта с отражением, вероятно все-же только барьер, либо промышленные датчики с отражателями и реакцией на прерывание, но не дешёвые они и непонятно как отреагируют друг на дружку, возможно также мешать будут.

MaksVV
Offline
Зарегистрирован: 06.08.2015

yray пишет:

Быстродействия вроде бы хватает, у меня проблема вылезла в другом - датчики отваливаются. Если с одним датчиком схема работает месяцами, если не годами, без нареканий то с двумя датчиками начинаются отвалы и зависания. Причём зависает не ардуинка, а именно датчики перестают отвечать, думал даже по таймеру передёргивать питание датиков, но забил.  Пробовал два датчика на ESP8266, мало того что процессор есп гораздо быстрее так ещё и шину можно заставить работать быстрее, но там их работа приводит тоже к зависанию, уже есп, да как что иногда и сторожевой таймер не срабатывает. В общем грустно всё с ними. Забил на них, поставил такие датчики https://aliexpress.ru/item/1996058803.html но тоже не фонтан, во первых 80см это конечно же не правда, во вторых сами датчика иногда живут своей жизнью, вероятно они работают на одной частоте и взаимное излучение мешает. Пока не нашёл нормального варианта с отражением, вероятно все-же только барьер, либо промышленные датчики с отражателями и реакцией на прерывание, но не дешёвые они и непонятно как отреагируют друг на дружку, возможно также мешать будут.

мне в общем даже и быстродействие не понравилось. Из 10 раз 9 только срабатывает когда быстро перемещаешься. Медленно идешь то понятно, хорошо отрабатывает. 

Для интереса вставил микрос() до и после измерения. Меньше чем 32 миллисекунды, милли, Карл,  не получилось опрашивать оба датчика. Естественно это очень долго. И это я еще датчики на 15см разнес, а если на 7 см поставить, дак и подавно врать будут. Ну и тем более про зависания вы написали, короче да, в топку их. Буду тестить лазер и датчик света. Лучше один  раз помучиться с установкой, зато я думаю должно быть как АКМ.  Можно ещё и на прерывания повесить . 

и да: 

VL53L0X_1.startContinuous(); -  нужно пустым в скобках оставлять (ноль типа задержка). Так хоть 32мс. Если добавлять здесь значения, время измерений двух датчик повышается. При VL53L0X_1.startContinuous(50) уже 55 мс измерение идёт. и т.д. 

// Алгоритм подсчёта следующий:
// чтобы проход человека был засчитан, необходима
// последовательность срабатывания датчиков
// 00
// 10
// 11
// 01
// 00 в "прямом" проходе
// и
// 00
// 01
// 11
// 10
// 00 в "обратном" проходе
// Все прочие последовательности не засчитываются.
// Продолжительность прохода не учитывается, можно стоять в дверях 
// сколь угодно долго, а затем вернуться, либо пройти,
// проход будет незасчитан/засчитан соответственно. 
#define DEBUG 1    
//
#include <Wire.h>
#include <VL53L0X.h>
//
#define VL53L0X_XSHUT1_PIN    7 // Эти пины понадобятся для изменения адреса второго VL53L0X с 41 на 42
#define VL53L0X_XSHUT2_PIN    8 // Эти пины понадобятся для изменения адреса второго VL53L0X с 41 на 42
//
#define VL53L0X1_ADDRESS     41 // строка просто для информации, дефолтный адрес VL53L0X. 
#define VL53L0X2_ADDRESS     42 // это новый адрес второго датчика
VL53L0X VL53L0X_1;
VL53L0X VL53L0X_2;

VL53L0X VL[2];
#define minDistance         600 // ширина дверного проёма у меня 70 с чем-то см, срабатывание датчиков будем засчитывать, если измерено расстояние менее 60-ти см.
bool VL53L0X_1_state = false;   // флаг срабатывания первого датчика
bool VL53L0X_2_state = false;   // флаг срабатывания второго датчика
bool VL53L0X_1_already = false; // флаг "первый датчик уже сработал" 
bool VL53L0X_2_already = false; // флаг "второй датчик уже сработал" 
bool VL53L0X_together = false;  // флаг "оба датчика уже сработали" 
byte VL53L0X_first = 0;         // принимает значения 0,1,2 , показывает, какой из датчиков сработал первым
int HumanCounter = 0;
int OldHumanCounter = 0;

void setup()
{
/////////// На старте сразу "гасим" пины XSHUT обоих датчиков
pinMode(VL53L0X_XSHUT1_PIN, OUTPUT);
pinMode(VL53L0X_XSHUT2_PIN, OUTPUT);
//
#ifdef DEBUG
 Serial.begin(9600);
 Serial.println("");
 Serial.println(F("Two VL53L0X HumanCounter."));
#endif  
Wire.begin();
/////////// Меняем адрес второго датчика и "поднимаем" оба датчика
pinMode(VL53L0X_XSHUT2_PIN, INPUT);
delay(10);
VL53L0X_2.setAddress(VL53L0X2_ADDRESS);
pinMode(VL53L0X_XSHUT1_PIN, INPUT);
delay(10);
/////////// Запускаем оба VL53L0X
VL53L0X_1.init();
VL53L0X_2.init();
VL53L0X_1.setTimeout(250);
VL53L0X_2.setTimeout(250);
// To use continuous timed mode instead, provide a desired inter-measurement period in ms.
VL53L0X_1.startContinuous();
VL53L0X_2.startContinuous();
}

void loop()
{
  uint32_t t1 = 0; 
  uint32_t t2 = 0; 
////////// Читаем показания датчиков и выставляем флаги срабатывания
t1 = micros(); // контролируем время замера двух дальномеров
unsigned int Distance1 = VL53L0X_1.readRangeContinuousMillimeters();  
unsigned int Distance2 = VL53L0X_2.readRangeContinuousMillimeters();  
t2=micros();  // контролируем время замера двух дальномеров
VL53L0X_1_state = (Distance1 < minDistance);
VL53L0X_2_state = (Distance2 < minDistance);
////////// Вот тут самое главное - анализируем флаги срабатывания и прочие флаги. Расписано неоптимально, зато подробно.
if ( !VL53L0X_1_state && !VL53L0X_2_state) // VL53L0X_1 off, VL53L0X_2 off
 {
 if ( VL53L0X_first > 0 && VL53L0X_together && VL53L0X_1_already && VL53L0X_2_already)
  {
  if ( VL53L0X_first == 1) // IN
   {
   HumanCounter++;
   }  
  else // OUT
   {
   HumanCounter--;
   }
  }
 VL53L0X_1_already = false;
 VL53L0X_2_already = false;
 VL53L0X_together = false;
 VL53L0X_first = 0;
 }  
else if ( VL53L0X_1_state && !VL53L0X_2_state) // VL53L0X_1 ON, VL53L0X_2 off
 {
 VL53L0X_1_already = true;
 if ( !VL53L0X_2_already )
  {
  VL53L0X_first = 1; 
  }
 }  
else if ( !VL53L0X_1_state && VL53L0X_2_state) // VL53L0X_1 off, VL53L0X_2 ON
 {
 VL53L0X_2_already = true;
 if ( !VL53L0X_1_already )
  {
  VL53L0X_first = 2;
  }
 }  
else if ( VL53L0X_1_state && VL53L0X_2_state) // VL53L0X_1 ON, VL53L0X_2 ON
 {
 if ( VL53L0X_1_already && VL53L0X_2_already && VL53L0X_together ) 
  {
  if ( VL53L0X_first == 1 ) 
   {
   VL53L0X_2_already = false;
   }
  if ( VL53L0X_first == 2 ) 
   {
   VL53L0X_1_already = false;
   }
  }
 VL53L0X_together = true;
 }  
////////// Конец анализа.
if ( HumanCounter != OldHumanCounter ) 
 {
 #ifdef DEBUG
 Serial.print(F("HumanCounter = "));
 Serial.println(HumanCounter);
 Serial.print(F("Time "));
 Serial.println(t2-t1);
 #endif  
 }
OldHumanCounter = HumanCounter;
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

По даташиту у него самое быстрое "High speed, 20 ms,1.2 m, accuracy +/- 5 %“.

yray
Offline
Зарегистрирован: 08.01.2015

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

https://www.imagevenue.com/ME12Y70L

sadman41
Offline
Зарегистрирован: 19.10.2016

Сдается мне, что проще поставить объемники с таймаутом в 10 минут, чем выпиливать в косяки дальномеры.

MaksVV
Offline
Зарегистрирован: 06.08.2015

второй датчик отрезал из шины, оставил один. скетч из примера Continuous  - так же 32 мс. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

sadman41 пишет:
Сдается мне, что проще поставить объемники с таймаутом в 10 минут, чем выпиливать в косяки дальномеры.

ну мне не нравились эти задержки в 10 мин у объемников вот и решил попробовать. Да, полдня убил впустую мона сказать. Ну как впустую, теперь я знаю, что они мне не катят. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

как сказать, скорость я только что измерил, это 32...35 мс. 

Человек быстрым шагом 6 км/ч, а если бежит то и вообще. 

6 км/ч ->  1.7 мм/мс , т.е. за 35 мс человек переместится где-то на 60мм.  Ну понятно что ещё нужно пройти расстояние толщины своего туловища. В общем , если датчики на 35 мм друг от друга, то это уже как раз на грани срабатывания, имхо.