Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 使用多个超声波传感器作为计数器_Arduino - Fatal编程技术网

Arduino 使用多个超声波传感器作为计数器

Arduino 使用多个超声波传感器作为计数器,arduino,Arduino,我正在从事一个小项目,该项目使用多个超声波传感器检测运动物体并对其进行计数(如汽车)。我使用switch case,但程序并不是全部运行,因此它不能正常工作,计数器也不能增加或减少。我测试了每个传感器,并意识到它们工作正常。但是我不知道为什么我不能用这个代码得到结果,如果你能帮助我,我会提前感谢你。。。下面是我的代码 const int sensorNum = 2; uint8_t reading_0; uint8_t reading_1 ; int sensing[senso

我正在从事一个小项目,该项目使用多个超声波传感器检测运动物体并对其进行计数(如汽车)。我使用switch case,但程序并不是全部运行,因此它不能正常工作,计数器也不能增加或减少。我测试了每个传感器,并意识到它们工作正常。但是我不知道为什么我不能用这个代码得到结果,如果你能帮助我,我会提前感谢你。。。下面是我的代码

     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] ) ;