计算传感器数据(电容传感器)的平均值

时间:2016-04-15 19:55:58

标签: math arduino microcontroller capacity

所以我开始搞乱电容式传感器,因为它有一些很酷的东西。

我已经在线阅读了一些关于如何设置它并使用CapSense库进行Arduino的教程,我只是对我在这里写的代码有一个快速的问题,以获得该数据的平均值。

void loop() {                    
  long AvrNum;
  int counter = 0;

  AvrNum += cs_4_2.capacitiveSensor(30);
  counter++;

  if (counter = 10) {
    long AvrCap = AvrNum/10;
    Serial.println(AvrCap);
    counter = 0;
  }
}

这是我的循环语句,在序列中,它似乎正在工作,但数字对我来说看起来很可疑。我正在使用一个10M电阻(棕色,黑色,黑色,绿色,棕色),并且正在触摸一块箔片,发送和接收引脚都连接到(电子胶带)并且我的数字大约在650左右,给予或接受30.

基本上我在问这段代码是否正确,以及这些数字是否有意义??

3 个答案:

答案 0 :(得分:2)

您的第if (counter = 10)行无效。它应该是if (counter == 10)

第一个设置为10并且(当然)评估为真 计数器的第二次测试等于10,并且在计数器确实等于10之前不会评估为真。

另外,kaylum提到另一个问题,没有初始化AvrNum

答案 1 :(得分:2)

Arduino环境中使用的语言实际上只是C ++的一个未加强的子集,其中main()函数隐藏在IDE提供的框架代码中。您的代码是一个将被编译并链接到框架的模块。当框架开始运行时,首先通过调用函数setup()来初始化自己然后初始化模块。初始化后,框架进入无限循环,在每次迭代时调用模块函数loop()

您的代码正在使用loop()中的局部变量,并期望它们将在调用之间保留其值。虽然这可能在实践中发生(并且可能因为框架main()的那部分可能只是while(1) loop();),但这是在调用未定义行为的恶魔。 C ++没有对未初始化变量的值做出任何承诺,甚至读取它也会导致任何事情发生。即使显然工作。

要解决此问题,必须将累加器AvrNumcounter存储在loop()堆栈以外的其他位置。它们可以声明为static,也可以移动到外面的模块中。外面是更好的恕我直言,特别是在受限制的Arduino环境中。

完成平均后,您还需要清除累加器。这是最简单的平均滤波器形式,您可以将N个样本的固定长度块相加,然后使用每个第N个样本的平均值。

我相信这个片段(未经测试)会对你有用:

long AvrNum;
int counter;

void setup() {
  AvrNum = 0;
  counter = 0;
}

void loop() {                    

  AvrNum += cs_4_2.capacitiveSensor(30);
  counter++;

  if (counter == 10) {
    long AvrCap = AvrNum/10;
    Serial.println(AvrCap);
    counter = 0;
    AvrNum = 0;
  }
}

我提供了一个setup(),虽然它与C ++语言是多余的,但保证全局变量的生命初始化为0。

答案 2 :(得分:0)

这是我在花了一些时间后最终想出来的。经过一些手动计算后,它会获得所有数据。

long AvrArray [9];

      for(int x = 0; x <= 10; x++){
       if(x == 10){
          long AvrMes = (AvrArray[0] + AvrArray[1] + AvrArray[2] + AvrArray[3] + AvrArray[4] + AvrArray[5] + AvrArray[6] + AvrArray[7] + AvrArray[8] + AvrArray[9]);
          long AvrCap = AvrMes/x;
          Serial.print("\t");
          Serial.println(AvrCap);
          x = 0;
        }

       AvrArray[x] = cs_4_2.capacitiveSensor(30);
       Serial.println(AvrArray[x]);

         delay(500);