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;
}

, 👍1

Обсуждение

Сколько переменных состояния вам нужно?! И это совершенно правильно. Ни в коем случае вы никогда не объявляете эти символы., @Majenko

Вы имеете в виду различные состояния, в которых может находиться двигатель? в этом случае 4 состояния, в которых случаи 1 и 2, а также случаи 3 и 4 дают одинаковый результат., @Annelouk van Mierlo

Нет, я имею в виду, сколько переменных состояния вам нужно? Вы определяете одну и ту же переменную 4 раза, каждый раз с разным присвоением и присвоением переменной или макроса, которые вы при этом не определили., @Majenko


2 ответа


Лучший ответ:

0

У меня такое ощущение, что вам нужно только одно состояние, которое может иметь 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.

Совет: выровняйте код (выровняйте { и } друг под другом; это значительно улучшит читаемость вашего кода.

,

0

Вы не определили 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;
,