Решил выполнить проект: счетчик для игр. Цель: при нажатии на кнопку, экран показывает счет; две кнопки. Вот код: Код (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 int PL1 0; // Игрок №1 Тут текст сообщения об ошибке с моей точки зрения несколько неадекватен, но суть в том, что при объявлении переменной с инициализацией должен использоваться оператор =, т.е. это должно выглядеть так: int PL1 = 0; // Игрок №1 следующие три строки аналогично. строка 23 Ошибки наведены предыдущей ошибкой в строках 2 и 4, поскольку в результате ошибки в строках 2 и 4 переменные P1 и PL1 оказались не объявлены, на что компилятор своим сообщением ненавязчиво как бы (кагбэ?) намекает. строка 32 аналогично строки 24 и 33. Сообщение об ошибке на чистом англицком сообщает, что отсутствует символ ';' после оператора. Правда компилятор своим сообщением ориентирует на следующую за оператором закрывающую фигурную скобку, перед которой он означенный символ ';' не находит, но по сути это то же самое.
А как можно исправить эту часть: lcd.print("P1 (P1)"); // устанавливаем курсор в колонку 0, строку 1. То есть на // самом деле это вторая строка, т.к. нумерация начинается с нуля lcd.setCursor(0, 1); // печатаем вторую строку lcd.print("P2 (P2)"); А то он мне так и пишет...
Нескромный вопрос. А как оно должно выводиться? Ардуина - это очень маленький компьютер. И как всякий компьютер он четко выполняет директивы, которые написаны в программе в соответствии со смыслом, заложенным в эти директивы в соответствии с языком программирования. lcd.print("P1 (P1)"); предписывает ардуине вывести на экран строку P1 (P1), поскольку именно такое поведение описано в функции (точнее, если следовать устоявшейся терминологии, методе) print класса, к которому относится переменная lcd. Абсолютно логично, что он так и поступает. Если необходимо вывести текст и рядом с ним значение, то нужно последовательно вывести сначала одно, а потом другое. Например, lcd.print(P1); lcd.print(" (P1)"); Это означает, что сначала будет выведено содержимое переменной P1, а потом текст " (P1)". Причем, поскольку переменная целочисленного типа, первой из данных директив будет выведено текстовое представление числа, хранящегося в переменной, переданной в параметре. Возможны и другие варианты с использованием других директив. Также есть еще ряд тонкостей, связанных с тем, что строковое представление числа может занимать разное количество знакомест экрана ЖК дисплея. Но это уже отдельная история.
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); }