Как улучшить время отклика этого светодиода со звуковым управлением?

Я написал следующий код для включения светодиода при хлопке (с использованием звукового датчика), который я подключил через сопротивление 330 Ом к контакту номер 4.

Однако, когда я хлопаю один раз, близко к звуковому датчику, светодиод не загорается. Но светодиод загорается только в том случае, если я обеспечиваю длительное воздействие звука (более 6 секунд) на звуковой датчик.

Как мне это улучшить, чтобы даже если я хлопну один раз в течение секунды, светодиод загорелся?

int soundSensor=10;
int LED=4;

void setup() 
{
 Serial.begin(9600);  
 pinMode(soundSensor,INPUT);
 pinMode(LED,OUTPUT);
}

void loop() 
{
  int SensorData=digitalRead(soundSensor); 
  if(SensorData==1)
  { 

     digitalWrite(LED,HIGH);
  delay(3000);

     Serial.println("LOUD, LOUD");
     delay(1000);
  }
    else
  {

     digitalWrite(LED,LOW);
     Serial.println("SLOW, SLOW");
     delay(1000);
  }
 } 

, 👍5


3 ответа


6

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

Поэтому проверяйте чаще (уменьшайте задержки) и проверяйте как можно больше обнаружений звука в течение одной секунды.

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

,

3

В зависимости от датчика, простая модификация с последовательным диодом для обнаружения импульса и удержания медленного затухания, скажем, от 0,01 мкФ до 10 МОм до 0 В, обнаружит первый раз и растянет импульс ~ 0,01 мкФ*10 МОм = 0,1 с

,

5

Прерывания полезны для автоматического выполнения действий в программах микроконтроллера и могут помочь решить проблемы синхронизации. Хорошие задачи для использования прерывания могут включать чтение вращающегося энкодера или мониторинг пользовательского ввода (например, хлопков).

Использование функции attachInterrupt() — вот выход!

https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

,