int ssecho = 8;
int sstrig = 9;
int pin =5; //LED发光模块的引脚
int standard_dis = 10; //设置超声波标准的探测距离是10cm;
int standard_db =892; //标准声贝是30db;
int temp,data;
int m = 0; //协助设置输出时间的
int count = 0;
int num = 0;//经过人数的全局计数
float a = 0;
float b = 0;
void setup() {
pinMode(ssecho, INPUT);
pinMode(sstrig, OUTPUT);
Serial.begin(9600);
}
int supersonicRead(){
digitalWrite(sstrig, HIGH);
delayMicroseconds(10);
digitalWrite(sstrig, LOW);
int echotime = pulseIn(ssecho, HIGH);
return echotime;
}
void beSolience(){
Serial.print("\n");
Serial.print("Please be quiet!!!!!\n ");
}
int showNum(){
Serial.print("\n");
Serial.print(num);
Serial.print(" persons passed ");
Serial.print("(this log shows every 10 seconds)");
}
int safe(){
Serial.print("\n");
Serial.print("Safe!!Nothing happened\n");
}
int flashLights(){
for(int i = 0;i< 5;i++){
digitalWrite(pin, HIGH); //将管脚设置为高电平, 则LED灯亮
delay(100);
digitalWrite(pin, LOW); //将管脚设置为低电平, 则LED灯灭
delay(100); //等待1000毫秒
}
}
//超声波测量距离函数
float dis(){
int diff = supersonicRead();
float distance = diff / 58.0;
return distance;
}
//保证人数经过的精确
bool checkdisChange(float a ,float b){
if((b - a>a*0.2) ||(b - a>a*0.2))
return true;
else
return false;
}
//判断持续移动
bool keepMoving(float a ,float b){
if(a != b)
return true;
else
return false;
}
bool someonePassing(){
if(dis()> standard_dis )
return false;
else
return true;
}
bool checkoverdb(){
int Soundvalue = analogRead(A0);
if(Soundvalue >= standard_db-1)
return true;
else
return false;
}
int passing(){
Serial.print("\n");
Serial.print("Hey !!!!some one is passing by \n");
for(int i = 0 ;i<3;i++){
int w = 1000;
delay(w);
Serial.print("\n");
Serial.print("Hey !!!!some one is passing by ");
Serial.print(i+1);
Serial.print(" seconds before\n");
if(!someonePassing())
break;
}
}
//this is the logical
void loop() {
m++;
delay(300);
//如果有人大声吵闹,则出现be quiet
if(checkoverdb()){
beSolience();
}
//超声波系统探测没有人近距离经过
if(dis() > 10 &&(m % 5 ==0))
{
safe();
}
//如果有人经过,快速闪灯
//如果人静止在超声波前,应该不予以计数
//如果持续移动才会计数,否则有停顿则不会计数
else if( someonePassing() && !checkoverdb())
{
if(m%2==0)
a = dis();
if(m%2!=0)
b = dis();
if(keepMoving(a,b))
num++;
else
num = num;
flashLights();
passing();
}
//every 9 seconds show a report
if(count%30==0){
showNum();
}
count++;
}
功能介绍:
此次Arduino开发的功能如下:
1.人物经过检测
a) 每隔 1.5s 执行一次超声波检测,如果没有物体经过则会显示Safe! Nothing happens.
b) 如果有人经过,则会显示 Hey, Some one is passing by.
c) 如果此人(或物)驻留在超声波传感器前,此处会出现 Hey, Some one is passing by 1 seconds before .Hey, Some one is passing by 2seconds before Hey, Some one is passing by 3 seconds before .
该次开发应用了超声波传感器,代码中拟定的测定距离为10cm,当有物体从超声波前经过的时候就会触发相应的检测。
2.人物经过计数
a) 代码中采用了定义全局变量的形式,每有人从超声波检测器前经过则会计数++
b) 每隔10s就会统一生成经过人数的统计报告
c) 亮点:此处采用了自己设计的算法,如果有人在超声波前长时间停留不会再arduino重复loop时重复计数,此时只会计数一次。算作一个经过,而不是每执行一次就会记录一个经过
3.警示灯提示
a) 当有人(或物)经过时就会触发警示灯的快速闪动5次。
b) 如果有人(或物)长时间驻留在超声波传感器前就不会闪动,而是一直保持高亮状态
4.噪声监测
a) 此arduino开发应用了声音监测模块,当环境中出现较大噪音时,则会出现Please be quiet!!的警告语。
b) 但是囿于声音监测模块只能监测声音的有无,不能监测声音具体的分贝值大小,此处只能在噪声达到一定值时才会触发警告语的提示。(本意是监测具体的分贝值大小,但是开发模块的硬件功能有限制。)
连线图: