Определение направления движения

Primatech
Offline
Зарегистрирован: 09.12.2020

Всем добрый вечер! Сразу хочу обозначить свои познания в ардуино и программировании, чуть больше нуля)))

Так вот, уже достаточно долго пытаюсь собрать один небольшой проект, но в интернете почему-то почти нет информации по такому простому вопросу. Возможно он и вправду простой, и потому его не рассматривают особо. Оборудование: Ардуино Нано, два датчика приближения Sonar SR04. Суть проекта: коридор, ставится один датчик, чуть дальше второй. С помощью них, определить в каком направлении было движение. Логику работы данной схемы я понимаю.

При пересечении первого датчика, происходит проверка переменной "two", если значение "0", тогда происходит присвоение параметра переменной "one=1".  Если же у переменной "two" значение "1" значит была уже сработка второго датчика и мы присваиваем  "val" значение "2" Это будет означать что направление было "назад"

Далее идет сработка второго датчика. Тут необходимо сверить, если переменной "one" уже было присвоено значение "1" , то-есть сработал первый датчик, значит переменной, "val" присваивается так же "1". Это будет означать что направление было допустим "вперед"

Если при сработке второго датчика и проверки переменной "one" получается что значение исходное "0", то переменной "two" присваиваем "1". 

Ну и далее по кругу. Для начала хотел бы услышать Ваше мнение, в нужном ли направлении я двигаюсь или есть вариант проще?

SLKH
Offline
Зарегистрирован: 17.08.2015

Primatech пишет:
Оборудование: Ардуино Нано, два датчика приближения Sonar SR04. Суть проекта: коридор, ставится один датчик, чуть дальше второй. С помощью них, определить в каком направлении было движение. Логику работы данной схемы я понимаю.

При пересечении первого датчика, 

вот про SR04 и пересечение можно подробней? кто кого пересекает?

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

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

Primatech
Offline
Зарегистрирован: 09.12.2020

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

Primatech
Offline
Зарегистрирован: 09.12.2020

Прочел про millis. Если все правильно понял, то при запуске программы ардуино начнет считать. Сработал первый датчик, запомнили значение, сработал второй датчик, так же запомнили значение. Допустим 100  и 200. Далее сверяем если первое значение меньше второго, то человек вошел, если на оборот. то вышел. Так?

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

Как вариант. С флагами, конечно, более правильно для МК, но и с миллисом потащит. Заодно можно будет анализировать факт наличия засыпания объекта в процессе передвижения.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Primatech пишет:

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

Какой человек?

В исходном тексте ни о каком человеке информации не было.

Постарайтесь в одном сообщении сформулировать проблему полностью.

Primatech
Offline
Зарегистрирован: 09.12.2020

andriano пишет:

Primatech пишет:

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

Какой человек?

В исходном тексте ни о каком человеке информации не было.

Постарайтесь в одном сообщении сформулировать проблему полностью.

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

У Вас что, робот, который движется по коридору, причем сам робот не может понять, в какую сторону он движется? Откуда-то еще люди берутся. Они что, роботом управляют?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

andriano пишет:

Они что, роботом управляют?

Судя по всему, они в нём сидят

rkit
Offline
Зарегистрирован: 23.11.2016

Primatech пишет:

вопрос в алгоритме, который позволит определить, какой датчик сработает первым,

Вот уж действительно вопрос, не требующий рассмотрения.

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

я так понимаю у ТС датчики направлены поперёк коридора, один за другим.  И он хочет знать в какую сторону перемещаются люди/предметы. Только ультразвуковые здесь не подходят имхо. Araris вроде умной ванной это реализовывал, нужно искать. тут ещё смотреть

Primatech
Offline
Зарегистрирован: 09.12.2020

MaksVV пишет:

я так понимаю у ТС датчики направлены поперёк коридора, один за другим.  И он хочет знать в какую сторону перемещаются люди/предметы. Только ультразвуковые здесь не подходят имхо. Araris вроде умной ванной это реализовывал, нужно искать. тут ещё смотреть


