L1 не объявлен в этой ошибке области
У меня есть проект, в котором мне нужно управлять двигателем постоянного тока. Целью этого кода является то, что каждый раз, когда вы нажимаете кнопку, направление вращения двигателя меняется.
Я получаю сообщение об ошибке только о том, что L1 (а также L2, R1 и R2) не объявлены в этой области. место в петле. Как определить переменные, чтобы код работал?
int Motorforward = 10; // MotorDirectionPin установлен на контакт 10
int Motorbackward = 11; // MotorDirectionPin установлен на контакт 11
const int button1Pin = 2; //кнопка управления установлена на контакт 2
int state = L1;
int state = L2;
int state = R1;
int state = R2;
int button1State; // текущее чтение с входного контакта
int previous = LOW; //предыдущее чтение с входного контакта
char input;
void setup(){
pinMode(button1Pin, INPUT); //устанавливаем вывод в качестве входа
Serial.begin(9600);
pinMode(Motorforward, OUTPUT); // устанавливаем вывод как выход
pinMode(Motorbackward, OUTPUT);
}
void loop(){
button1State = digitalRead(button1Pin);
input = button1State;
switch(state){
case L1:
if (state == L1){
if (button1State == HIGH){
state == L2;
}
}
break;
case L2:
if (state == L2){
if (button1State == LOW){
state == R1;
}
}
break;
case R1:
if (state == R1){
if (button1State == HIGH){
state == R2;
}
}
break;
case R2:
if (state == R2){
if (button1State == LOW){
state == L1;
}
}
break;
}
2 ответа
Лучший ответ:
У меня такое ощущение, что вам нужно только одно состояние, которое может иметь 4 значения: L1, L2, R1 или R2.
Для этого используйте перечисление:
enum EState { L1, L2, R1, R2 };
Теперь создайте одну переменную состояния этого типа и присвойте ей начальное значение.
EState state = L1;
Еще несколько проблем, которые я вижу на первый взгляд:
case L1:
if (state == L1){
if (button1State == HIGH){
state == L2;
}
}
break;
Если в этом операторе присутствует case L1
, это означает, что следующий за ним код (до разрыва) обрабатывается только тогда, когда состояние (из-за switch(state)
) это L1, поэтому вы можете убрать проверку if (state == L1)
. Осталось:
case L1:
if (button1State == HIGH)
{
state == L2;
}
break;
Тогда вы используете state == L2
для установки нового состояния. Однако ==
сравнивает только два значения. Если вы хотите его присвоить, вам нужно использовать один =
, поэтому код должен быть следующим:
case L1:
if (button1State == HIGH)
{
state = L2;
}
break;
Разумеется, вам придется сделать то же самое и для других операторов case.
Совет: выровняйте код (выровняйте { и } друг под другом; это значительно улучшит читаемость вашего кода.
Вы не определили L1, L2, R1 или R2. Вы также четыре раза переопределяете переменную int state.
Попробуйте заменить:
int state = L1;
int state = L2;
int state = R1;
int state = R2;
Что-то вроде:
#define L1 1
#define L2 2
#define R1 3
#define R2 4
int state = R2;
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Сколько переменных состояния вам нужно?! И это совершенно правильно. Ни в коем случае вы никогда не объявляете эти символы., @Majenko
Вы имеете в виду различные состояния, в которых может находиться двигатель? в этом случае 4 состояния, в которых случаи 1 и 2, а также случаи 3 и 4 дают одинаковый результат., @Annelouk van Mierlo
Нет, я имею в виду, сколько переменных состояния вам нужно? Вы определяете одну и ту же переменную 4 раза, каждый раз с разным присвоением и присвоением переменной или макроса, которые вы при этом не определили., @Majenko