我有一个简单的应用程序来计算水流量使用传感器,配备了一个弹簧开关。因此,应用程序应该只计算开关关闭的次数。
我的第一个代码是:
const int sensorPin = 2;
volatile int counter = 0;
void setup() {
Serial.begin(115200);
pinMode(sensorPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(sensorPin), sensorISR, FALLING);
}
void loop() {
Serial.print("Counter: ");
Serial.println(counter);
}
void sensorISR() {
counter++;
}
一旦一瓶20升的水装满了,柜台就会显示大约120升。
然后我修改了代码,如下所示:
const int sensorPin = 2;
volatile int counter = 0;
void setup() {
Serial.begin(115200);
pinMode(sensorPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(sensorPin), sensorISR, FALLING);
}
void loop() { }
void sensorISR() {
counter++;
Serial.print("Counter: ");
Serial.println(counter);
}
计数器降到了40 (使用同样的20升瓶子)。
计数应该是20L,但这不是我的问题,因为它是由弹簧开关的弹跳引起的(我将解决后者)。由于该项目将有3个传感器和3个ISRoutines,我想知道为什么将Serial.print()命令放到主循环中会导致如此奇怪的结果。
谢谢,保罗
发布于 2018-05-30 08:48:04
串行打印语句依赖于ISR期间禁用的中断。因此,Serial.print语句不属于ISR。
您的计数下降的原因是,现在您的ISR需要更长的执行时间,并且它掩盖了一些反弹。有不计其数的教程教你如何用Arduino来揭开某些东西的面纱。你肯定能找到一个。
最简单的两种方法是在引脚和接地之间使用电容进行硬件去抖动,或者只使用millis或micros来记录中断发生的时间,并忽略在这段时间内发生的任何中断。
https://stackoverflow.com/questions/50584764
复制相似问题