Спасибо за наводку. Тему по ссылке прочёл, но это не совсем то что я спрашивал. Мне нужно написать код, в этом проблема. Какие датчики использовать тоже я не спрашивал. Это и ИК могут быть, и датчики на движение. Вопрос в АЛГОРИТМЕ. Правильно ли я его составил... Задание простое. Понять какой из датчиков(без разницы какого типа они будут) сработал первым а какой вторым. Отсюда сможем понять какое было направление движения.

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

По сути работа этих датчиков аналогична работе энкодера и можно применить чтонить готовое типа бенротариэнкодер

Primatech
Offline
Зарегистрирован: 09.12.2020

inspiritus пишет:

По сути работа этих датчиков аналогична работе энкодера и можно применить чтонить готовое типа бенротариэнкодер


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

rkit
Offline
Зарегистрирован: 23.11.2016

inspiritus пишет:

По сути работа этих датчиков аналогична работе энкодера и можно применить чтонить готовое типа бенротариэнкодер

По сути бред какой-то сказал.

b707
Онлайн
Зарегистрирован: 26.05.2017

Primatech пишет:
Задание простое. Понять какой из датчиков(без разницы какого типа они будут) сработал первым а какой вторым. Отсюда сможем понять какое было направление движения.

разве для этого нужен какой-то алгоритм?

Если в начале работы программы оба датчика выключены - то как только один из них сработал - он и первый. Нафига вы там в первом сообщении ветки накрутили какой-то бредятины...

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

Primatech пишет:
Спасибо за наводку. Тему по ссылке прочёл, но это не совсем то что я спрашивал. Мне нужно написать код, в этом проблема. Какие датчики использовать тоже я не спрашивал. Это и ИК могут быть, и датчики на движение. Вопрос в АЛГОРИТМЕ. Правильно ли я его составил... Задание простое. Понять какой из датчиков(без разницы какого типа они будут) сработал первым а какой вторым. Отсюда сможем понять какое было направление движения.

как не то? там в посте 17 как раз скетч с четырьмя флагами, причем работа его опробована, далеко не бестолковым человеком. По этому скетчу можно и алгоритм понять. Что вам мешает собрать и попробовать. Так и будете каждый шаг спрашивать? 

А то бывает составишь алгоритм, а полевые испытания всегда вносят коррективы. 

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

а в скетче поста 14 по той ссылке вверху скетча, даже так и написано :

//Алгоритм подсчёта следующий:

Primatech
Offline
Зарегистрирован: 09.12.2020

Не заметил сноску с кодом(17 пост). Надо было нажать на раскрыть....Спасибо! Думаю как раз то что нужно.

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

Добавлю, что описанная там конструкция на двух VL53L0X по сей день трудится в моей прихожей )).

Primatech
Offline
Зарегистрирован: 09.12.2020

Не заметил сноску с кодом(17 пост). Надо было нажать на раскрыть....Спасибо! Думаю как раз то что нужно.

Primatech
Offline
Зарегистрирован: 09.12.2020

Появилось время, сел снова за комп. Ссылка, которую привел MaksVV, очень помогла, спасибо! Немного переработал под себя скетч, чтоб работало с Сонарами. Заработало, но с некоторым условием..  Что бы проход был засчитан, нужно чтоб датчики сработали очень быстро. Как я понял, "bool" это переменная, но она не сохраняет свое значение. В комментариях в скетче говорилось, "Продолжительность прохода не учитывается, можно стоять в дверях сколь угодно долго" Видимо за это отвечала строка когда, которую я удалил(там менялись адреса датчиков) к сожалению не разобрался зачем. Каким образом можно зафиксировать значения переменных? Считывание с датчиком происходит каждые 50 мск, в этот промежуток и нужно попасть чтоб сработали оба. В идеале, при сработке одного датчика, зафиксировать значение переменной, и в течение некоторого времени ждать сработку второго. Не произошло, значит все по новой. Сам скетч : 



