Кнопочный переключатель ардуино
Я пытаюсь использовать кнопку в качестве переключателя (светодиод загорается после того, как я нажимаю кнопку, и гаснет, когда я нажимаю кнопку еще раз). Я знаю, что у меня правильная схема, потому что я также использовал код из Интернета, который очень похож на мой. Но мой код не работает. Светодиод не горит. Кто-нибудь знает, что не так с моим кодом?
Теперь я нашел ошибку. Последние две строки кода находились в блоке операторов 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;
}
}
@jan, 👍-1
Обсуждение2 ответа
Это действительно легко сделать, если вы используете библиотеку Bounce2. В библиотеке есть пример под названием change.ino, который делает именно то, что вы хотите (предполагая, что вы используете переключатель NO между GND и выводом Arduino без внешнего подтягивающего или стягивающего резистора).
Вы можете изменить этот debouncer.interval(500);
на этот debouncer.interval(20);
в скетче.
Теперь я нашел ошибку. Последние 2 строки кода были в блоке оператора if. Но почему тогда это не работает?
previousState устанавливается на высокий уровень и никогда не устанавливается снова, поэтому ваш оператор if никогда не будет выполнен снова, поскольку previousState всегда устанавливается на высокий уровень.
Перемещение последней строки из блока if устанавливает previousState в каждом цикле и может иметь значение, отличное от HIGH, и тогда ваше условие if может быть удовлетворено.
Предпоследняя строка может остаться в «если» или быть вынесена, логически это не имеет значения.
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Двигатель постоянного тока Arduino с 2 кнопками
- Нужна помощь с программой для кнопки смены отображения на OLED-дисплее
- Использование switch case с 5-позиционным переключателем и последовательным выходом
- Arduino UNO С Переключателем Модуля Вкл / Выкл + Совет По Батарее
- Один светодиод управляется двумя кнопками - одна из которых действует как тумблер
- Узнать статус, подключен ли коммутатор к arduino или нет?
- Как я могу заставить свою программу Arduino Esplora запускаться нажатием кнопки, а затем продолжать работать без необходимости удерживать кнопку нажатой?
и моргание (с использованием триггера по времени) работает?, @ratchet freak
Да, я могу заставить мигать светодиод, @jan
Почему бы вам не использовать внутренний подтягивающий резистор? Вы использовали один внешне? Если нет, ваш ввод является плавающим, а состояние не определено., @tttapa
Я использовал подтягивающий резистор, @jan
Если вы не обновляете previousState на каждой итерации, ваш внешний оператор if не может быть истинным, если previousState высокий, если это ваш вопрос., @tttapa