логическая функция ардуино
В следующем коде: - Цель кода: «при нажатии кнопки загорается светодиод, а при повторном нажатии кнопки светодиод гаснет»
#define led 12
#define button 7
boolean trigger = false;
boolean previous = false;
void setup()
{
pinMode(led , OUTPUT);
pinMode(button , INPUT);
}
void loop()
{
int current = digitalRead(button) ;
if (current && !previous)
{
trigger = !trigger;
}
previous = current;
digitalWrite(led , trigger);
}
Мои вопросы заключаются в следующем:-
- Когда я использовал цифровое чтение(кнопку) вместо введения переменной, т.е. текущий. Светодиод показывает ненормальное поведение. Почему?
- Какова цель текущего = предыдущего выражения. Что это значение?
- Кроме того, пожалуйста, кратко объясните работу кода в петля.
- Почему следует использовать Boolean вместо int?
@Musab, 👍0
Обсуждение1 ответ
Когда я использовал цифровое чтение(кнопку) вместо введения переменной, т.е. текущий. Светодиод показывает ненормальное поведение. Почему?
Скорее всего, это связано с отказом при переключении. Процессор работает очень быстро по сравнению с механическим переключателем, который щелкает при работе. Так что результаты могут быть неожиданными. Вы можете обойти эту проблему в программном обеспечении, используя конечный автомат. Или в аппаратном обеспечении с помощью конденсаторов для фильтрации дребезга.
Какова цель текущего = предыдущего выражения. Что это значение?
Программа отслеживает состояние переключателя. Поэтому вам нужно знать предыдущее состояние переключателя, чтобы знать, изменилось ли состояние переключателя.
Кроме того, кратко объясните работу кода в цикле.
Два фиксированных или зарезервированных имени функций в скетче Arduino — «настройка» и «цикл». «setup» вызывается только один раз при загрузке. И «цикл» вызывается снова и снова после вызова «настройки». В «цикле» код считывает это состояние кнопки, а затем проверяет, является ли состояние кнопки истинным, а предыдущее состояние ложным. Если это так, переключите переменную, которая отслеживает состояние светодиода. Тогда код всегда будет сохранять текущее состояние как прошлое и включать/выключать светодиод в соответствии со значением, отслеживающим состояние светодиода.
Теперь самое сложное. Предположим, что переключатель исправен и не дребезжит. Переключение происходит только при первом нажатии переключателя. Это потому, что в следующий раз через "цикл" оба триггера & предыдущие являются истинными, и тогда тест будет ложным, и светодиод не будет переключаться. Только после того, как переключатель будет отпущен, код сбрасывается до значения false. Теперь, если переключатель нажат еще раз, только для 1 итерации через «цикл», тест будет верным, и светодиод будет переключаться.
Этот подход зависит от того, чтобы переключатель не подскакивал. И трудно понять. Рассмотрите возможность использования автомата с 4 состояниями (кнопка вверх/светодиод выключен, кнопка вниз/светодиод горит, кнопка вверх/светодиод горит, кнопка вниз/светодиод выключен), а не этот автомат с 2 состояниями (кнопка вниз/светодиод переключается, кнопка вверх/светодиод горит непрерывно) .
Почему следует использовать Boolean вместо int?
Bools имеет только два состояния. Целые числа могут иметь много состояний. Менее запутанно и менее подвержено ошибкам использование переменной, которая имеет только два состояния, если это является целью программы.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
что такое "ненормальное поведение"... это описание имеет значение только для вас, @jsotola