счетчик - датчик кол-ва человек в комнате
- Войдите на сайт для отправки комментариев
Чт, 02/11/2017 - 00:54
Прошу проконсультировать по железу.
Задача: включать свет в комнате если в ней кто либо есть. Если пришло несколько, то помнить кол-во и при выходе последнего гасить свет.
рассматривал 2 pir датчика в дверном проеме, но почитал, что ему надо время на восстановление "способности видеть" следующего и минимальное растояние 3 метра.
Также рассматриваю 2 ky-022 и напротив постаить светодиод, который, как я понял, должен светить "частотой".
Какие варианты еще возможны?
Raspberry Pi, видеокамера, opencv и распознавание фигур.
Raspberry Pi, видеокамера, opencv и распознавание фигур.
Чё так мелко? Intel Server за 5 штук баксов и ни копейкой меньше. PIR датчики тормознутые, пробовал, работало только если проходили по одному и не быстро. Но ту мелкие стали носиться и усё накрылось.))) Надо ик барьер ставить, причём два луча, это лучше работает.
Какие варианты еще возможны?
Я делал на двух парах лазер - фоторезистор. С одной стороны дверного проёма светит лазерок на фоторезистор на другой стороне проёма. Фоторезистор от боковых засветок прикрыт тубусом. Работает, но усложнено конструктивно, нужна чёткая фиксация положения источников и приёмников.
В данный момент у меня стоит "на прогоне" счётчик входящих/выходящих на двух vl53l0x, этот вариант конструктивно гораздо проще, скетч практически тот же.
Кренделек, дойдёте до программной части - спрашивайте, со скетчем помогу.
Я ещё на дверь геркон вешал, т.е. дверь закрыта - вся "светомузыка" выключена.
Какие варианты еще возможны?
Я делал на двух парах лазер - фоторезистор. С одной стороны дверного проёма светит лазерок на фоторезистор на другой стороне проёма. Фоторезистор от боковых засветок прикрыт тубусом. Работает, но усложнено конструктивно, нужна чёткая фиксация положения источников и приёмников.
В данный момент у меня стоит "на прогоне" счётчик входящих/выходящих на двух vl53l0x, этот вариант конструктивно гораздо проще, скетч практически тот же.
Кренделек, дойдёте до программной части - спрашивайте, со скетчем помогу.
А чем была вызвана необходимость использовать пару лазер- фоторезистор? сколько это стоило со всей обвязкой?
Пара для определения направления.... неуже ли не понятно ?
Пара для определения направления.... неуже ли не понятно ?
Для тех кто в танке поясню: почему лазер и фоторезистор, а не светодиод и фототранзистор.
И, Да, зачем две пары мне пояснять не нужно.
А чем была вызвана необходимость использовать пару лазер- фоторезистор? сколько это стоило со всей обвязкой?
Необходимости не было, просто была под рукой пара 5mW-лазеров и кулёчек фоторезисторов. Обвязки они не требуют, разве что пару резисторов на подтяжку, цены, соответственно, копеечные.
Заказал сейчас с десяток vs1838 на али и Мегу2560. Щас надо подобрать светодиоды для их взаимопонимания. таймер подберу-закажу и есть задумка связь организовать до андроид телефона. чтоб не на дисплее глазеть, а на диване в телефоне смотреть где что как работает.
дойдёте до программной части - спрашивайте, со скетчем помогу.
Подскажете код для счетчика на двух vl53l0x ?
Подскажете код для счетчика на двух 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
Одобряю!
vl53l0x очень хорошие датчики.
Спасибо. Второй датчик не имеет смысла шунтировать если у него используется дефолтный адрес, ничего принципиального, но можно съэкономить один пин мк и не тянуть лишний провод используя не 6 а 5 проводный шлейф например из usb кабеля. Также второй датчик шунтируем и запускаем скетч, первомый датчик назначает себе дефолтный адрес, снимаем шунт и инициализируем второй новым адресом. У нас получится два датчика с разными адресами.
Я код счетчика ичпользовал такой
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 от адафрут, она не вешает есп, но крайне убога, тормозна и датчики с ней работают не стабильно.
Я код счетчика ичпользовал такой
А, ну так это он и есть, самый первый вариант на инфракрасных датчиках.
От скорости скетча действительно зависит, на "длинном loop" проблематично работает, даже при использовании прерываний.
Возможно там нужен таймаут: чтото типа сработал первый датчик, запускаем таймаут, скажем пол секунды,и ждем сработки второго, если в течении таймаута сработал второй увеличиваем счетчик, если нет, обнуляем состояние первого и наоборот соответственно.
Не соглашусь, я специально акцентировал, что
016// Продолжительность прохода не учитывается, можно стоять в дверях017// сколь угодно долго, а затем вернуться, либо пройти,018// проход будет незасчитан/засчитан соответственно.Это опыт из реальной жизни, так сказать )). Обкатку счётчика на достоверность счёта проводит моя жена, иногда удивляя меня тем, как всё же можно обмануть два датчика в тесноватой прихожей.
Кстати, у меня в работающем счётчике на входной двери задействован также датчик состояния двери (откр/закр), весьма помогает достоверности счёта.
Это опыт из реальной жизни, так сказать )). Обкатку счётчика на достоверность счёта проводит моя жена...
Надо ещё пару киндеров подключить к обкатке, эти любую логику сломают и мозг вынесут :)
Araris это я про свой код говорил, ваш еще не испытывал, но обязательно попробую, как смогу добиться нормальной работы дальномеров с ЕСП
Ваш код очень похож на обработку энкодера - те же 4 состояния только результат другой, для этих целей можно также использовать готовую библиотеку для энкодеров, в том числе и использующие прерывания для точности подсчета, я пробовал, работает.
можно поставить 2 ик диода и приемника вместо лазера. каждый ИК диод работае на своей частоте - тем самым вы защитите себя от ложных срабатываний (засветов) .. е сли помещение маленькое, аля сартир, то можно и ёмкостной датчик зафигарить..
Прелесть дальномеров в том что вы просто ставите их на/в дверной проём и все, а светодиоды/лазеры надо ставить с двух сторон и точно настраивать, дальномеры готовое устройство и достаточно стабильное, до метра работают нормально, для большенства проемов этого хватает, а напримет туалет перекрывает и один дальномер. Я сомневаюсь что емкостной датчик будет настолько стабилен и его настолько же просто установить как дальномер за 280р.
Прелесть дальномеров в том что вы просто ставите их на/в дверной проём и все, а светодиоды/лазеры надо ставить с двух сторон и точно настраивать, дальномеры готовое устройство и достаточно стабильное, до метра работают нормально, для большенства проемов этого хватает, а напримет туалет перекрывает и один дальномер. Я сомневаюсь что емкостной датчик будет настолько стабилен и его настолько же просто установить как дальномер за 280р.
ик диодов на 280р можно купить ведро и маленькую тележку, + если каждый ик диод работает на своей частоте то нет необходимости в точной настройке (как пульт от тв навел примерно в сторону датчика и все)
с помощью дальномера определить колво входящих и выходящих людей будет тяжеловато.. а с диодом тупо считать количество перекрытий с учетом если перекрылся сначала первый а потом второй то в +1 пипл а если сначала перекрывается второй а потом первый то -1 чел .. логика примитивная..
дешиво и сердито.. хотя для настоящего ардуинщика на примитивную схему надо навесить с десяток шилдов и чем дороже тем круче :)))
Всмысле - с помощью дальномера определить колво входящих и выходящих людей будет тяжеловато.. ??? Эта тема как раз об определениии входящих/выходящих и подсчета чила оставшихся, вы тему то вообще смотрели, или так просто написать чтобы было?Причем речь идет о действующих конструкциях а не теоретических изысканиях.
Про диоды про все так просто вы придумали или эта действующая конструкция? Потому что я очень сомневаюсь что просто два свето и фото диода будет нормально считать. Ибо даже заводские датчики E18-D80NK с точно настроенными линзами, модуляторами/демодуляторами, регуляторами, усилителями и компараторами работают в таком режиме далеко не стабильно, может потому что китайского производства, но факт остается фактом, именно практическое примение дальномеров в таком режиме даёт максимально простую в монтаже/ настройке и стабильную в работе конструкцию
Подскажите зачем вы использовали VL53L0X_1.startContinuous(50); это же вносит паузу в измерения, может как раз она и приводит к "обманыванию" датчика? Или этот параметр был как то эксперементально подобран?
Я пробовал с нулевой паузой, с 50, 100, 150, разницы особо и не заметил. Сейчас стоит 50 исключительно для "экономии тактов процессора" ))).
А сколько у вас расстояние между датчиками ?
Сантиметров 10-12.
Какие варианты еще возможны?
Я делал на двух парах лазер - фоторезистор. С одной стороны дверного проёма светит лазерок на фоторезистор на другой стороне проёма. Фоторезистор от боковых засветок прикрыт тубусом. Работает, но усложнено конструктивно, нужна чёткая фиксация положения источников и приёмников.
В данный момент у меня стоит "на прогоне" счётчик входящих/выходящих на двух vl53l0x, этот вариант конструктивно гораздо проще, скетч практически тот же.
Кренделек, дойдёте до программной части - спрашивайте, со скетчем помогу.
Привет. а как с одним датчиком сделать. чтоб просто срабатывал когда кто-то через косяк дверной пройдет? готовый есть скетч? поделись. спасибо!
vl53l0x я об этом датчике имел ввиду.
А чего там делать - берешь готовый скетч непрерывного измерения расстояния из примеров библиотеки vl53l0x, задаешь нужный тебе диапазон расстояний дверного проема и пишешь что должно произойти если это расстояние вдруг изменилось.
Пробовал. Вот это и не получается. Я не программист, к сожалению
Привет. а как с одним датчиком сделать. чтоб просто срабатывал когда кто-то через косяк дверной пройдет? готовый есть скетч? поделись. спасибо!
Делюсь:
#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) ); }Спасибо дружище! Дай Бог тебе здоровья! Попробую.
А выход инвертировать?
ОК, последняя подсказка:
digitalWrite( alarmPin, (distance <= 100) );
заменить на
digitalWrite( alarmPin, !(distance <= 100) );
либо на
digitalWrite( alarmPin, (distance > 100) );
Это не работает, здесь во всяком случае.
digitalWrite( alarmPin, (distance >= 100) );
точно. а програмно как? то есть мне надо обозначить что
digitalWrite( alarmPin, LOW (distance <= 100) );
перед этим задав в void setup
digitalWrite( alarmPin, HIGH );
и растояние в мм здесь, я сообразил и поправил на 1000
точно. а програмно как?
заканчивай тупить.
Тебе и дали программно, не лезь с правками, коли не понимаешь.
попробовал скетч и схему из поста #14. Что-то меня сомнения стали мучать, что будет стабильно определять количество людей. Собрал на столе, человека имитирую перемещением книги через зону измерения датчиков. Расстояние между датчиками от края до края бредборда , т.е. см 7 . Если быстро проводить книгой , то "не видит" прохода человека.
VL53L0X_1.startContinuous(50); делал 10 и меньше - изменений никаких, как и писал Araris.
UPD причем заметил, что в одну сторону при бОльшей скорости перемещения предмета стабильнее срабатывает. Если поменять адреса местами, то в другую сторону начинает стабильнее срабатывать.
В ближайшее время воткну в дверь - там посмотрим, но имхо, дети иногда носятся как угорелые, скорее всего будут обманывать тем самым датчики.
Ну да, ну да, на "больших" скоростях мы упираемся в быстродействие аппаратной реализации, тут уж придётся или датчики разносить на большее расстояние, либо датчики пересечения луча вместо дальномеров ставить.
Ок, полевые испытания покажут
Быстродействия вроде бы хватает, у меня проблема вылезла в другом - датчики отваливаются. Если с одним датчиком схема работает месяцами, если не годами, без нареканий то с двумя датчиками начинаются отвалы и зависания. Причём зависает не ардуинка, а именно датчики перестают отвечать, думал даже по таймеру передёргивать питание датиков, но забил. Пробовал два датчика на ESP8266, мало того что процессор есп гораздо быстрее так ещё и шину можно заставить работать быстрее, но там их работа приводит тоже к зависанию, уже есп, да как что иногда и сторожевой таймер не срабатывает. В общем грустно всё с ними. Забил на них, поставил такие датчики https://aliexpress.ru/item/1996058803.html но тоже не фонтан, во первых 80см это конечно же не правда, во вторых сами датчика иногда живут своей жизнью, вероятно они работают на одной частоте и взаимное излучение мешает. Пока не нашёл нормального варианта с отражением, вероятно все-же только барьер, либо промышленные датчики с отражателями и реакцией на прерывание, но не дешёвые они и непонятно как отреагируют друг на дружку, возможно также мешать будут.
Быстродействия вроде бы хватает, у меня проблема вылезла в другом - датчики отваливаются. Если с одним датчиком схема работает месяцами, если не годами, без нареканий то с двумя датчиками начинаются отвалы и зависания. Причём зависает не ардуинка, а именно датчики перестают отвечать, думал даже по таймеру передёргивать питание датиков, но забил. Пробовал два датчика на 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; }По даташиту у него самое быстрое "High speed, 20 ms,1.2 m, accuracy +/- 5 %“.
у меня между центрами датчиков 35мм и в целом оно работает, не устраивает только зависание датчиков. на самом деле у датчиков должна быть приличная скорость, некоторые проекты их в качестве лидаров используют. а с лазером конечно интересней будет, готовой библиотекой энкодера их обрабатывай и всё ок, вот только сколько лазеры проживут в непрерывном режиме?
https://www.imagevenue.com/ME12Y70L
Сдается мне, что проще поставить объемники с таймаутом в 10 минут, чем выпиливать в косяки дальномеры.
второй датчик отрезал из шины, оставил один. скетч из примера Continuous - так же 32 мс.
ну мне не нравились эти задержки в 10 мин у объемников вот и решил попробовать. Да, полдня убил впустую мона сказать. Ну как впустую, теперь я знаю, что они мне не катят.
как сказать, скорость я только что измерил, это 32...35 мс.
Человек быстрым шагом 6 км/ч, а если бежит то и вообще.
6 км/ч -> 1.7 мм/мс , т.е. за 35 мс человек переместится где-то на 60мм. Ну понятно что ещё нужно пройти расстояние толщины своего туловища. В общем , если датчики на 35 мм друг от друга, то это уже как раз на грани срабатывания, имхо.