Кнопочный переключатель ардуино

Я пытаюсь использовать кнопку в качестве переключателя (светодиод загорается после того, как я нажимаю кнопку, и гаснет, когда я нажимаю кнопку еще раз). Я знаю, что у меня правильная схема, потому что я также использовал код из Интернета, который очень похож на мой. Но мой код не работает. Светодиод не горит. Кто-нибудь знает, что не так с моим кодом?

Теперь я нашел ошибку. Последние две строки кода находились в блоке операторов if. Но почему тогда это не работает?

Вот код, который я написал:

int ledPin = 8;
int buttonPin = 4;

int ledState = HIGH;      // текущее состояние светодиода
int previousState = LOW;  // предыдущее состояние кнопки
int readingState ;        // текущее состояние кнопки

void setup() {
   // поместите сюда свой код установки для однократного запуска:
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop() {
  // поместите сюда свой основной код для многократного запуска:
readingState = digitalRead(buttonPin);

if(readingState == HIGH && previousState == LOW){
  if (ledState == HIGH){
    ledState = LOW;
  }

  else{
    ledState = HIGH;
    }

digitalWrite(ledPin, ledState);
previousState = readingState;

}
}

, 👍-1

Обсуждение

и моргание (с использованием триггера по времени) работает?, @ratchet freak

Да, я могу заставить мигать светодиод, @jan

Почему бы вам не использовать внутренний подтягивающий резистор? Вы использовали один внешне? Если нет, ваш ввод является плавающим, а состояние не определено., @tttapa

Я использовал подтягивающий резистор, @jan

Если вы не обновляете previousState на каждой итерации, ваш внешний оператор if не может быть истинным, если previousState высокий, если это ваш вопрос., @tttapa


2 ответа


0

Это действительно легко сделать, если вы используете библиотеку Bounce2. В библиотеке есть пример под названием change.ino, который делает именно то, что вы хотите (предполагая, что вы используете переключатель NO между GND и выводом Arduino без внешнего подтягивающего или стягивающего резистора).

Вы можете изменить этот debouncer.interval(500); на этот debouncer.interval(20); в эскизе.

,

0

Теперь я нашел ошибку. Последние 2 строки кода были в блоке оператора if. Но почему тогда это не работает?

previousState устанавливается на высокий уровень и никогда не устанавливается снова, поэтому ваш оператор if никогда не будет выполнен снова, поскольку previousState всегда устанавливается на высокий уровень.

Перемещение последней строки из блока if устанавливает previousState в каждом цикле и может иметь значение, отличное от HIGH, и тогда ваше условие if может быть удовлетворено.

Предпоследняя строка может остаться в «если» или быть вынесена, логически это не имеет значения.

,