极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21584|回复: 10

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

[复制链接]
发表于 2016-8-4 15:20:43 | 显示全部楼层 |阅读模式
做了一个由超声波SR和NANO组成的人体计数器;
组要实现人体通过时计数,设想当探测距离小于一定值时计数。
写了如下程序,但发现会重复计数。
Arduino有能对上升沿/或下降沿计数的机制吗?

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

const int TrigPin = 2;
const int EchoPin = 3;
const  int 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;
}
回复

使用道具 举报

发表于 2016-8-4 16:55:59 | 显示全部楼层
程序看不懂,小于一定距离计数,人员通过是不是要有个时间,这个时间段设定多长,怎么分辨是一个人过去还是几个人一起过去
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-5 11:28:17 | 显示全部楼层
Rq-Rm 发表于 2016-8-4 16:55
程序看不懂,小于一定距离计数,人员通过是不是要有个时间,这个时间段设定多长,怎么分辨是一个人过去还是 ...

是的这是个问题。
那位大侠能提供算法或解决方案啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-5 11:28:29 | 显示全部楼层
Rq-Rm 发表于 2016-8-4 16:55
程序看不懂,小于一定距离计数,人员通过是不是要有个时间,这个时间段设定多长,怎么分辨是一个人过去还是 ...

是的这是个问题。
那位大侠能提供算法或解决方案啊?
回复 支持 反对

使用道具 举报

发表于 2016-8-5 11:32:42 | 显示全部楼层
initial 发表于 2016-8-5 11:28
是的这是个问题。
那位大侠能提供算法或解决方案啊?

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

使用道具 举报

 楼主| 发表于 2016-8-5 13:10:29 | 显示全部楼层
Rq-Rm 发表于 2016-8-5 11:32
原理上就有问题的东西就不要做了,浪费时间……除非弄个单人过道,来一个计一个

一个一个的通过,是否还要考虑通过时间不同啊?
回复 支持 反对

使用道具 举报

发表于 2016-8-5 15:14:27 | 显示全部楼层
initial 发表于 2016-8-5 13:10
一个一个的通过,是否还要考虑通过时间不同啊?

不用考虑时间,考虑的是探测到的距离,还有传感器的摆放位置
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-5 18:25:24 | 显示全部楼层
Rq-Rm 发表于 2016-8-5 15:14
不用考虑时间,考虑的是探测到的距离,还有传感器的摆放位置

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

使用道具 举报

发表于 2016-8-5 18:52:37 | 显示全部楼层
本帖最后由 Rq-Rm 于 2016-8-5 18:54 编辑
initial 发表于 2016-8-5 18:25
距离不是问题,关键是每个人通过时间可能不同。
本来设想,探测到满足距离后计数只加1,这个不知如何实现 ...


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

使用道具 举报

发表于 2016-8-8 09:38:27 | 显示全部楼层
我也试过利用超声波测距来记数,不管怎么弄都有误差-------几个人一块儿过只记一次。
换一个方法吧!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-12 20:40:09 | 显示全部楼层
Rq-Rm 发表于 2016-8-5 18:52
距离减小就计数,思路本身就有问题,过去一个人距离应该是先减小后增大到正常距离,当成一个波去处理, ...

深有启发。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 02:14 , Processed in 0.037728 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表