Код Arduino для включения светодиода одним хлопком и последующего выключения одним хлопком

Я хочу, чтобы мой Arduino включал светодиод, когда датчик звука обнаруживает хлопок (шум), и поддерживал его включенным до тех пор, пока датчик звука не обнаружит другой хлопок (шум), который выключит светодиод.

int Sensor = A0;
boolean status_lights = false;

void setup() {
  pinMode(Sensor, INPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  int status_sensor = digitalRead(Sensor);
  if (status_sensor == 0)
  {
    if (status_lights == true)
    {
      status_lights = false;
      digitalWrite(13, LOW);
    }
    else {
      status_lights = true;
      digitalWrite(13, HIGH);
    }
  }
}

Мой датчик звука имеет 3 контакта. детали звукового датчика

РЕДАКТИРОВАТЬ: Мой код только включает светодиод, но не выключает его, когда я хлопаю в ладоши.

, 👍0

Обсуждение

у вас нет кода, который используется для отладки... по крайней мере, напечатайте значение status_sensor, чтобы увидеть, что это на самом деле, @jsotola


1 ответ


1

Если уровень звука ниже порогового значения, вывод DO датчика сигнализирует высокое значение. Если уровень звука превышает порог, т.е. вы хлопаете в ладоши, DO подтягивается к GND и сигнал на короткое время становится НИЗКИМ. После этого короткого времени сигналы снова становятся ВЫСОКИМ.

Теперь посмотрите на свою петлю:

void loop() 
{
  int status_sensor = digitalRead(Sensor);

  if (status_sensor == 0)
  {
    // вы входите в этот блок, если вы хлопаете в ладоши и
    // микроконтроллер достаточно быстр, чтобы захватить сигнал / вывод DO (НИЗКИЙ)
    // в течение короткого промежутка времени
    // Я уверен, что это достаточно быстро, чтобы войти в этот блок несколько раз
    // количество раз в интервале, когда хлопки активны.
    if (status_lights == true)
    {
      status_lights = false;
      digitalWrite(13, LOW);
    }
    else 
    {
      status_lights = true;
      digitalWrite(13, HIGH);
    }
  }
}

Видите ли, светодиод переключается, пока активен интервал LOW датчика (DO=LOW).

Я интерпретирую ваше утверждение "Мой код только включает светодиод, но не выключает его, когда я хлопаю". так, чтобы светодиод горел, когда программа запускается без хлопка. Это означает, что окружающий шум достаточно громкий, чтобы активировать датчик. Затем описанный выше цикл повторяется постоянно, и вы включаете и выключаете светодиод с очень высокой скоростью. Это похоже на то, как если бы вы применили сигнал ШИМ к контакту светодиода. Светодиод горит, но затемнен примерно до 50%.

Чтобы узнать, прав ли я, просто добавьте в цикл задержку. Мое предположение кажется правильным, если светодиод мигает с частотой один герц (раз в секунду). Вы можете регулировать звуковой порог до тех пор, пока светодиод не перестанет мигать.

void loop() 
{
  int status_sensor = digitalRead(Sensor);

  // Добавляем сюда задержку ...........
  delay(500);

  if (status_sensor == 0)
  {

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

    if (status_lights == true)
    {
      status_lights = false;
      digitalWrite(13, LOW);
    }
    else 
    {
      status_lights = true;
      digitalWrite(13, HIGH);
    }
    // ждем окончания хлопка
    delay(100);
,

+1 за этот комментарий к коду: «Я уверен, что достаточно быстро войти в этот блок несколько раз в интервале, когда активен хлопок». Когда вы хлопаете, он несколько раз переключает вывод DO на высокий и низкий уровень, и это выглядит примерно так: https://arduinoprosto.ru/q/54495/37523, @VE7JRO

@VE7JRO Документация датчика не очень полезна, поэтому спасибо за пример. Я не был действительно уверен, можно ли использовать что-то вроде сглаживающего конденсатора. Но очевидно, что это не так. (73 Петра, DF4VB), @Peter Paul Kiefer