Пожалуйста, помогите с кодом турнирной таблицы.

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

  1. M0ln1a

    M0ln1a Гик

    Решил выполнить проект: счетчик для игр. Цель: при нажатии на кнопку, экран показывает счет; две кнопки.

    Вот код:


    Код (Text):
    #include <LiquidCrystal.h>
    int  PL1  0; // Игрок №1
    int  PL2  0; // Игрок №2
    int  P1  0;
    int  P2  0;
    #define  B1  A0 // Кнопка №1
    #define  B2  A1 // Кнопка №2
    boolean buttonWasUp1 = true;
    boolean buttonWasUp2 = true;
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    void setup()
    {
     
    }

    void loop()
    {
      // Счет первого игрока
    if (buttonWasUp1 && !digitalRead(B1))
    {
        delay(10);
        if (!digitalRead(B1))
          P1 = PL1 + 1
      }
      buttonWasUp1 = digitalRead(B1);
     
      // Счет второго игрока
      if (buttonWasUp2 && !digitalRead(B2))
      {
        delay(10);
        if (!digitalRead(B2))
          P1 = PL2 + 1
      }
      buttonWasUp2 = digitalRead(B2);
     
      // Табло
      lcd.begin(16, 2);
        // печатаем первую строку
        lcd.print("P1  (P1)");
        // устанавливаем курсор в колонку 0, строку 1. То есть на
        // самом деле это вторая строка, т.к. нумерация начинается с нуля
        lcd.setCursor(0, 1);
        // печатаем вторую строку
        lcd.print("P2  (P2)");
    }

    Компилятор выдает ошибку:

    _______________.ino:2:13: error: expected initializer before numeric constant
    _______________.ino:3:13: error: expected initializer before numeric constant
    _______________.ino:4:12: error: expected initializer before numeric constant
    _______________.ino:5:12: error: expected initializer before numeric constant
    _______________.ino: In function 'void loop()':
    _______________.ino:23:7: error: 'P1' was not declared in this scope
    _______________.ino:23:12: error: 'PL1' was not declared in this scope
    _______________.ino:24:3: error: expected ';' before '}' token
    _______________.ino:32:7: error: 'P1' was not declared in this scope
    _______________.ino:32:12: error: 'PL2' was not declared in this scope
    _______________.ino:33:3: error: expected ';' before '}' token
    Ошибка компиляции.



    Как это можно исправить?
     
  2. X-Dron

    X-Dron Гик

    int PL1 =0; // Игрок №1
    int PL2 =0; // Игрок №2
    int P1 =0;
    int P2 =0;
     
  3. M0ln1a

    M0ln1a Гик

  4. geher

    geher Гуру

    строка 2
    int PL1 0; // Игрок №1
    Тут текст сообщения об ошибке с моей точки зрения несколько неадекватен, но суть в том, что при объявлении переменной с инициализацией должен использоваться оператор =, т.е. это должно выглядеть так:
    int PL1 = 0; // Игрок №1

    следующие три строки аналогично.

    строка 23
    Ошибки наведены предыдущей ошибкой в строках 2 и 4, поскольку в результате ошибки в строках 2 и 4 переменные P1 и PL1 оказались не объявлены, на что компилятор своим сообщением ненавязчиво как бы (кагбэ?) намекает.

    строка 32 аналогично

    строки 24 и 33. Сообщение об ошибке на чистом англицком сообщает, что отсутствует символ ';' после оператора. Правда компилятор своим сообщением ориентирует на следующую за оператором закрывающую фигурную скобку, перед которой он означенный символ ';' не находит, но по сути это то же самое.
     
    Последнее редактирование: 21 мар 2015
    M0ln1a нравится это.
  5. X-Dron

    X-Dron Гик

    Глаза протри
     
  6. vvr

    vvr Инженерище

    да и в сетапе нужна инициация дисплея
    lcd.begin(16,2);
     
  7. M0ln1a

    M0ln1a Гик

    Огромное вам спасибо!
     
  8. M0ln1a

    M0ln1a Гик

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

    А то он мне так и пишет...
     
  9. vvr

    vvr Инженерище

    советую на WIKI почитать примеры, многое почерпнёшь полезного:)
     
  10. M0ln1a

    M0ln1a Гик

    Спасибо за совет!
     
  11. geher

    geher Гуру

    Нескромный вопрос. А как оно должно выводиться?
    Ардуина - это очень маленький компьютер.
    И как всякий компьютер он четко выполняет директивы, которые написаны в программе в соответствии со смыслом, заложенным в эти директивы в соответствии с языком программирования.
    lcd.print("P1 (P1)"); предписывает ардуине вывести на экран строку P1 (P1), поскольку именно такое поведение описано в функции (точнее, если следовать устоявшейся терминологии, методе) print класса, к которому относится переменная lcd.
    Абсолютно логично, что он так и поступает.
    Если необходимо вывести текст и рядом с ним значение, то нужно последовательно вывести сначала одно, а потом другое.
    Например,
    lcd.print(P1);
    lcd.print(" (P1)");
    Это означает, что сначала будет выведено содержимое переменной P1, а потом текст " (P1)".
    Причем, поскольку переменная целочисленного типа, первой из данных директив будет выведено текстовое представление числа, хранящегося в переменной, переданной в параметре.

    Возможны и другие варианты с использованием других директив.
    Также есть еще ряд тонкостей, связанных с тем, что строковое представление числа может занимать разное количество знакомест экрана ЖК дисплея. Но это уже отдельная история.
     
    M0ln1a нравится это.
  12. M0ln1a

    M0ln1a Гик

    1) Я так уже сделал.
    2) У меня не должны появляться скобки (я реально ошибся)
    3) у меня выходит какая-то белиберда:
    а. Значения выписываются ко второму игроку
    б. Значения ограничены (при нажатии на кнопку появляется 1, и не изменяется до перезагрузки платы)
    в. На P2 пишется 3 ноля, при этом кнопки отвечают за две цифры с ошибкой (см б.)
    4) Мой новый код:


    #include <LiquidCrystal.h>
    int PL1 = 0; // Игрок №1
    int PL2 = 0; // Игрок №2
    int P1 = 0;
    int P2 = 0;
    #define B1 A0 // Кнопка №1
    #define B2 A1 // Кнопка №2
    boolean buttonWasUp1 = true;
    boolean buttonWasUp2 = true;
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    void setup()
    {
    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 = (PL1 + 1) % 10;;
    }
    buttonWasUp1 = digitalRead(B1);
    // Счет второго игрока
    if (buttonWasUp2 && !digitalRead(B2))
    {
    delay(10);
    if (!digitalRead(B2))
    P2 = (PL2 + 1) % 10;;
    }
    buttonWasUp2 = digitalRead(B2);


    lcd.print(P1);
    lcd.setCursor(2, 1);
    lcd.print(P2);
    }
     
  13. M0ln1a

    M0ln1a Гик

    3) б. Исправлено
     
  14. M0ln1a

    M0ln1a Гик

    Получилось!!!!!!!:):):)
    Всем огромное спасибо за советы!