Arduino 使用多个超声波传感器作为计数器
我正在从事一个小项目,该项目使用多个超声波传感器检测运动物体并对其进行计数(如汽车)。我使用switch case,但程序并不是全部运行,因此它不能正常工作,计数器也不能增加或减少。我测试了每个传感器,并意识到它们工作正常。但是我不知道为什么我不能用这个代码得到结果,如果你能帮助我,我会提前感谢你。。。下面是我的代码Arduino 使用多个超声波传感器作为计数器,arduino,Arduino,我正在从事一个小项目,该项目使用多个超声波传感器检测运动物体并对其进行计数(如汽车)。我使用switch case,但程序并不是全部运行,因此它不能正常工作,计数器也不能增加或减少。我测试了每个传感器,并意识到它们工作正常。但是我不知道为什么我不能用这个代码得到结果,如果你能帮助我,我会提前感谢你。。。下面是我的代码 const int sensorNum = 2; uint8_t reading_0; uint8_t reading_1 ; int sensing[senso
const int sensorNum = 2;
uint8_t reading_0;
uint8_t reading_1 ;
int sensing[sensorNum][2];
unsigned long duration = 0; //period between transmit time and receive time in microSeconds
float distance = 0.00; //distance in centimeter
const float fixedDistance = 30.00;
const float vilocity = 0.034; //Vilocity of ultrasonic waves = 340 m/Sec = 0.034 cm/uSec
//const float cmDivisor = 29.4118;
float reading = 0.00;
int carCounter =200;
int PCarCounter=0;
int capacity = 200;
//int activate = LOW;
uint8_t current_ENTERstate = 0;
const uint8_t RESET = 0,CAR_START2EN=1,CAR_ENTERING=2,CAR_EN1=3,CAR_ENTERED=4;
void setup()
{
Serial.begin(9600);
for(int i = 0; i<sensorNum; i++){
sensing[i][1]=LOW;
sensing[i][2]=LOW;
pinMode(i+2,OUTPUT);
digitalWrite(i+2,LOW);
pinMode(i+8,INPUT);
digitalWrite(i+8,LOW);
current_ENTERstate = 0;
}
}
//==============================================================
void loop()
{
for(int l=0; l<2; l++){
reading_0 = calcDistance(2,8);
reading_1 = calcDistance(3,9);
if(reading_0 > 30.0 && reading_0 < 200.0) {
sensing[0][l] = HIGH;
}else if(reading_0 < 30.0 || reading_0 > 200.0) {
sensing[0][l] = LOW;
}
if(reading_1 > 30.0 && reading_1 < 200.0) {
sensing[1][l] = HIGH;
}else if(reading_1 < 30.0 || reading_1 > 200.0){
sensing[1][l] = LOW;
}
}
switch(current_ENTERstate){
case RESET:
if(sensing[0][0]||sensing[0][1]){
current_ENTERstate = CAR_START2EN;
break;
}else{
current_ENTERstate = RESET;
break;
}
break;
case CAR_START2EN:
if( sensing[0][0]||sensing[0][1] && sensing[1][0]||sensing[1][1] ){
current_ENTERstate = CAR_ENTERING;
break;
}else{
current_ENTERstate = RESET;
break;
}
break ;
case CAR_ENTERING:
if( sensing[1][0]||sensing[1][1] ){
current_ENTERstate = CAR_EN1;
break;
}else{
current_ENTERstate = CAR_START2EN;
break;
}
case CAR_EN1:
if( sensing[0][0]==LOW && sensing[0][1]==LOW && sensing[1][0]== LOW && sensing[1][1]==LOW ){
current_ENTERstate = CAR_ENTERED;
break;
}else{
current_ENTERstate = CAR_ENTERING;
break;
}
case CAR_ENTERED:
carCounter++;
break;
default: RESET;
} // switch end
}
//====================================================================================
float calcDistance(int trigger, int echoPin){
digitalWrite(trigger,LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
duration = pulseIn(echoPin,HIGH,40000);
distance = vilocity * duration / 2.0;
//Serial.print(distance);
return distance;
}
const int sensorNum=2;
uint8的读数为0;
uint8_t reading_1;
int-sensing[sensorNum][2];
无符号长持续时间=0//发送时间和接收时间之间的时间间隔(微秒)
浮动距离=0.00//以厘米为单位的距离
常量浮动固定距离=30.00;
常数浮动邪恶度=0.034//超声波的传播速度=340米/秒=0.034厘米/秒
//常量浮点cmDivisor=29.4118;
浮动读数=0.00;
int carCounter=200;
int PCarCounter=0;
内部容量=200;
//int=低;
uint8\u t当前\u进入状态=0;
const uint8\u t RESET=0,CAR\u START2EN=1,CAR\u ENTERING=2,CAR\u EN1=3,CAR\u ENTERED=4;
无效设置()
{
Serial.begin(9600);
对于(int i=0;i 200.0){
感测[0][l]=低;
}
如果(读数>30.0和读数<200.0){
感测[1][l]=高;
}否则如果(读数_1<30.0 | |读数_1>200.0){
感测[1][l]=低;
}
}
开关(当前状态){
案例重置:
如果(感测[0][0]| |感测[0][1]){
当前进入状态=车辆启动状态;
打破
}否则{
当前状态=重置;
打破
}
打破
case CAR_START2EN:
中频(感应[0][0]|感应[0][1]&感应[1][0]|感应[1][1]){
当前进入状态=车辆进入;
打破
}否则{
当前状态=重置;
打破
}
打破
案件车辆进入:
如果(感测[1][0]| |感测[1][1]){
当前状态=车辆EN1;
打破
}否则{
当前进入状态=车辆启动状态;
打破
}
案例1:
如果(感应[0][0]==低感应和感应[0][1]==低感应和感应[1][0]==低感应和感应[1][1]==低){
当前输入状态=输入的车辆;
打破
}否则{
当前进入状态=车辆进入;
打破
}
输入的案例车辆:
carCounter++;
打破
默认:重置;
}//开关端
}
//====================================================================================
浮动距离(int触发器、int echoPin){
数字写入(触发器,低电平);
延迟微秒(2);
数字写入(触发器,高);
延迟微秒(10);
数字写入(触发器,低电平);
持续时间=脉冲强度(echoPin,高,40000);
距离=邪恶*持续时间/2.0;
//串行打印(距离);
返回距离;
}
以下是可疑的(归功于@WeatherVane的发现):
因为&&
是在|
之前求值的,所以条件表达式的求值方式与编写条件表达式的方式相同:
a = sensing[0][1] && sensing[1][0] ;
if( sensing[0][0] || a || sensing[1][1] )
这似乎不太可能是我们的意图。也许应该这样写:
if( (sensing[0][0] || sensing[0][1]) &&
(sensing[1][0] || sensing[1][1]) )
(为清晰起见,添加了换行符)
关于传感,在读取有噪音的传感器时,应增加一些滞后。为了避免重复大量高维护代码,最好定义一个函数
void distanceHighLow( float reading, int& sensing ) ;
{
static const float HYSTERESIS = 2.0f ;
static const float MIN_DISTANCE = 30.0f ;
static const float MAX_DISTANCE = 200.0f ;
if( reading > MIN_DISTANCE &&
reading < MAX_DISTANCE )
{
sensing = HIGH;
}
else if( reading < (MIN_DISTANCE - HYSTERESIS) ||
reading > MAX_DISTANCE + HYSTERESIS)
{
sensing = LOW;
}
}
请不要将
l
用作变量名。这使得像感应[1][l]
这样的代码很难理解。它只是一个(l)字母而已。默认值:重置代码>?更多:每次我看到一个1
我都要看两遍,看看它是不是l
,反之亦然。@WeatherVane说了什么。另外,从实用的角度来看,你最好在高开关和低开关之间增加一些迟滞,因为传感器通常是“噪音”的;例如,当它必须>30.0才能变高时,您可能需要它降到28.0以下才能变低。原则上,您确实有一些微小的滞后,因为当值正好为30.0时,您不会更改状态,但作为浮点,这是一种不太可能的情况。
void distanceHighLow( float reading, int& sensing ) ;
{
static const float HYSTERESIS = 2.0f ;
static const float MIN_DISTANCE = 30.0f ;
static const float MAX_DISTANCE = 200.0f ;
if( reading > MIN_DISTANCE &&
reading < MAX_DISTANCE )
{
sensing = HIGH;
}
else if( reading < (MIN_DISTANCE - HYSTERESIS) ||
reading > MAX_DISTANCE + HYSTERESIS)
{
sensing = LOW;
}
}
distanceHighLow( reading_0, sensing[0][l] ) ;
distanceHighLow( reading_1, sensing[1][l] ) ;