我一直在做一个小温度计项目来学习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
答案 0 :(得分:3)
正如其他人在此处指出的那样,按下按钮可能不会在您使用digitalRead(btBuzzer)
查询引脚的同时发生。这类问题就是为所谓的“中断”而发明的,它允许您响应在您不监视感兴趣的引脚时可能发生的事件。
例如,Arduino UNO R3允许在引脚2和3上进行中断。您应该查找attachInterrupt()的引用。处理器将在您注册的事件(“中断”)中执行回调函数(例如,引脚2上的电压从低变为高)。这意味着您将不再需要从主循环中调用readButtons()
函数。
答案 1 :(得分:-1)
学习编码的一些最佳方法存在于如何回答这个问题。 我想建议做的是尝试计算代码。请记住,loop()正在创建一个重复的结构。所以我们可以说计算机运行每个循环需要多长时间。当我们有像按钮这样的中断时,如何影响循环中的迭代,并且它是关于如何休息处理器(延迟)的条件。
要求延迟,以便不做什么叫做&#34;旋转&#34;处理器(让处理器尽可能快地完成大量工作以完成任何事情)。但是,请注意代码如何解释我们延迟了多长时间所做的工作? 现在让我们想象一下处理器实际上可以很快地通过该循环多次。记住延迟只有150毫秒不是很多时间。因此,按下一个按钮就可以快速连续地将tempMin从59设置为69并循环几次,而不是一次只增加一个数字。 你在这里有一个学习调试的机会。第一个技巧是确定循环运行得太快还是太慢;你是否得到了所需的功能,最后如果你知道它是否发生得太快或太慢,你可以重新解决问题。 现在,我建议看一下全局变量和有限状态机(即如果你处于按钮状态,不要再接受任何按键按下,直到你重新开始完成你的状态,只有以已知的方式过渡。)