Звуковые сигналы датчиков с временной шкалой

Я перепробовал много кодов, чтобы это сработало, но ничего не помогает, поэтому мой код должен работать так: если звуковой датчик (3 контакта, A2) посылает 5 сигналов в Arduino в течение 10 секунд (временной промежуток каждого сигнала варьируется, но не имеет значения, пока он посылает 5 сигналов), то светодиод (13) загорается. Это мой недавний код если он может помочь

int led=13;
int sensor=A2;

void setup()
{ 
   pinMode(led, OUTPUT);
    pinMode(sensor, INPUT);
    Serial.begin(9600);
}

void loop()
{
    unsigned long StartMillis = millis();
    unsigned long CurrentMillis = millis();
    int signal_count=digitalRead(sensor);
    int signal_limit=5;
    Serial.println(signal_count);

    while ((CurrentMillis - StartMillis)==5000)
    if (digitalRead(sensor)=0)
    {     signal_count ++;
        Serial.println(signal_count);
    }
    if (signal_count>signal_limit) {
        digitalWrite(led, HIGH);
    }
    else {
    digitalWrite(led,LOW);
    }
}

, 👍1

Обсуждение

подумайте о первых двух строках программы внутри блока loop ().... что они делают?, @jsotola

Какой звуковой датчик вы используете? Является ли его выход аналоговым или цифровым? А что вы подразумеваете под "сигналом"? Что для вас считается "сигналом"?, @chrisl

Я использую сенсорный модуль цифрового звукового детектора. Я не знаю, но он, вероятно, использует аналоговый (это то, что я получил из ссылок на веб-сайт). Сигнал, о котором я говорил, - это сигнал, посылаемый датчиком звука на arduino (ВЫСОКИЙ или НИЗКИЙ), @Marc Allen Damandaman

И все же вы не объяснили, что такое "сигнал". Значит ли это, что датчик должен идти сначала высоко, а затем низко ( импульс)? Или как вы хотите считать "сигналы"?, @chrisl

Я просто хотел подсчитать ВЫСОКИЕ сигналы, а затем использовать количество сигналов, полученных за короткий промежуток времени, чтобы вызвать загорание светодиода, @Marc Allen Damandaman


1 ответ


1

Вы неправильно обращаетесь с millis (). С помощью этих двух строк:

unsigned long StartMillis = millis();
unsigned long CurrentMillis = millis();

StartMillis всегда будет иметь то же значение, что и currentMillis. (Хорошо, я предполагаю, что millis() может вернуть значение, увеличенное на 1 при втором вызове, но это крайне маловероятно. Выполнение 2 строк занимает гораздо меньше миллисекунды.)

Ваш

while ((CurrentMillis - StartMillis)==5000) 

никогда не будет выполнено значение true, поэтому код в блоке while никогда не будет выполняться.

Это утверждение if также неверно:

if (digitalRead(sensor)=0)

Вы хотите == (сравнение) не = назначение. Я удивлен, что компилятор даже позволил это скомпилировать, так как вы пытаетесь установить функцию digitalRead(датчик) в 0, что не имеет смысла.

Измените этот код следующим образом:

if (digitalRead(sensor)==0)

(Предполагая, что вы хотите, чтобы тело оператора if выполнялось, когда значение вашего датчика равно 0.)

,