2016-01-23 27 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到他的問題的實際解決方案。還要注意的是,即使這是對問題的實際答案,如果您花費更多時間進行校對,以避免拼寫和語法錯誤,並避免長時間運行的句子和段落,情況會更好。 –