2013-12-19 91 views
-1

我想做一個簡單的Arduino遊戲,跟蹤按鈕被按下的次數。有兩個按鈕,每個用戶一個,最接近Arduino挑選的隨機數的任何人都會贏。 「獲勝」是一個燈光旁邊的winers按鈕。然而,我陷入了一種看起來很尷尬的狀態 - 在我走得更遠之前,我會泄露說,我只有兩週時間進入整個arduino/C++環境,所以我的知識水平很低。控制結構正在讓我失望

基本上我想要發生的是遊戲持續一定的時間,讓我們說5秒鐘,然後在5秒鐘後,所有的按鈕推動被記錄和比較,並獲得勝利者。然後遊戲重新開始,我們可以再次玩。我陷入困境的地方在於計時功能。我原本是從millis()函數中減去一個gameClock變量,但是我已經讀到重置millis()函數是不好的做法。也許我的代碼會讓你更好地理解我正在努力完成的事情。

#include <Bounce.h> 
    //Using Arduino UNO 
    #define RBUTTON 2 
    #define RRLED 3 
    #define RGLED 4 
    #define MBLED 5 
    #define LGLED 6 
    #define RLLED 7 
    #define LBUTTON 8 

    Bounce BounceR = Bounce(RBUTTON, 5); 
    Bounce BounceL = Bounce(LBUTTON, 5); 

    int lastStateR = 0; 
    int lastStateL = 0; 
    int switchLCount = 0; 
    int switchRCount = 0; 
    long gameClock = 5000; 

    void setup() {    
    //LED from left to right 
    pinMode(RBUTTON, INPUT); 
    pinMode(RRLED, OUTPUT); //Red 
    pinMode(RGLED, OUTPUT); //Green 
    pinMode(MBLED, OUTPUT); //Blue 
    pinMode(LGLED, OUTPUT); //Green 
    pinMode(RLLED, OUTPUT); //Red 
    pinMode(LBUTTON, INPUT); 
    Serial.begin(9600); 

    } 

    void loop() { 
    BounceR.update(); 
    BounceL.update(); 
    int total = switchRCount + switchLCount; 


    int valueR = BounceR.read(); 
    int valueL = BounceL.read(); 


if (valueL != lastStateL) { 
    if (valueL == HIGH) {  
     switchLCount++; 
     Serial.print("Left button:"); 
     Serial.println(switchLCount); 
     Serial.print("Total: "); 
     Serial.println(total);  
    } 
} 
    lastStateL = valueL; 

if (valueR != lastStateR) { 
    if (valueR == HIGH) { 
     switchRCount++; 
     Serial.print("Right button: "); 
     Serial.println(switchRCount); 
     Serial.print("Total: "); 
     Serial.println(total); 

    } 
} 
    lastStateR = valueR; 

    } 
+1

你需要問一個實際的問題。 – JBentley

+1

以下列格式詢問您的問題很有幫助。 「我想做'X',我嘗試了'Y',但是當我跑步時,我看到'Z'。我應該怎樣做才能看到'X'?」 – Bill

+0

哇,Arduino的問題不是關於正確使用串口。仍然是基本的循環問題,只有在進入循環時才能讀取按鈕狀態。然後再次循環,而無需更新狀態。所以你永遠不會看到按鈕被按下。 –

回答

3

你真的應該看看arduino.cc論壇尋求這方面的幫助。有一個完整的知識檔案,加上很多有arduino經驗的人。

你的素描基本上有3個問題。首先,如你所說,gameClock並不像你想要的那樣工作。僅僅使用一個計數器並不會削減它,即使只有16Mhz,arduino也會在5秒鐘內完成正確的壓縮。你需要實際計時。

其次,你的按鈕'debouncing'壞了。刪除按鈕實際上非常棘手。幸運的是,許多人已經解決了這個問題。檢查arduino圖書館,論壇和遊樂場。這裏的問題是,你從來沒有把lastDebounceTime變量設置爲任何東西。

最後,你的草圖每次只讀取一次按鈕。這拋出了一切。它會殺死你的反彈,並使按鈕按下計數。

我現在停下來給你一個解決的機會。如果您需要更多幫助,請發表其他評論。

+0

對不起,這樣一個延遲的反應,讓所有的假期都被帶走了。 :)所以我更新了我的代碼以利用arduino網站上的「Bounce」庫。據我所知,它運作正常。我知道我並沒有給出明確的答案,因爲我確實需要幫助,所以這裏是我需要的。我需要能夠有效地創建一個設置遊戲時間的「gameClock」。一旦時間到了,按鈕計數器被重置,我們可以再次播放。我上面更新了我的代碼。 –

+0

好多了。現在我們可以專注於原始問題。我不會爲你寫代碼。當遊戲開始時,讀取並存儲millis()的值作爲開始時間。要查看遊戲是否結束,請從millis()中減去開始時間,然後與遊戲時間進行比較。 –