Пытаюсь зажечь светодиод одной кнопкой и понятия не имею, что не так
Новое для 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;
}
@Boianskee, 👍-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
.
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Наилучший метод проектирования схемы с 20 кнопками
- Возникла проблема с переобъявлением символа другого типа
- Прерывание при нажатии кнопки + устранение дребезга
- Светодиод с кнопочным управлением Arduino со сборкой AVR
Вы получаете ошибки компилятора? Если да, вы должны включить их в свой вопрос. «Не работает» — не очень хорошее описание. Я бы подумал, что оператор else if выдает ошибку, потому что вы пытаетесь сравнить 3 значения в 1., @chrisl
Я только что понял это правильно! Моя ошибка заключалась в сравнении 3 значений. Я думал, что должен указать, что длина нажатия должна быть больше 100 мс, но меньше 1000, если я хочу, чтобы он включился. Оказывается, компилятор уже это делает. Спасибо за ответ., @Boianskee
Также вы можете убрать точку с запятой сразу после каждой открывающей скобки {. Также попытайтесь выровнять свой код так, чтобы каждый вложенный { имел отступ на один уровень в соответствии с его уровнем вложенности., @Michel Keijzers
Я отформатировал ваш исходный код в Question. Как вам это нравится?, @Juraj
@chrisl Я предлагаю вам написать свой комментарий в качестве ответа, чтобы ОП мог закрыть вопрос., @frarugi87