initial 发表于 2016-8-4 15:20:43

超声波探头人员通过计数器

做了一个由超声波SR和NANO组成的人体计数器;
组要实现人体通过时计数,设想当探测距离小于一定值时计数。
写了如下程序,但发现会重复计数。
Arduino有能对上升沿/或下降沿计数的机制吗?

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int TrigPin = 2;
const int EchoPin = 3;
constint ifred=4;
float cm;
float cm2;
float cm3;
int count;

int Filter_Value2;
int Filter_Value3;
int value;

LiquidCrystal_I2C lcd(0x27,19,3); // set the LCD address to 0x27 for a 20 chars and 4 line display

void setup()
{
lcd.init(); // initialize the lcd
delay(10);
lcd.backlight(); //Open the backlight
lcd.clear();
delay(20);
value=40;
count=0;
pinMode(6, INPUT);//define pin 6 as input

lcd.setCursor(0,2); // Cow 2 line 0,
lcd.print("The Number is:"); // Print a message to the LCD.


}


void loop()
{
int n =digitalRead(6);                   //创建一个变量n,将4号数字口的状态采集出来赋值给他。
if (n==HIGH)                           //判断n是否为高电平,如果是执行下面的语句,不是则跳过。
{
    lcd.clear();
    delay(100);
   count=0;
   }

digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
cm2 = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
Filter_Value2 = Filter(cm2);       // 获得滤波器输出值
cm2 = (int(Filter_Value2 * 100.0)) / 100.0; //保留两位小数
if(cm2<0)
{cm2=0;}
if (cm2 < 50)
   {
   delay(150);   
    digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
    delayMicroseconds(2);
    digitalWrite(TrigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(TrigPin, LOW);
    cm3 = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
    Filter_Value3 = Filter(cm3);       // 获得滤波器输出值
    cm3 = (int(Filter_Value3 * 100.0)) / 100.0; //保留两位小数
   if(cm3<0)
   {cm3=0;}
   if((cm3-cm2)>30)
   {
      count=count+1;
   tone(4,400,500) ;
   }
   }

lcd.setCursor(0,0); // Cow 2 line 0,
lcd.print("The Distance is:"); // Print a message to the LCD.
lcd.setCursor(0,1); // Cow 2 line 0,
lcd.print(cm2); // Print a message to the LCD.
lcd.setCursor(8,1); // Cow 2 line 0,
lcd.print(cm3); // Print a message to the LCD.
lcd.setCursor(0,2); // Cow 2 line 0,
lcd.print("The Number is:"); // Print a message to the LCD.
lcd.setCursor(2,3); // Cow 2 line 0,
lcd.print(count); // Print a message to the LCD.







// Serial print //
/*
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(100);
*/
}


// 限幅滤波法(又称程序判断滤波法)
#define FILTER_A 20
int Filter( int dist)
{
int Newdist;
//Newdist =pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm;
Newdist=2547.8/((float)cm*0.49-10.41)-0.42;
if(((Newdist - dist) > FILTER_A) || ((dist - Newdist) > FILTER_A))
    return dist;
else
    return Newdist;
}

Rq-Rm 发表于 2016-8-4 16:55:59

程序看不懂,小于一定距离计数,人员通过是不是要有个时间,这个时间段设定多长,怎么分辨是一个人过去还是几个人一起过去

initial 发表于 2016-8-5 11:28:17

Rq-Rm 发表于 2016-8-4 16:55 static/image/common/back.gif
程序看不懂,小于一定距离计数,人员通过是不是要有个时间,这个时间段设定多长,怎么分辨是一个人过去还是 ...

是的这是个问题。
那位大侠能提供算法或解决方案啊?

initial 发表于 2016-8-5 11:28:29

Rq-Rm 发表于 2016-8-4 16:55 static/image/common/back.gif
程序看不懂,小于一定距离计数,人员通过是不是要有个时间,这个时间段设定多长,怎么分辨是一个人过去还是 ...

是的这是个问题。
那位大侠能提供算法或解决方案啊?

Rq-Rm 发表于 2016-8-5 11:32:42

initial 发表于 2016-8-5 11:28 static/image/common/back.gif
是的这是个问题。
那位大侠能提供算法或解决方案啊?

原理上就有问题的东西就不要做了,浪费时间……除非弄个单人过道,来一个计一个

initial 发表于 2016-8-5 13:10:29

Rq-Rm 发表于 2016-8-5 11:32 static/image/common/back.gif
原理上就有问题的东西就不要做了,浪费时间……除非弄个单人过道,来一个计一个

一个一个的通过,是否还要考虑通过时间不同啊?

Rq-Rm 发表于 2016-8-5 15:14:27

initial 发表于 2016-8-5 13:10 static/image/common/back.gif
一个一个的通过,是否还要考虑通过时间不同啊?

不用考虑时间,考虑的是探测到的距离,还有传感器的摆放位置

initial 发表于 2016-8-5 18:25:24

Rq-Rm 发表于 2016-8-5 15:14 static/image/common/back.gif
不用考虑时间,考虑的是探测到的距离,还有传感器的摆放位置

距离不是问题,关键是每个人通过时间可能不同。
本来设想,探测到满足距离后计数只加1,这个不知如何实现。
或者系统有没有利用上升沿或下降沿触发来计数的。

Rq-Rm 发表于 2016-8-5 18:52:37

本帖最后由 Rq-Rm 于 2016-8-5 18:54 编辑

initial 发表于 2016-8-5 18:25 static/image/common/back.gif
距离不是问题,关键是每个人通过时间可能不同。
本来设想,探测到满足距离后计数只加1,这个不知如何实现 ...

距离减小就计数,思路本身就有问题,过去一个人距离应该是先减小后增大到正常距离,当成一个波去处理,一个波一个人
————————————————————————以上言论纯属虚构………………………………………………

leisd 发表于 2016-8-8 09:38:27

我也试过利用超声波测距来记数,不管怎么弄都有误差-------几个人一块儿过只记一次。
换一个方法吧!

initial 发表于 2016-8-12 20:40:09

Rq-Rm 发表于 2016-8-5 18:52 static/image/common/back.gif
距离减小就计数,思路本身就有问题,过去一个人距离应该是先减小后增大到正常距离,当成一个波去处理, ...

深有启发。
页: [1]
查看完整版本: 超声波探头人员通过计数器