首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Arduino中断返回不可靠的值

Arduino中断返回不可靠的值
EN

Stack Overflow用户
提问于 2018-05-29 20:45:28
回答 1查看 219关注 0票数 0

我有一个简单的应用程序来计算水流量使用传感器,配备了一个弹簧开关。因此,应用程序应该只计算开关关闭的次数。

我的第一个代码是:

代码语言:javascript
复制
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升。

然后我修改了代码,如下所示:

代码语言:javascript
复制
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()命令放到主循环中会导致如此奇怪的结果。

谢谢,保罗

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-30 08:48:04

串行打印语句依赖于ISR期间禁用的中断。因此,Serial.print语句不属于ISR。

您的计数下降的原因是,现在您的ISR需要更长的执行时间,并且它掩盖了一些反弹。有不计其数的教程教你如何用Arduino来揭开某些东西的面纱。你肯定能找到一个。

最简单的两种方法是在引脚和接地之间使用电容进行硬件去抖动,或者只使用millis或micros来记录中断发生的时间,并忽略在这段时间内发生的任何中断。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50584764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档