логическая функция ардуино

В следующем коде: - Цель кода: «при нажатии кнопки загорается светодиод, а при повторном нажатии кнопки светодиод гаснет»

#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);  
}

Мои вопросы заключаются в следующем:-

  1. Когда я использовал цифровое чтение(кнопку) вместо введения переменной, т.е. текущий. Светодиод показывает ненормальное поведение. Почему?
  2. Какова цель текущего = предыдущего выражения. Что это значение?
  3. Кроме того, пожалуйста, кратко объясните работу кода в петля.
  4. Почему следует использовать Boolean вместо int?

, 👍0

Обсуждение

что такое "ненормальное поведение"... это описание имеет значение только для вас, @jsotola


1 ответ


1

Когда я использовал цифровое чтение(кнопку) вместо введения переменной, т.е. текущий. Светодиод показывает ненормальное поведение. Почему?

Скорее всего, это связано с отказом при переключении. Процессор работает очень быстро по сравнению с механическим переключателем, который щелкает при работе. Так что результаты могут быть неожиданными. Вы можете обойти эту проблему в программном обеспечении, используя конечный автомат. Или в аппаратном обеспечении с помощью конденсаторов для фильтрации дребезга.

Какова цель текущего = предыдущего выражения. Что это значение?

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

Кроме того, кратко объясните работу кода в цикле.

Два фиксированных или зарезервированных имени функций в скетче Arduino — «настройка» и «цикл». «setup» вызывается только один раз при загрузке. И «цикл» вызывается снова и снова после вызова «настройки». В «цикле» код считывает это состояние кнопки, а затем проверяет, является ли состояние кнопки истинным, а предыдущее состояние ложным. Если это так, переключите переменную, которая отслеживает состояние светодиода. Тогда код всегда будет сохранять текущее состояние как прошлое и включать/выключать светодиод в соответствии со значением, отслеживающим состояние светодиода.

Теперь самое сложное. Предположим, что переключатель исправен и не дребезжит. Переключение происходит только при первом нажатии переключателя. Это потому, что в следующий раз через "цикл" оба триггера & предыдущие являются истинными, и тогда тест будет ложным, и светодиод не будет переключаться. Только после того, как переключатель будет отпущен, код сбрасывается до значения false. Теперь, если переключатель нажат еще раз, только для 1 итерации через «цикл», тест будет верным, и светодиод будет переключаться.

Этот подход зависит от того, чтобы переключатель не подскакивал. И трудно понять. Рассмотрите возможность использования автомата с 4 состояниями (кнопка вверх/светодиод выключен, кнопка вниз/светодиод горит, кнопка вверх/светодиод горит, кнопка вниз/светодиод выключен), а не этот автомат с 2 состояниями (кнопка вниз/светодиод переключается, кнопка вверх/светодиод горит непрерывно) .

Почему следует использовать Boolean вместо int?

Bools имеет только два состояния. Целые числа могут иметь много состояний. Менее запутанно и менее подвержено ошибкам использование переменной, которая имеет только два состояния, если это является целью программы.

,