所以我开始搞乱电容式传感器,因为它有一些很酷的东西。
我已经在线阅读了一些关于如何设置它并使用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.
基本上我在问这段代码是否正确,以及这些数字是否有意义??
答案 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 ++没有对未初始化变量的值做出任何承诺,甚至读取它也会导致任何事情发生。即使显然工作。
要解决此问题,必须将累加器AvrNum
和counter
存储在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);