Код 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 контакта. детали звукового датчика
РЕДАКТИРОВАТЬ: Мой код только включает светодиод, но не выключает его, когда я хлопаю в ладоши.
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
- Как использовать звуковой датчик LM393 + динамик в Arduino
- Как считать показания датчика звука и включить датчик с датчиком воды, если показания выше порогового значения и при обнаружении воды в течение 2 минут?
- Соответствие шаблону вибрации
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- Как подключить более 10 датчиков к Arduino uno r3
- Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
у вас нет кода, который используется для отладки... по крайней мере, напечатайте значение
status_sensor
, чтобы увидеть, что это на самом деле, @jsotola