2013-12-19 4 views
-1

Я пытаюсь сделать простую игру Arduino, которая отслеживает количество нажатий на кнопку. Есть две кнопки: по одному для каждого пользователя, и тот, кто ближе всего к случайному числу, которое выбирает Ардуино, выигрывает. «Победа» - это свет, который появляется рядом с кнопкой winers. Тем не менее, я застрял в том, что кажется колесом - прежде чем я пойду дальше, я расскажу, что мне всего две недели на всю среду arduino/C++, поэтому мои знания довольно низки.Структуры управления не дают мне

В принципе, я хочу, чтобы игра длилась определенное количество времени, скажем 5 секунд, а затем через пять секунд все нажатия кнопок подсчитываются и сравниваются, и выбирается победитель. Затем игра сбрасывается, и мы можем играть снова. Там, где я застрял, есть функция синхронизации. Первоначально я вычитал переменную gameClock из функции millis(), однако я прочитал, что неверно использовать функцию 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 на помощь в этом материале. Есть целый архив знаний, плюс много людей, у которых много опыта ардуинов.

В вашем эскизе есть 3 проблемы. Во-первых, как вы сказали, gameClock не работает так, как вы этого хотите. Просто использование счетчика не собирается сокращать его, даже при только 16 МГц, ардуино собирается закрепить его через него намного меньше, чем за 5 секунд. Вам нужно на самом деле это время.

Во-вторых, ваша кнопка «debouncing» нарушена. Кнопки Debouncing на самом деле довольно сложны. К счастью, многие люди уже решили проблему. Проверьте библиотеки arduino, форум и площадку. Проблема здесь в том, что вы никогда не устанавливаете переменные lastDebounceTime на что-либо.

Наконец, ваш эскиз только читает кнопки один раз за игру. Это отбрасывает все остальное. Он убивает ваше debouncing и messes вверх по счетчику нажатия кнопки.

Теперь я остановлюсь, чтобы дать вам возможность поработать. Отправьте еще один комментарий, если вам нужна дополнительная помощь.

+0

Извините за такой отложенный ответ, все увлекся праздниками. :) Итак, я обновил свой код, чтобы использовать библиотеку «Bounce», найденную на сайте arduino. Насколько мне известно, он функционирует должным образом. Я знаю, что я действительно не дал четкого ответа на вопрос о том, в чем именно мне нужна помощь, поэтому вот что мне нужно. Мне нужно иметь возможность эффективно создавать «gameClock», который устанавливает время для игры. По истечении времени счетчики кнопок сбрасываются, и мы можем снова играть. Я обновил свой код выше. –

+0

Намного лучше. Теперь мы можем сосредоточиться на первоначальном вопросе. Я не собираюсь писать код для вас. Когда игра начинается, прочитайте и сохраните значение millis() как время начала. Чтобы узнать, закончилась ли игра, вычтите время начала из millis(), а затем сравните время игры. –

Смежные вопросы