#define DEBUG 1    
//
#include <NewPing.h>
#include <Wire.h>
//
#define TRIGGER_PIN  8  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     9  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 300 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
#define TRIGGER_PIN2 6
#define ECHO_PIN2 7
#define MAX_DISTANCE2 300


NewPing sonarIn(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
NewPing sonarOut(TRIGGER_PIN2, ECHO_PIN2, MAX_DISTANCE2);

bool sonarIn_state = false;   // флаг срабатывания первого датчика
bool sonarOut_state = false;   // флаг срабатывания второго датчика
bool sonarIn_already = false; // флаг "первый датчик уже сработал" 
bool sonarOut_already = false; // флаг "второй датчик уже сработал" 
bool sonar_together = false;  // флаг "оба датчика уже сработали" 
byte sonar_first = 0;         // принимает значения 0,1,2 , показывает, какой из датчиков сработал первым
int HumanCounter = 0;
int OldHumanCounter = 0;

void setup()
{
#ifdef DEBUG
 Serial.begin(9600);
 Serial.println("");
 Serial.println(F("Two sonar HumanCounter."));

 #endif
  }
void loop()
{
////////// Читаем показания датчиков и выставляем флаги срабатывания 
unsigned int Distance1 = sonarIn.ping_cm(); 
unsigned int Distance2 = sonarOut.ping_cm();
sonarIn_state = (Distance1 < 5);
sonarOut_state = (Distance2 < 5);

//анализируем флаги срабатывания

if ( !sonarIn_state && !sonarOut_state) // VL53L0X_1 off, VL53L0X_2 off
 {
 if ( sonar_first > 0 && sonar_together && sonarIn_already && sonarOut_already)
  {
  if ( sonar_first == 1) // IN
   {
   HumanCounter++;
   }  
  else // OUT
   {
   HumanCounter--;
   }
  }
 sonarIn_already = false;
 sonarOut_already = false;
 sonar_together = false;
 sonar_first = 0;
 }  
else if ( sonarIn_state && !sonarOut_state) // VL53L0X_1 ON, VL53L0X_2 off
 {
 sonarIn_already = true;
 if ( !sonarOut_already )
  {
  sonar_first = 1; 
  }
 }  
else if ( !sonarIn_state && sonarOut_state) // VL53L0X_1 off, VL53L0X_2 ON
 {
 sonarOut_already = true;
 if ( !sonarIn_already )
  {
  sonar_first = 2;
  }
 }  
else if ( sonarIn_state && sonarOut_state) // VL53L0X_1 ON, VL53L0X_2 ON
 {
 if ( sonarIn_already && sonarOut_already && sonar_together ) 
  {
  if ( sonar_first == 1 ) 
   {
   sonarOut_already = false;
   }
  if ( sonar_first == 2 ) 
   {
   sonarIn_already = false;
   }
  }
 sonar_together = true;
 }  
// Конец анализа.
if ( HumanCounter != OldHumanCounter ) 
 {
 #ifdef DEBUG
 Serial.print(F("HumanCounter = "));
 Serial.println(HumanCounter);
 #endif  
 }
OldHumanCounter = HumanCounter;
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Primatech пишет:

Как я понял, "bool" это переменная, но она не сохраняет свое значение.

Неправильно поняли.

bool - это тип переменной. Тип, естественно, никакого значения сохранить не может, чтобы хранить значение, нужна переменная.

Вам бы для начала почитать о языке, на которм хотите писать: https://nsu.ru/xmlui/bitstream/handle/nsu/9058/kr.pdf

Цитата:

Каким образом можно зафиксировать значения переменных?

Что Вы подразумеваете под "зафиксировать значения переменных"? 

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

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

Вообще-то с этими вашими двумя датчиками
надо работать как с простым инкрементальным энкодером.

rkit
Offline
Зарегистрирован: 23.11.2016

trembo пишет:
Вообще-то с этими вашими двумя датчиками надо работать как с простым инкрементальным энкодером.

Еще один не знает как энкодер устроен.

Primatech
Offline
Зарегистрирован: 09.12.2020

andriano пишет:

Primatech пишет:

Как я понял, "bool" это переменная, но она не сохраняет свое значение.

Неправильно поняли.

bool - это тип переменной. Тип, естественно, никакого значения сохранить не может, чтобы хранить значение, нужна переменная.

Вам бы для начала почитать о языке, на которм хотите писать: https://nsu.ru/xmlui/bitstream/handle/nsu/9058/kr.pdf

Цитата:

Каким образом можно зафиксировать значения переменных?

Что Вы подразумеваете под "зафиксировать значения переменных"? 

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


Я не программист, потому объясняюсь своими словами. "bool" Тип переменной, ок. Но он хранит значения true либо false. В начале скетча все выставлено на false, при сработке датчика, значение меняется на true но тут же слетает. А нужно чтоб это значение держалось некоторое время, чтоб дождаться сработки второго датчика.

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

rkit пишет:

trembo пишет:
Вообще-то с этими вашими двумя датчиками надо работать как с простым инкрементальным энкодером.

Еще один не знает как энкодер устроен.

Крутил  энкодером  через  разъём флоппи драйв
когда Ардуины не было и в помине, а вы ещё даже и  не родились.
(Флоппи - это SSD версии 0.1)

Мультик гляньте, может быть весной поможет вам сдать ЕГЭ:

https://www.youtube.com/watch?v=HeILJPjSQ_Y

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Primatech][quote=andriano пишет:

"bool" Тип переменной, ок. Но он хранит значения true либо false.

Нет, тип ничего не хранит. Хранить может переменная. Вы понимаете, чем отличается переменная от типа переменной?

Цитата:

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

Так не бывает. Сама по себе переменная "слететь" не может. Ну, точнее, может в случае серьезной аппаратной неисправности, но если бы была такая неисправность, крайне маловероятно, что скетч мог бы вообще хоть как-то выполняться.

Primatech
Offline
Зарегистрирован: 09.12.2020

Вот я и прошу объяснить неучу почему так происходит, а вы начинаете искать кошку в черной комнате. Факт что скетч выполняется не так как нужно, вопрос почему. Переменная в начале false, после сработки она становится true, но видимо скетч дальше идёт по кругу и переменная снова возвращается к дефолтному сочтоянию. Если в начале скетча выставляю delay секунды две, то и датчики начинают измерять расстояние каждые две секунды. И что бы был засчитан проход, сработке соответственно должна произойти в этот промежуток 2 сек.

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

MaksVV пишет:

Только ультразвуковые здесь не подходят имхо.

Согласен, поскольку различий между приведённым в #22 кодом и тем, что работает у меня, я не нахожу, возможно проблема в том, что сонары работают иначе (то есть не мгновенно, а с задержкой), либо "мешают" друг другу, если близко расположены.

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

Например, во все блоки else if вставьте

#ifdef DEBUG
 Serial.print(sonarIn_state);
 Serial.print(sonarOut_state);
 Serial.print(sonarIn_already);
 Serial.print(sonarOut_already);
 Serial.print(sonar_together);
 Serial.println(sonar_first);
#endif
 

и анализируйте, когда какой нолик/единичка поменялся и почему.

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

Этим сонарам нужен период "молчания" длительностью примерно 50мс, чтобы переотражения затихли. А если их запускать сразу друг за другом - ничего хорошего ждать нечего.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Primatech пишет:
Вот я и прошу объяснить неучу почему так происходит,

Как "так"?

Цитата:

Факт что скетч выполняется не так как нужно, вопрос почему.

Факт, что скетч выполняется в точности так, как написан.

А как Вам нужно, известно только Вам.

Цитата:

Переменная в начале false, после сработки она становится true, но видимо скетч дальше идёт по кругу и переменная снова возвращается к дефолтному сочтоянию.

Какая переменная?

Цитата:

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

Постарайтесь четко сформулировать:

1. Что должен делать скетч.

2. Что он на самом деле делает.

3. Чем 1 отличается от 2.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Если ты хорошенько и вдумчиво прочитаешь Кернигана и Ритчи, то 80% твоих вопросов тут же отпадут сами

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

Логику можно сделать например так


#define sonar1 2
#define sonar2 3

bool f_sonar1 = 0;
bool tm_sonar1 = 0;
bool f_sonar2 = 0;
bool tm_sonar2 = 0;
uint8_t suma = 0;

void setup()
{
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(sonar1) == 0)
  {
    if (tm_sonar1 == 0)
    {
      tm_sonar1 = 1;
      if (f_sonar2 == 1)
      {
        f_sonar2 = 0;
        suma--;
        Serial.println(suma);
      }
      else f_sonar1 = 1;
    }
  }
  else tm_sonar1 = 0;

  if (digitalRead(sonar2) == 0)
  {
    if (tm_sonar2 == 0)
    {
      tm_sonar2 = 1;
      if (f_sonar1 == 1)
      {
        f_sonar1 = 0;
        suma++;
        Serial.println(suma);
      }
      else f_sonar2 = 1;
    }
  }
  else tm_sonar2 = 0;
}

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

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

vosara пишет:

Логику можно сделать например так

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

Какие кнопки?
Вот весь ваш процесс прохода слева направо и справа налево.

Раньше на 176-ой (561-ой) серии такое ваялось на реверсивном счётчике.
Сейчас делается на прерываниях или конечном автомате.

http://easyelectronics.ru/avr-uchebnyj-kurs-inkrementalnyj-enkoder.html

Primatech
Offline
Зарегистрирован: 09.12.2020

Araris пишет:

MaksVV пишет:

Только ультразвуковые здесь не подходят имхо.

Согласен, поскольку различий между приведённым в #22 кодом и тем, что работает у меня, я не нахожу, возможно проблема в том, что сонары работают иначе (то есть не мгновенно, а с задержкой), либо "мешают" друг другу, если близко расположены.

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

Например, во все блоки else if вставьте

#ifdef DEBUG
 Serial.print(sonarIn_state);
 Serial.print(sonarOut_state);
 Serial.print(sonarIn_already);
 Serial.print(sonarOut_already);
 Serial.print(sonar_together);
 Serial.println(sonar_first);
#endif
 

и анализируйте, когда какой нолик/единичка поменялся и почему.

Спасибо за совет. Сонары расположены на достаточном расстоянии друг от друга. Добавил вывод информации в блок. Получается то, что я как раз и описывал. Когда я закрываю датчик рукой(sonarIn допустим), то значение меняется как нужно. Получаем (sonarIn_state 1, sonarOut_state 0, sonarIn_already 1, sonarOut_already 0, sonar_together 0, sonar_first 1) 101001. Второй датчик так же работает нормально 010102. НО, как только я убираю руку, то значения возвращаются к 000000. Вот это и нужно как то исправить. Необходимо чтоб значение осталось после того как я убираю руку. 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

trembo пишет:

Вот весь ваш процесс прохода слева направо и справа налево.

Раньше на 176-ой (561-ой) серии такое ваялось на реверсивном счётчике.
Сейчас делается на прерываниях или конечном автомате.

http://easyelectronics.ru/avr-uchebnyj-kurs-inkrementalnyj-enkoder.html

Не факт. Могут быть короткие импульсы, когда задний фронт первого импульса будет раньше переднего - второго.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Primatech пишет:

НО, как только я убираю руку, то значения возвращаются к 000000. Вот это и нужно как то исправить. Необходимо чтоб значение осталось после того как я убираю руку. 

Значение чего?

Возвращает ведь его Ваш скетч. Просто не делайте это "возвращение" до тех пор, порка не сработал второй (по времени) датчик. Правда, здесь есть опасность, что если человек дойдет до середины коридора и повернет обратно (не доходя до второго датчика), система зависнет. Но на этот случай можно предусмотреть таймаут. Или отслеживать не текущее состояние датчиков, а их переход из одного состояния в другое. В общем, масса вариантов.

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

Отлично, я наконец понял, чего Вы хотите. И дело не в ультразвуковых датчиках, кстати.

Вот здесь http://arduino.ru/forum/apparatnye-voprosy/schetchik-datchik-kol-va-chelovek-v-komnate#comment-344885

в коде я специально описал алгоритм его работы, просто прочтите :

// Алгоритм подсчёта следующий:
// чтобы проход человека был засчитан, необходима
// последовательность срабатывания датчиков
// 00
// 10
// 11
// 01
// 00 в "прямом" проходе
// и
// 00
// 01
// 11
// 10
// 00 в "обратном" проходе
// Все прочие последовательности не засчитываются.
// Продолжительность прохода не учитывается, можно стоять в дверях 
// сколь угодно долго, а затем вернуться, либо пройти,
// проход будет незасчитан/засчитан соответственно. 

Если Вы закрыли рукой первый датчик, а потом убрали руку, то имеете последовательность 00 10 00 , которая "не засчитывается" по логике работы данного скетча. Собственно и всё.

Primatech
Offline
Зарегистрирован: 09.12.2020

andriano пишет:

Primatech пишет:

НО, как только я убираю руку, то значения возвращаются к 000000. Вот это и нужно как то исправить. Необходимо чтоб значение осталось после того как я убираю руку. 

Значение чего?

Возвращает ведь его Ваш скетч. Просто не делайте это "возвращение" до тех пор, порка не сработал второй (по времени) датчик. Правда, здесь есть опасность, что если человек дойдет до середины коридора и повернет обратно (не доходя до второго датчика), система зависнет. Но на этот случай можно предусмотреть таймаут. Или отслеживать не текущее состояние датчиков, а их переход из одного состояния в другое. В общем, масса вариантов.

Да да да. Я понимаю что скетч его возвращает, после того как прописал вывод текущих значений, это подтвердилось. Пытаюсь разобраться как в коде прописать чтоб значения не возвращались. И по поводу зависания тоже писал чуть выше, что необходимо выставить какое то значение в секундах. Сработал один датчик, ждем некоторые время сработку второго. Если не сработал, значит сбрасываем значения. Просто не хватает знаний что бы все это в коде отобразить. Буду пробовать

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Еще проясните (хотя бы для себя) такой момент: что будет раньше (при стандартном сценарии), "отпустит" первый датчик или сработает второй? Либо возможны обе эти ситуации?

По сути, в посте №39, вероятно, изложена оптимальная стратегия, вот только конкретная реализация будет зависеть от указанного выше обстоятельства.

 

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

ТС вы читаете что вам пишут вообще ? Пост 39 внимательно читаем. Значение не будет сбрасываться, если датчики будут срабатывать в определённой последовательности. В вашем скетче проверил , все нормально работает. Только вместо датчиков просто кнопки или просто проводками на GND замыкать. Все отлично работает. Значит если есть проблемы, они в специфике работы сонаров, вам уже ранее это говорили, а вы упрямый. 


#define DEBUG 1    


bool sonarIn_state = false;   // флаг срабатывания первого датчика
bool sonarOut_state = false;   // флаг срабатывания второго датчика
bool sonarIn_already = false; // флаг "первый датчик уже сработал" 
bool sonarOut_already = false; // флаг "второй датчик уже сработал" 
bool sonar_together = false;  // флаг "оба датчика уже сработали" 
byte sonar_first = 0;         // принимает значения 0,1,2 , показывает, какой из датчиков сработал первым
int HumanCounter = 0;
int OldHumanCounter = 0;

void setup()
{
#ifdef DEBUG
 Serial.begin(9600);
 Serial.println("");
 Serial.println(F("Two sonar HumanCounter."));

pinMode (2, INPUT_PULLUP);
pinMode (3, INPUT_PULLUP);
 

 #endif
  }
void loop()
{

static uint32_t prev = 0;

////////// Читаем показания датчиков и выставляем флаги срабатывания 

sonarIn_state = !digitalRead(2);
sonarOut_state = !digitalRead(3);

//анализируем флаги срабатывания

if ( !sonarIn_state && !sonarOut_state) // VL53L0X_1 off, VL53L0X_2 off
 {
 if ( sonar_first > 0 && sonar_together && sonarIn_already && sonarOut_already)
  {
  if ( sonar_first == 1) // IN
   {
   HumanCounter++;
   }  
  else // OUT
   {
   HumanCounter--;
   }
  }
 sonarIn_already = false;
 sonarOut_already = false;
 sonar_together = false;
 sonar_first = 0;
 }  
else if ( sonarIn_state && !sonarOut_state) // VL53L0X_1 ON, VL53L0X_2 off
 {
 sonarIn_already = true;
 if ( !sonarOut_already )
  {
  sonar_first = 1; 
  }
 }  
else if ( !sonarIn_state && sonarOut_state) // VL53L0X_1 off, VL53L0X_2 ON
 {
 sonarOut_already = true;
 if ( !sonarIn_already )
  {
  sonar_first = 2;
  }
 }  
else if ( sonarIn_state && sonarOut_state) // VL53L0X_1 ON, VL53L0X_2 ON
 {
 if ( sonarIn_already && sonarOut_already && sonar_together ) 
  {
  if ( sonar_first == 1 ) 
   {
   sonarOut_already = false;
   }
  if ( sonar_first == 2 ) 
   {
   sonarIn_already = false;
   }
  }
 sonar_together = true;
 }  
// Конец анализа.
if ( HumanCounter != OldHumanCounter ) 
 {
 #ifdef DEBUG
 
 
 Serial.print(F("HumanCounter = "));
 Serial.println(HumanCounter);
 #endif  
 }
OldHumanCounter = HumanCounter;

#ifdef DEBUG
if (millis()- prev>500)
{
 prev = millis(); 
  
  
 Serial.print(sonarIn_state);
 Serial.print(sonarOut_state);
 Serial.print(sonarIn_already);
 Serial.print(sonarOut_already);
 Serial.print(sonar_together);
 Serial.println(sonar_first);
}
#endif

}

 

Primatech
Offline
Зарегистрирован: 09.12.2020

MaksVV пишет:
Все отлично работает. Значит если есть проблемы, они в специфике работы сонаров, вам уже ранее это говорили, а вы упрямый.

Тогда объясните пожалуйста, в чем разница сонара от датчика, используемого в оригинальном скетче? что сонар измеряет расстояние до объекта со скоростью 50 мск, что лазерный дальномер. Разница лишь в способе получения информации, один ультразвук использует, и дальность у него больше, второй лазер, до 2 метров. Может я и не прав, вот только внятного ответа я так и не получил, почему. Скетч должен одинаково работать как с ультразвуковым дальномером, так и с лазерным. И то что я часть кода, мне непонятную вырезал из скетча,  на это тоже внятного ответа не получил. Возможно в этом и заключается корректная работа. А посылать читать книжки каждый может. Я не прошу готового решения, но форумы для помощи людям созданы, людям несведующим в определенных сферах.  

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

Primatech пишет:

Я не прошу готового решения, но форумы для помощи людям созданы, людям несведующим в определенных сферах.  

Вас этой фразе где обучили? 

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

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Primatech пишет:

А посылать читать книжки каждый может. Я не прошу готового решения, но форумы для помощи людям созданы, людям несведующим в определенных сферах.  

Достали новички, каждый из которых, в нарушение правил форума считает своим долгом высказать мнение (причем, всегда в безапелляционной форме!) о назначении форума. Данный форум создан для общения по интересам. А не для того, чтобы каждому невежде подтирать здесь попу. Тот, кто ничего не знает, не интересен для общения. И его мнение о назначении форума также никого не интересует.

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

Primatech пишет:
Тогда объясните пожалуйста, в чем разница сонара от датчика, используемого в оригинальном скетче? что сонар измеряет расстояние до объекта со скоростью 50 мск, что лазерный дальномер. Разница лишь в способе получения информации, один ультразвук использует, и дальность у него больше, второй лазер, до 2 метров.

Разница в том, что лазерные датчики при измерении не влияют друг на друга. А ультразвуковые сначала излучают сигнал (звук) потом принимают. Дак вот если звук с излучателя первого датчика попадет в приёмник второго как вы думаете что получится?  

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

основная логика скетча да, она и работает. Только вот проблема в том, что сам статус (измерение расстояния) ультразвуковых датчиков неправильно работает.  

А то что вы рукой закрывали и убирали, пытаясь этим самым чего то проверить , вы неправильно это делали. и пытались изменить  нормальную логику работающего скетча (типа сохранять статус или чего то там). Ещё раз повторяюсь:  сымитируйте сработку датчиков в нужной последовательности, тогда поймете, что все работает. 

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

Primatech пишет:

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

Вырезанная из setup() (если Вы о ней) часть кода предназначена исключительно для датчиков VL53L0X, понять непонятное могут помочь подробные комменты, начиная с 24-й строки.

Primatech
Offline
Зарегистрирован: 09.12.2020

MaksVV пишет:

Primatech пишет:
Тогда объясните пожалуйста, в чем разница сонара от датчика, используемого в оригинальном скетче? что сонар измеряет расстояние до объекта со скоростью 50 мск, что лазерный дальномер. Разница лишь в способе получения информации, один ультразвук использует, и дальность у него больше, второй лазер, до 2 метров.

Разница в том, что лазерные датчики при измерении не влияют друг на друга. А ультразвуковые сначала излучают сигнал (звук) потом принимают. Дак вот если звук с излучателя первого датчика попадет в приёмник второго как вы думаете что получится?  

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

основная логика скетча да, она и работает. Только вот проблема в том, что сам статус (измерение расстояния) ультразвуковых датчиков неправильно работает.  

А то что вы рукой закрывали и убирали, пытаясь этим самым чего то проверить , вы неправильно это делали. и пытались изменить  нормальную логику работающего скетча (типа сохранять статус или чего то там). Ещё раз повторяюсь:  сымитируйте сработку датчиков в нужной последовательности, тогда поймете, что все работает. 

Как уже писал ранее , датчики работают корректно. Расположены на значительном расстоянии друг от друга. Прочтите даташит по данным датчикам, там указан угол распространения ультразвука. Дело не в железе, оно исправно и работает не мешая друг другу. Вы рекомендуете сделать сработке в нужной последовательности. Какая тут может быть последовательность...? Сперва первый, потом второй. Вот вам вход, сперва второй потом первый, вот вам выход. Работает все, вот только проходы отмечаются если дать сработку обоим датчикам практически одновременно. Винить железо бесполезно, оно исправно и не мешает друг другу...Наверно проще записать видео порта чтоб стало понятнее как ведёт себя программа.

Primatech
Offline
Зарегистрирован: 09.12.2020

Araris] </p> <p>[quote=Primatech пишет:

Вырезанная из setup() (если Вы о ней) часть кода предназначена исключительно для датчиков VL53L0X, понять непонятное могут помочь подробные комменты, начиная с 24-й строки.


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

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

Менять один из адресов нужно, что бы иметь возможность общаться с датчиками индивидуально с каждым, датчики должны иметь уникальные адреса.

Если сонары расположены на расстоянии, не позволяющем движущемуся объекту перекрывать их одновременно оба, то этот скетч не для Вас.