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

Math 计算传感器数据的平均值(电容式传感器),math,arduino,microcontroller,capacity,Math,Arduino,Microcontroller,Capacity,所以我开始摆弄电容传感器,因为它是一些很酷的东西 我在网上学习了一些关于如何设置和使用Arduino的CapSense库的教程,我刚刚对我在这里编写的代码提出了一个快速的问题,以获得该数据的平均值 void loop() { long AvrNum; int counter = 0; AvrNum += cs_4_2.capacitiveSensor(30); counter++; if (counter = 10) { l

所以我开始摆弄电容传感器,因为它是一些很酷的东西

我在网上学习了一些关于如何设置和使用Arduino的CapSense库的教程,我刚刚对我在这里编写的代码提出了一个快速的问题,以获得该数据的平均值

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;
  }
}
这是我的循环语句,在序列中,它似乎起作用了,但在我看来,数字低得令人怀疑。我用了一个10米的电阻,棕色,黑色,黑色,绿色,棕色,我触摸了一块箔,发送和接收引脚都连接到了电子磁带上,我得到的数字大约是650,或者30

基本上,我是问这个代码看起来是否正确,这些数字是否有意义…?

如果计数器=10,您的行是无效的。如果计数器==10,则应为

第一个计数器设置为10,当然计算结果为true。 计数器的第二次测试等于10,并且在计数器确实等于10之前不会计算为真

此外,kaylum还提到了另一个问题,如果计数器=10,则不初始化AvrNum。如果计数器==10,则应为

第一个计数器设置为10,当然计算结果为true。 计数器的第二次测试等于10,并且在计数器确实等于10之前不会计算为真


也提到了另一个问题,没有初始化AVRNUM

< P>在ARDUIO环境中使用的语言实际上是一个未被强制的C++子集,其中的主要功能隐藏在IDE提供的框架代码中。您的代码是一个将被编译并链接到框架的模块。当框架开始运行时,它首先初始化自身,然后通过调用函数setup初始化模块。初始化后,框架进入无限循环,在每次迭代时调用模块函数循环

您的代码在循环中使用局部变量,并期望它们在调用之间保存其值。虽然这在实践中可能会发生,而且可能会发生,因为框架的主要部分可能只是while1循环;,这是在调用未定义行为的恶魔。C++没有对未初始化变量的值做出任何承诺,甚至读取它也会导致任何事情发生。甚至表面上还在工作

要解决这个问题,累加器AvrNum和计数器必须存储在循环堆栈之外的其他位置。它们可以声明为静态,也可以移动到外部模块。外面的IMHO更好,尤其是在受限的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;
  }
}

我提供了一个设置,虽然它是冗余的,C++语言的保证是全局变量初始化生命初始化为0。在ARDUIO环境中使用的语言实际上是C++的未强制子集,其主要功能隐藏在IDE提供的框架代码中。您的代码是一个将被编译并链接到框架的模块。当框架开始运行时,它首先初始化自身,然后通过调用函数setup初始化模块。初始化后,框架进入无限循环,在每次迭代时调用模块函数循环

您的代码在循环中使用局部变量,并期望它们在调用之间保存其值。虽然这在实践中可能会发生,而且可能会发生,因为框架的主要部分可能只是while1循环;,这是在调用未定义行为的恶魔。C++没有对未初始化变量的值做出任何承诺,甚至读取它也会导致任何事情发生。甚至表面上还在工作

要解决这个问题,累加器AvrNum和计数器必须存储在循环堆栈之外的其他位置。它们可以声明为静态,也可以移动到外部模块。外面的IMHO更好,尤其是在受限的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;
  }
}

我提供了一个设置,虽然它是冗余的,C++语言的保证是全局变量初始化生命初始化为0。p> 这就是我在花了更多时间之后得出的结论。经过一些手动计算,它得到了所有的数据

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

这就是我在花了更多时间之后想到的。经过一些手动计算,它得到了所有的数据

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);
不,这是不对的。AvrNum未斜体使用,因此会导致未定义的行为。计数器=10应该是计数器==10.an
严格地说,长AvrCap=AvrNum/计数器的代码会更好;不,这是不对的。AvrNum未斜体使用,因此会导致未定义的行为。counter=10应该是counter==10。严格来说,长AvrCap=AvrNum/counter的代码会更好;好的,除了初始化AvrNum,我做了所有这些事情,因为如果我将它初始化为0,那么它不会循环并删除以前存储的传感器数据吗?我想得到大约十个读数的平均值。初始化AvrNum是必要的。是的,您将丢失以前的数据-若要解决此问题,请在计数器%10==0且AvrCap=AvrNum/counter时执行此操作;好的,除了初始化AvrNum,我做了所有这些事情,因为如果我将它初始化为0,那么它不会循环并删除以前存储的传感器数据吗?我想得到大约十个读数的平均值。初始化AvrNum是必要的。是的,您将丢失以前的数据-若要解决此问题,请在计数器%10==0且AvrCap=AvrNum/counter时执行此操作;看起来它能正确阅读所有内容!谢谢你的帮助。使用全局变量很有意义。我用这个for循环找到了另一个解决方案,你能告诉我这个检查结果吗…我把它作为另一个答案…看起来它能正确读取所有内容!谢谢你的帮助。使用全局变量很有意义。我用这个for循环找到了另一个解决方案,你能告诉我这个检查出来了吗…我把它作为另一个答案…这个坏得很厉害,应该有它自己的问题,这样可以对它进行剖析并解释为什么。你可以从这个问题链接到这个问题,这是处理后续问题的最佳方式。明白了!我将在一个部门内完成这项工作。这个部门已严重受损,值得提出自己的问题,以便对其进行剖析并解释原因。你可以从这个问题链接到这个问题,这是处理后续问题的最佳方式。明白了!我马上就去