2016-01-23 100 views
2

我一直在做一个小小的温度计项目来学习Arduino,并且有一件恼人的事情,我不知道如何解决。在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

也许你的按钮在延迟期间?尝试删除/减少改进的延迟。或者完全删除延迟做这样的事情https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay – Sush

回答

3

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

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

+0

这确实是我在找的东西。中断!非常感谢你,帮了我很多! – Raiiy

-1

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

延迟是必需的,以便不做所谓的“旋转”处理器(尽可能快地处理处理器以完成无关任务)。但是,请注意代码如何不能改变我们延迟多久的工作? 现在让我们想象一下,处理器实际上可以非常快速地经过一次以上的循环。记住仅延迟150毫秒并不是很多时间。因此,按一下按钮就足以将tempMin从59快速连续设置到69,并循环几次,而不是一次只增加一个数字。 你在这里有什么学习调试的机会。第一个窍门是确定循环运行是否太快或太慢;你是否会得到所需的功能,最后如果你知道它发生得太快还是太慢,你可以重新提出问题。 现在,我建议看看全局变量和有限状态机(例如,如果您处于按钮按下状态,请不要接受任何进一步的按钮按钮,直到完成状态并且只进行了转换以已知的方式)。

+0

这实在是一个非常长的评论,而不是_answer_的问题。请注意其他答案如何提供_specific_建议来解决_specific_问题。在这个答案中有一些有用的建议,但没有任何实际上会直接导致OP到他的问题的实际解决方案。还要注意的是,即使这是对问题的实际答案,如果您花费更多时间进行校对,以避免拼写和语法错误,并避免长时间运行的句子和段落,情况会更好。 –

相关问题