0

我已经构建了一个 arduino 草图,它试图对来自几个传感器的模拟值进行几个不同长度的窗口和一些简单的计算(均值/方差)。以前,我为 1 个传感器按预期工作的相同代码,但下面的代码已经扩展了一堆小的 for 循环,所以现在所有的东西都应该为两个传感器运行。

我根本无法将任何东西打印到串行 - 即使是我在设置和循环启动中放入的两个串行打印只是为了调试 - 但是代码编译和上传时没有任何错误或警告。

我为包含整个草图而道歉,我想不出如何将它拆开来展示。

long int currentTime = 0;
long int stopTime[2] = {0,0};
long int shortWindowTime = 0;
int shortVal[2][40];
int reflexWindowStart = 0;
int reflexWindowTime = 0;
int reflexVal[2][500];
int mean[2] = {0,0};
unsigned int variance[2] = {0,0};
int lowVal[2] = {0,0};
int peakVal[2] = {0,0};
int lowIndex[2] = {0,0};
int peakIndex[2] = {0,0};
int stopIndex[2] = {0,0};
boolean stopped[2] = {false,false};

void setup(){
  Serial.begin(9600);
  Serial.println("wtf?");
  for(int i=0;i<2;i++){
    for(int j=0;j<40;j++){
      shortVal[i][j] = 0;
    }
    for(int j=0;j<500;j++){
      reflexVal[i][j] = 1023;
    }
  }

}

void loop() {

  Serial.println("wtf?");

  currentTime = micros();

  if(currentTime - shortWindowTime > 500){

    shortWindowTime = currentTime;

    writeShortWindow();

    meanVariance();

    if(reflexWindowStart == 0){
      reflexWindow();
    }
    reflexWindowStart++;
    if(reflexWindowStart > 9){
      reflexWindowStart = 0;
    } 
  }
} 

void writeShortWindow(){
  for(int i=0;i<2;i++){
    for(int j=39; j>0; j--){
      shortVal[i][j] = shortVal[i][j-1];
    }
    int ground = analogRead(A5);
    shortVal[0][0] = analogRead(A1);
    analogRead(A5);
    shortVal[i][0] = analogRead(A2);
  }
}

void meanVariance(){
  for(int i=0;i<2;i++){
    for(int j=0; j<39; j++){
      mean[i] = mean[i] + shortVal[i][j];
    }    
    mean[i] = mean[i] / 40;
    for(int j=0; j<39; j++){
      variance[i] = variance[i] + sq(mean[i] - shortVal[i][j]) ;
    }
    variance[i] = variance[i] / 40;
  }
}


void reflexWindow(){

    for(int i=0;i<2;i++){
      if(stopped[i] == true){
        if((millis() - stopTime[i] > 20) && (peakVal[i] - shortVal[i][0] > 20) && (variance[i] <= 1)){ 
          stopped[i] = false;
          stopIndex[i] = 0;
          Serial.println("................................NOTstopped");
        }
      }
    }

    for(int i=0;i<2;i++){
    if(stopped[i] == false){

      lowVal[i] = 1023;
      peakVal[i] = 0; 

      for(int j=stopIndex[i]; j>0; j--){
        reflexVal[i][j] = reflexVal[i][j-1];
          if(reflexVal[i][j] < lowVal[i]){
            lowVal[i] = reflexVal[i][j];
            lowIndex[i] = j;
          }
      }

      reflexVal[i][0] = shortVal[i][0];



      for(int j=lowIndex[i]; j>=0; j--){
        if(reflexVal[i][j] > peakVal[i]){
          peakVal[i] = reflexVal[i][j];
        }
      }
    }
  }


  for(int i=0;i<2;i++){
    if(stopped[i] == false){
      if(peakVal[i] - lowVal[i] >= 50){
        Serial.print(i);
        Serial.println("...................................stopped");
        stopTime[i] = millis();
        stopped[i] = true;
      }
    }
  }

  for(int i=0;i<2;i++){
    if(stopIndex[i] < 499){
      stopIndex[i]++;
    }
  }

  Serial.print(shortVal[0][0]);
  Serial.print(" ... ");
  Serial.print(lowVal[0]);
  Serial.print(" ... ");
  Serial.print(peakVal[0]); 
  Serial.print(" ........ ");
  Serial.print(shortVal[1][0]);
  Serial.print(" ... ");
  Serial.print(lowVal[1]);
  Serial.print(" ... ");
  Serial.println(peakVal[1]);   
}
4

2 回答 2

0

如果你有一块 Leonardo 板,你很可能不会在设置函数中看到 Serial.print。
尝试将您的设置更改为此(注意等待串行的额外 while 循环)

void setup(){
  Serial.begin(9600);
  while (!Serial);
  Serial.println("wtf?");
  for(int i=0;i<2;i++){
    for(int j=0;j<40;j++){
      shortVal[i][j] = 0;
    }
    for(int j=0;j<500;j++){
      reflexVal[i][j] = 1023;
    }
  }
}

这背后的原因您可以在 Arduino 文档中阅读 Leonardo http://arduino.cc/en/Guide/ArduinoLeonardo#toc3但简而言之,Leonardo 在打开串行流时不会重置串行端口。

于 2013-07-22T22:56:24.447 回答
-1

您是否在串行监视器中检查了您的波特率,因为如果它不同,它将不会显示任何内容。确保串行监视器中的和 inSerial.begin(<BAUD rate here>)相同

于 2019-09-22T10:13:54.527 回答