Пожалуйста, помогите дописать код!

Тема в разделе "Arduino & Shields", создана пользователем M0ln1a, 22 мар 2015.

  1. M0ln1a

    M0ln1a Гик

    В прошлый раз спрашивал про счетчик (вот ссылка http://forum.amperka.ru/threads/Пожалуйста-помогите-с-кодом-турнирной-таблицы.4687/). Теперь хочется дополнить код, чтобы было три режима:
    1) Игра до 9-ти очков
    2) Игра до 21-го очка
    3) Бесконечный режим (без ограничений).
    Режимы переключаются при нажатии на кнопку или три кнопки (если так проще). Желательно бы было иметь 3-ёх секундное показание режима на экране.
    Также хотелось бы иметь световую (два светодиода, которые показывают победителя) и звуковую индикацию при 1-ом и 2-ом режимах.
    Пробовал сам, но не получилось (плохо пользуюсь выражением if).
    Помогите пожалуйста! Заранее спасибо!
     
  2. vvr

    vvr Инженерище

    Давай показывай свои изыскания-будем помогать:)
    Или по твоему описанию программку нужно написать...
     
  3. M0ln1a

    M0ln1a Гик

    Вот код:

    Код (Text):
    #include <LiquidCrystal.h>  // Библиотека LCD

    int  P1 =  0; // Счёт первого игрока
    int  P2 =  0; // Счет второго игрока
    int backLight = 9;
    #define  B1  A0 // Кнопка №1
    #define  B2  A1 // Кнопка №2

    boolean buttonWasUp1 = true;
    boolean buttonWasUp2 = true;
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);  // Пины экрана
    void setup()
    {
      pinMode(1, OUTPUT);
      pinMode(2, OUTPUT);
      pinMode(backLight, OUTPUT);
      pinMode(3, OUTPUT);
          digitalWrite(backLight, HIGH);
      lcd.begin(16, 2);
        // печатаем первую строку
      lcd.print("P1");
     
        // устанавливаем курсор в колонку 0, строку 1. То есть на
        // самом деле это вторая строка, т.к. нумерация начинается с нуля
        lcd.setCursor(0, 1);
        // печатаем вторую строку
        lcd.print("P2");

    }

    void loop()
    {
      // Счет первого игрока
    if (buttonWasUp1 && !digitalRead(B1))
    {
        delay(10);
        if (!digitalRead(B1))
          P1 = P1 + 1;  // Алгоритм добавления счета № 1
      }
      buttonWasUp1 = digitalRead(B1);

      // Счет второго игрока
      if (buttonWasUp2 && !digitalRead(B2))
      {
        delay(10);
        if (!digitalRead(B2))
          P2 = P2 + 1;  // Алгоритм добавления счета № 2
      }
      buttonWasUp2 = digitalRead(B2);

      lcd.setCursor(4, 1);
      lcd.print(P1);  // Печать переменного счета
      lcd.setCursor(4, 0);
      lcd.print(P2);  // Тоже самое

    }

    Устройство проекта:
    1) Две Troyka кнопки - Добавляют к счету очко
    2) Текстовый экран 16 на 2 - Показывают счёт (Пока только бесконечный)
    3) Arduino UNO - Без комментариев
    4) Пьезо-пищалка - Пищит при победе (виды указаны в теме) В КОДЕ НЕ УКАЗАН
    5) Два светодиода - Светятся при победе (светящийся светодиод показывает выигравшего) В КОДЕ НЕ УКАЗАНЫ
    6) Провода - Без комментариев
    7) BreadBoard Half - Думаю вы знаете зачем
    8) Troyka Shield - Подключает кнопки
    9) Перемычки - Без комментариев
    10) Кнопки - Переключают режимы счёта В КОДЕ НЕ УКАЗАНЫ


    И ещё, хочется сделать подсветку экрана, но не получается. Раньше делал управляемую с потенциометра, а вчера не заработало.
    Я думаю, что всё описал подробно... даже слишком ;).
    Поможете???
     
    Последнее редактирование: 23 мар 2015
  4. M0ln1a

    M0ln1a Гик

    Что ещё указать?
     
  5. vvr

    vvr Инженерище

    сразу бросилось в глаза - в сетапе не указал режим работы пинов кнопок на вход
    когда публикуешь код форматируй его Ctrl + T
    или активней применяй комментарии или используй в коде понятные названия переменных - knopka понятно, а P1 нифига не понятно.

    правильно сформулированный вопрос - половина успеха.
    продумай и распиши алгоритм работы своей программы
     
  6. M0ln1a

    M0ln1a Гик

    Так понятнее?
    P.S. B1/2 - Button (Кнопка), а P1/2 - Player (Игрок)
    Я код отредактировал...
     
    Последнее редактирование: 23 мар 2015
  7. vvr

    vvr Инженерище

    настаивать на своём мнении не буду, пиши что хочешь и как хочешь
     
  8. M0ln1a

    M0ln1a Гик

    А что ещё поменять в коде??? И как его изменить для нововведений? Просто это мой первый личный проект (Своя идея, схема и код (Который мне помогли дополнить некоторые люди)), и я не знаю что мне нужно сделать... Помогите пожалуйста! Я лишь хочу понять, что мне надо выполнить для вышеуказанных целей, так как после многих попыток у меня ничего не работало...
     
  9. M0ln1a

    M0ln1a Гик

    Поможете?????? Я ведь выполнил ваши просьбы, если вы посмотрите на код, который я записывал в начале вы увидите все описания (Может вы не заметили?). Я про это и писал в сообщении: "Так понятнее? Р.S. .......".
     
    Последнее редактирование: 23 мар 2015
  10. vvr

    vvr Инженерище

    вы наверно не внимательно читаете что вам пишут
    повторю ещё раз


    сразу бросилось в глаза - в сетапе не указал режим работы пинов кнопок на вход
    когда публикуешь код форматируй его Ctrl + T
    или активней применяй комментарии или используй в коде понятные названия переменных - knopka понятно, а P1 нифига не понятно.

    правильно сформулированный вопрос - половина успеха.
    продумай и распиши алгоритм работы своей программы


    упёртость и невнимательность не лучшие черты:)
     
  11. M0ln1a

    M0ln1a Гик

    Думаю так будет понятнее... Если я опять что-то неправильно сделал, то скажите пожалуйста, постараюсь исправить!

    Код (Text):

    // ОБНОВЛЁННАЯ ВЕРСИЯ КОДА:
    // 1) Добавлены комментарии
    // 2) Код отформатирован
    // 3) Имена переменных изменены
    //    P -> Player;  B -> Button.


    #include <LiquidCrystal.h>

    int   Player1 =  0;  // Игрок №1
    int   Player2 =  0;  // Игрок №2
    int backLight = 9;
    #define  Button1   A0 // Кнопка №1
    #define  Button2   A1 // Кнопка №2

    boolean buttonWasUp1 = true;
    boolean buttonWasUp2 = true;
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    void setup()
    {
      pinMode(1, OUTPUT);
      pinMode(2, OUTPUT);
      pinMode(backLight, OUTPUT);
      pinMode(3, OUTPUT);

      digitalWrite(backLight, HIGH);
      lcd.begin(16, 2); // Кочесво строк и столбцов на экране
      // печатаем первую строку
      lcd.print("P1");

      // устанавливаем курсор в колонку 0, строку 1. То есть на
      // самом деле это вторая строка, т.к. нумерация начинается с нуля
      lcd.setCursor(0, 1);
      // печатаем вторую строку
      lcd.print("P2");

    }

    void loop()
    {
      // Счет первого игрока
      if (buttonWasUp1 && !digitalRead(Button1))
      {
        delay(10);
        if (!digitalRead(Button1))  // Если кнопка зажата...
          Player1 = Player1 + 1;    // Добавляем к переменной 1 очко
      }
      buttonWasUp1 = digitalRead(Button1);

      // Счет второго игрока
      if (buttonWasUp2 && !digitalRead(Button2))
      {
        delay(10);
        if (!digitalRead(Button2))  // Аналогично
          Player2 = Player2 + 1;    // И это ...
      }
      buttonWasUp2 = digitalRead(Button2);

      lcd.setCursor(4, 1); // Курсор
      lcd.print(Player1); // Экран вводит переменную Player1
      lcd.setCursor(4, 0); // Курсор
      lcd.print(Player2); // Экран вводит переменную Player2

    }

     
    Поможете?
     
  12. M0ln1a

    M0ln1a Гик

    А насчёт кнопок, я же писал, про то что я использую Troyka модули и шилд для них. В коде давным давно было написано:

    #define Button1 A0 // Кнопка №1
    #define Button2 A1 // Кнопка №2

    Зачем писать про них в сетапе, или это обязательное действие?
    У меня они и так работают :)!
     
  13. vvr

    vvr Инженерище

    Код (Text):
    #include <LiquidCrystal.h>      // Библиотека LCD

    int  P1 =  0;                  // Счёт первого игрока
    int  P2 =  0;                  // Счет второго игрока
    int backLight = 9;
    #define  B1  A0                // Кнопка №1
    #define  B2  A1                // Кнопка №2

    boolean buttonWasUp1 = true;
    boolean buttonWasUp2 = true;
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);  // Пины экрана

    void setup()
    {
      pinMode(B1, INPUT);
      pinMode(B2, INPUT);
      pinMode(backLight, OUTPUT);

      digitalWrite(backLight, HIGH);
      lcd.begin(16, 2);
      lcd.setCursor(0, 0);  
      lcd.print("P1");
      lcd.setCursor(0, 1);
      lcd.print("P2");

    }

    void loop()
    {
      if (buttonWasUp1 && !digitalRead(B1))    // Счет первого игрока
      {
        delay(10);
        if (!digitalRead(B1))
          P1 = P1 + 1;                          // Алгоритм добавления счета № 1
      }
      buttonWasUp1 = digitalRead(B1);          // Счет второго игрока

      if (buttonWasUp2 && !digitalRead(B2))
      {
        delay(10);
        if (!digitalRead(B2))
          P2 = P2 + 1;                          // Алгоритм добавления счета № 2
      }
      buttonWasUp2 = digitalRead(B2);

      lcd.setCursor(4, 0);                      // Печать счета 1 игрока
      lcd.print(P1);
      lcd.setCursor(4, 1);
      lcd.print(P2);                            // Печать счета 2 игрока
    }


     
     
  14. vvr

    vvr Инженерище

    хочешь три режима переключаемых кнопкой - давай добавляй кнопку в код и будем дальше работать
     
  15. M0ln1a

    M0ln1a Гик

    А как лучше (проще) - одну кнопку, или три?
     
  16. vvr

    vvr Инженерище

    проверяй

    Код (Text):
    #include <LiquidCrystal.h>                // Библиотека LCD
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);  // Пины экрана

    #define  B1  A0                // Кнопка №1
    #define  B2  A1                // Кнопка №2
    #define  B3  A2                // Кнопка режимов

    int  P1 =  0;                  // Счёт первого игрока
    int  P2 =  0;                  // Счет второго игрока
    int backLight = 9;


    boolean buttonWasUp1 = true;
    boolean buttonWasUp2 = true;

    byte regim = 1;
    byte flag = 0;

    void setup()
    {
      pinMode(B1, INPUT);
      pinMode(B2, INPUT);
      pinMode(B3, INPUT);       // кнопка режимов игры
      pinMode(backLight, OUTPUT);
      digitalWrite(backLight, HIGH);
      lcd.begin(16, 2);
      lcd.clear();                          //  очищаем дисплей
      lcd.setCursor(0, 0);
      lcd.print("R  P1");
      lcd.setCursor(3, 1);
      lcd.print("P2");

    }

    void loop()
    {
      if (buttonWasUp1 && !digitalRead(B1))    // Счет первого игрока
      {
        delay(10);
        if (!digitalRead(B1))
          P1 = P1 + 1;                          // Алгоритм добавления счета № 1
      }
      buttonWasUp1 = digitalRead(B1);          // Счет второго игрока

      if (buttonWasUp2 && !digitalRead(B2))
      {
        delay(10);
        if (!digitalRead(B2))
          P2 = P2 + 1;                          // Алгоритм добавления счета № 2
      }
      buttonWasUp2 = digitalRead(B2);

      lcd.setCursor(6, 0);                      // Печать счета 1 игрока
      lcd.print(P1);
      lcd.setCursor(6, 1);
      lcd.print(P2);                            // Печать счета 2 игрока

      if(digitalRead(B3) == HIGH && flag == 0) // обработка кнопки режимов
      {
        regim++;
        flag = 1;
        lcd.setCursor(0, 1);                    // какой сейчас режим
        lcd.print(regim);
        if(regim > 3)
        {
          regim = 1;
        }
      }    
      if(digitalRead(B3) == LOW && flag == 1)
      {
        flag = 0;
      }
    }



     
     
    Последнее редактирование: 24 мар 2015
  17. vvr

    vvr Инженерище

    три режима
    проверь с дисплеем

    Код (Text):

    ///////////  1 режим бесконечный
    ///////////  2 режим 9 очков
    ///////////  3 режим 21 очко




    #include <LiquidCrystal.h>                // Библиотека LCD
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);  // Пины экрана

    #define  B1  A0                // Кнопка №1
    #define  B2  A1                // Кнопка №2
    #define  B3  A2                // Кнопка режимов

    int  P1 =  0;                  // Счёт первого игрока
    int  P2 =  0;                  // Счет второго игрока
    int backLight = 9;


    boolean buttonWasUp1 = true;
    boolean buttonWasUp2 = true;

    byte regim = 1;
    byte flag = 0;

    void setup()
    {
      pinMode(B1, INPUT);
      pinMode(B2, INPUT);
      pinMode(B3, INPUT);
      pinMode(backLight, OUTPUT);
      digitalWrite(backLight, HIGH);
      lcd.begin(16, 2);
      lcd.clear();                          //  очищаем дисплей
      lcd.setCursor(0, 0);
      lcd.print("R  P1");
      lcd.setCursor(3, 1);
      lcd.print("P2");

    }

    void loop()
    {
      if (buttonWasUp1 && !digitalRead(B1))    // Счет первого игрока
      {
        delay(10);
        if (!digitalRead(B1))
          P1 = P1 + 1;                          // Алгоритм добавления счета № 1
        if(P1 >= 9 &&  regim == 2 &&  P1 > P2)
        {
          lcd.setCursor(10, 0);                
          lcd.print("Game");
          lcd.setCursor(10, 1);
          lcd.print("Over");
          delay(3000);
          P1 =  0;
          P2 =  0;
          lcd.setCursor(10, 0);                  
          lcd.print("    ");
          lcd.setCursor(10, 1);
          lcd.print("   ");
        }
        if(P1 >= 21 &&  regim == 3 &&  P1 > P2)
        {
          lcd.setCursor(10, 0);                
          lcd.print("Game");
          lcd.setCursor(10, 1);
          lcd.print("Over");
          delay(3000);
          P1 =  0;
          P2 =  0;
          lcd.setCursor(10, 0);                  
          lcd.print("    ");
          lcd.setCursor(10, 1);
          lcd.print("   ");
        }
      }
      buttonWasUp1 = digitalRead(B1);          // Счет второго игрока

      if (buttonWasUp2 && !digitalRead(B2))
      {
        delay(10);
        if (!digitalRead(B2))
          P2 = P2 + 1;                          // Алгоритм добавления счета № 2
        if(P2 >= 9 &&  regim == 2 &&  P2 > P1)
        {
          lcd.setCursor(10, 0);                
          lcd.print("Game");
          lcd.setCursor(10, 1);
          lcd.print("Over");
          delay(3000);
          P1 =  0;
          P2 =  0;
          lcd.setCursor(10, 0);                  
          lcd.print("    ");
          lcd.setCursor(10, 1);
          lcd.print("   ");
        }
        if(P2 >= 21 &&  regim == 3 &&  P2 > P1)
        {
          lcd.setCursor(10, 0);                
          lcd.print("Game");
          lcd.setCursor(10, 1);
          lcd.print("Over");
          delay(3000);
          P1 =  0;
          P2 =  0;
          lcd.setCursor(10, 0);                  
          lcd.print("    ");
          lcd.setCursor(10, 1);
          lcd.print("   ");
        }
      }
      buttonWasUp2 = digitalRead(B2);

      lcd.setCursor(6, 0);                      // Печать счета 1 игрока
      lcd.print(P1);
      lcd.setCursor(6, 1);
      lcd.print(P2);                            // Печать счета 2 игрока

      if(digitalRead(B3) == HIGH && flag == 0) // обработка кнопки режимов
      {
        regim++;
        flag = 1;
        lcd.setCursor(0, 1);                    // како сейчас режим
        lcd.print(regim);
        if(regim > 3)
        {
          regim = 1;
        }
      }    
      if(digitalRead(B3) == LOW && flag == 1)
      {
        flag = 0;
      }
    }







     
     
    Последнее редактирование: 24 мар 2015
  18. M0ln1a

    M0ln1a Гик

    Спасибо, но код чуточку неправильный:
    1) Появляется странный R4 (режим №4)
    2) Кнопка виснет (Сам не знаю почему (Меняется с 3-его на 4-ый режимы, и то редко))
    3) Game Over появляется при 35 очках
    4) После Game Over счет добавляется так : одно нажатие = 10 очкам до 105 очков
    Больше пока ничего не замечал...
     
  19. vvr

    vvr Инженерище

  20. M0ln1a

    M0ln1a Гик

    Работает либо бесконечный, либо до 21 (Ошибки устранены). Новое:
    1) Не работает режим до 9-ти (иногда работает)
    2) (Незначительно) После победы числа идут так: 10 20 30 40 50 60 70 80 90 Game Over (Режим 2) Причём происходят и глюки (не пишет 90, другие вариации счёта и т.д.)

    Мне кажется, что лучше убрать возможность стирания счёта автоматически (использовать кнопку Reset на плате), но поставить пол-секундное звуковое сопровождение зуммера + горение светодиода, символизирующего выигрывавшего.
    Пины:
    Зуммер 8
    Светодиод №1 6
    А №2 7
    Просто я уже собрал эту схему на макетке.
    Можно так сделать? Сразу избавимся от нескольких недочётов :)!!!