在Arduino中读取传感器时按下按钮

时间:2016-01-23 01:52:00

标签: c arduino arduino-uno

我一直在做一个小温度计项目来学习Arduino,有一件烦人的事我不知道如何解决。

我有两个按钮来设置最小和最大温度,当我按下按钮时,它应该设置显示的最小和最大温度。 问题是,在读取温度传感器期间按下按钮时,有时(50%的时间)按钮不起作用。我按下它但没有设置最小/最大温度,因为Arduino卡在读取温度传感器时。

有没有办法解决这类问题?如果我有一个键盘输入一些数字,例如我想我会遇到同样的问题而且它不是“用户友好的”。

以下是我正在使用的部分代码的示例:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

//variables declaration...

void setup() {
  sensors.begin();
  sensors.getAddress(sensor1, 0);
  pinMode(buzzer, OUTPUT);
  pinMode(btBuzzer, INPUT);
  pinMode(btMin, INPUT);
  pinMode(btMax, INPUT);
}

void loop() {
  readButtons();

  playBuzzer();

  readTemperature();

  printDisplay();

  delay(150);
}

void readButtons(){
  if(digitalRead(btBuzzer)){
    buzzerOn = !buzzerOn;
  }

  if(digitalRead(btMin)){
    if(tempMin == 69)
      tempMin = 59;
    else
      tempMin++;
  }

  if(digitalRead(btMax)){
    if(tempMax == 75)
      tempMax = 63;
    else
      tempMax++;
  }
}

void readTemperature(){
  sensors.requestTemperatures();
  temperature = sensors.getTempC(sensor1);
}

//lots of other methods

2 个答案:

答案 0 :(得分:3)

正如其他人在此处指出的那样,按下按钮可能不会在您使用digitalRead(btBuzzer)查询引脚的同时发生。这类问题就是为所谓的“中断”而发明的,它允许您响应在您不监视感兴趣的引脚时可能发生的事件。

例如,Arduino UNO R3允许在引脚2和3上进行中断。您应该查找attachInterrupt()的引用。处理器将在您注册的事件(“中断”)中执行回调函数(例如,引脚2上的电压从低变为高)。这意味着您将不再需要从主循环中调用readButtons()函数。

答案 1 :(得分:-1)

学习编码的一些最佳方法存在于如何回答这个问题。 我想建议做的是尝试计算代码。请记住,loop()正在创建一个重复的结构。所以我们可以说计算机运行每个循环需要多长时间。当我们有像按钮这样的中断时,如何影响循环中的迭代,并且它是关于如何休息处理器(延迟)的条件。

要求延迟,以便不做什么叫做&#34;旋转&#34;处理器(让处理器尽可能快地完成大量工作以完成任何事情)。但是,请注意代码如何解释我们延迟了多长时间所做的工作? 现在让我们想象一下处理器实际上可以很快地通过该循环多次。记住延迟只有150毫秒不是很多时间。因此,按下一个按钮就可以快速连续地将tempMin从59设置为69并循环几次,而不是一次只增加一个数字。 你在这里有一个学习调试的机会。第一个技巧是确定循环运行得太快还是太慢;你是否得到了所需的功能,最后如果你知道它是否发生得太快或太慢,你可以重新解决问题。 现在,我建议看一下全局变量和有限状态机(即如果你处于按钮状态,不要再接受任何按键按下,直到你重新开始完成你的状态,只有以已知的方式过渡。)