Помогите со скетчем "Кнопочные ковбои "

Тема в разделе "Arduino & Shields", создана пользователем xxEvgeniYxx, 17 фев 2017.

  1. xxEvgeniYxx

    xxEvgeniYxx Нерд

    Помогите пожалуйста со скетчем.Мне надо подключить еще одну тактовую кнопку на любой пин так чтобы она служила стартом , т.е. чтобы при её нажатии был задействован зуммер как в начале скетча и чтобы были открыты пины игроков.Все это для того чтобы не было фальстарта.



    Код (C++):
    #define BUZZER_PIN   12
    #define PLAYER_COUNT 2

    int buttonPins[PLAYER_COUNT] = {3, 13};
    int ledPins[PLAYER_COUNT] = {9, 11};
    void setup()
    {
      pinMode(BUZZER_PIN, OUTPUT);
      for (int player = 0; player < PLAYER_COUNT; ++player) {
     
        pinMode(ledPins[player], OUTPUT);
        pinMode(buttonPins[player], INPUT_PULLUP);
      }
    }
    void loop()
    {
      delay(random(2000, 7000));
      tone(BUZZER_PIN, 3000, 250);
      for (int player = 0; ; player = (player+1) % PLAYER_COUNT) {
        if (!digitalRead(buttonPins[player])) {
       
          digitalWrite(ledPins[player], HIGH);
          tone(BUZZER_PIN, 4000, 1000);
          delay(1000);
          digitalWrite(ledPins[player], LOW);
          break;
        }
      }
    }
     
    Последнее редактирование: 17 фев 2017
  2. ostrov

    ostrov Гуру

    Код в тэг плиз. Слева от кавычек. И автоформатнуть бы сперва.
     
  3. xxEvgeniYxx

    xxEvgeniYxx Нерд

    Код (C++):
    #define BUZZER_PIN   12
    #define PLAYER_COUNT 2

    int buttonPins[PLAYER_COUNT] = {3, 13};
    int ledPins[PLAYER_COUNT] = {9, 11};
    void setup()
    {
      pinMode(BUZZER_PIN, OUTPUT);
      for (int player = 0; player < PLAYER_COUNT; ++player) {
       
        pinMode(ledPins[player], OUTPUT);
        pinMode(buttonPins[player], INPUT_PULLUP);
      }
    }
    void loop()
    {
     
      delay(random(2000, 7000));
      tone(BUZZER_PIN, 3000, 250);
      for (int player = 0; ; player = (player+1) % PLAYER_COUNT) {
     
        if (!digitalRead(buttonPins[player])) {
       
          digitalWrite(ledPins[player], HIGH);
          tone(BUZZER_PIN, 4000, 1000);
          delay(1000);
          digitalWrite(ledPins[player], LOW);
          break;
        }
      }
    }
     
  4. sslobodyan

    sslobodyan Гик

    Если вам именно для игры, то используйте кнопку перезагрузки RESET.
     
  5. ostrov

    ostrov Гуру

    Функция программного резета:
    Код (C++):
    void(* resetFunc) (void) = 0;
    Вызывается так:
    Код (C++):
      resetFunc();
    Посадите ее на кнопку и все будет перезапускаться от ее нажатия.
     
  6. xxEvgeniYxx

    xxEvgeniYxx Нерд

    Мне надо не как кнопка сброса так как он сам сбрасывается через определенное время , а кнопка старта при нажатии которой должен заработать скетч
     
  7. rkit

    rkit Гуру

    На кнопку можно посадить пин reset, а этот способ не обнуляет регистры, говорят.
     
  8. Jedi

    Jedi Гик

    А если совсем просто?
    Добавить третью кнопку для старта и в loop перед первым delay() зациклить скетч, пока кнопка не нажмется (например, как иногда пишут: while (!Serial) { } ).
     
  9. xxEvgeniYxx

    xxEvgeniYxx Нерд

    можешь написать примерно часть этого скетча
     
  10. Jedi

    Jedi Гик

    Вообще-то это задание для самостоятельной работы. Примерно так.
    while (!digitalRead(кнопка старта)) { };

    В логических выражениях принято считать, что ноль это ложь (false), все, что не ноль - истина (true).
    Соответственно от типа кнопки старта (подтянутой или стянутой) и будет зависеть условие этого цикла.