Пытаюсь зажечь светодиод одной кнопкой и понятия не имею, что не так

Новое для Arduino. Я пытаюсь использовать одну кнопку, чтобы зажечь и выключить один светодиод. Я следовал интернет-руководству (видео на YouTube) и немного изменил код. Я знаю, что это для двух светодиодов, но я пробовал для одного. Я понятия не имею, почему это не работает. Я не понимаю, почему это не имеет смысла, но это просто не работает.

Вот код:

float LengthPush = 0; // LengthPush — это время, в течение которого кнопка была нажата.

int ShortPush = 100; // 100 мс push. Предполагается включить светодиод.
int LPush = 1000; // 1000 мс push. Предполагалось отключить.

int ButtonPin = 2;
int RLED = 13;

void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode(ButtonPin, INPUT_PULLUP);
  pinMode(RLED, OUTPUT);

  Serial.begin(9600);
}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:
  while (digitalRead(ButtonPin) == LOW) {
    delay(100);
    LengthPush = LengthPush + 100;

    Serial.print("ms = ");
    Serial.println(LengthPush);
  }

  if (LengthPush >= LPush) {
    digitalWrite(RLED, LOW);
  } else if (ShortPush <= LengthPush < LPush) {
    digitalWrite(RLED, HIGH);
  }
  LengthPush = 0;
}

, 👍-1

Обсуждение

Вы получаете ошибки компилятора? Если да, вы должны включить их в свой вопрос. «Не работает» — не очень хорошее описание. Я бы подумал, что оператор else if выдает ошибку, потому что вы пытаетесь сравнить 3 значения в 1., @chrisl

Я только что понял это правильно! Моя ошибка заключалась в сравнении 3 значений. Я думал, что должен указать, что длина нажатия должна быть больше 100 мс, но меньше 1000, если я хочу, чтобы он включился. Оказывается, компилятор уже это делает. Спасибо за ответ., @Boianskee

Также вы можете убрать точку с запятой сразу после каждой открывающей скобки {. Также попытайтесь выровнять свой код так, чтобы каждый вложенный { имел отступ на один уровень в соответствии с его уровнем вложенности., @Michel Keijzers

Я отформатировал ваш исходный код в Question. Как вам это нравится?, @Juraj

@chrisl Я предлагаю вам написать свой комментарий в качестве ответа, чтобы ОП мог закрыть вопрос., @frarugi87


1 ответ


1

Я думаю, что ваша проблема заключается в операторе else-if, в котором вы пытаетесь сравнить 3 разных значения. Хотя это не вызывает ошибки компиляции в моей Arduino IDE, вероятно, это не даст того, чего вы пытаетесь достичь.

Вместо этого вам нужно сравнить LengthPush с одним значением, а затем с другим. Вы даже можете сделать это внутри того же оператора if:

if(ShortPush <= LengthPush && LengthPush < LPush)

&& – это логический оператор AND, означающий, что оператор if будет выполнен, если оба оператора вокруг него будут оценены как true.


Я не уверен, что на самом деле происходит с исходным кодом, так как он не выдает ошибку компиляции. Возможно (и это моя теория здесь), что программа сначала оценит ShortPush <= LengthPush, а затем сравнит результат с LPush. Поскольку логические значения оцениваются как 0 или 1 в целочисленных вычислениях, это портит весь смысл этого. Предположим, что LengthPush действительно находится в требуемом интервале. Тогда первая часть будет оцениваться как true, что означает 1 как целое число. Затем этот 1 сравнивается с LPush, который всегда выше, так что общий результат верен. Но тот же результат получается, когда LengthPush меньше, чем ShortPush.

,