Arduino взламывание кода с двойным хлопком - PullRequest
0 голосов
/ 03 июня 2019

Я делаю программу, которая включает мои огни, когда я дважды хлопаю в ладоши. Я закодировал проект для: 1. прислушиваться к шуму (первый хлопок) 2. прислушиваться к тишине (разрыв между хлопками), чтобы избежать ложных срабатываний (разговоров и т. Д.). 3. слушать второй шум (второй хлопок).

Код работает и работает правильно, но у него есть несколько критических моментов, которые я изо всех сил пытаюсь найти / исправить. Я знаю, что если я издаю шум, то я тихо, затем я снова издаю другой шум, и в быстрой последовательности код либо застревает в первом цикле while, либо вообще прекращает ввод первого цикла while. Код часто ломается, когда я говорю.

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

bool quiet = false;
bool loud = false;
int runtime = 1000;
int start = millis();
bool clap = false;
bool clap2 = false;
void setup() {

    Serial.begin(9600);
    pinMode(2, INPUT);
}

void loop() {

    int mic = digitalRead(2);
    if (mic == 0) {
        Serial.println("loud");
        clap = true;
    } else {
        Serial.println("quiet");
    }
    if (clap == true) {
        clap = false;
        Serial.println("clap");
        start = millis();
        delay(500);
        while (start >= millis() - runtime && loud != true) {
            mic = digitalRead(2);
            if (mic == 0) {
                Serial.println("noise detected!");
                loud = true;
            } else {
                Serial.println("scilence");
                quiet = true;
            }

        }
    } else {
        delay(1);
    }
    if (quiet == true && loud == false) {
        quiet = false;
        Serial.println("listening for second clap...");
        delay(500);
        start = millis();
        while (start >= millis() - runtime) {
            mic = digitalRead(2);
            if (mic == 0) {
                clap2 = true;
            } else {
                delay(1);
            }
        }
    } else {
        loud = false;
        quiet = false;
    }
    if (clap2 == true) {
        clap2 = false;
        Serial.println("clap 2");
        delay(1000);
    } else {
        delay(1);
    }
}

1 Ответ

0 голосов
/ 03 июня 2019

Добро пожаловать в StackOverflow!

Из программы, которую вы разместили, я думаю, вы слишком усложняете ее;).Прежде всего, функция delay() является функцией блокировки: ничего не может произойти в течение времени задержки.Поэтому обычно рекомендуется сравнивать время, чтобы узнать, достаточно ли вы ждали: вы можете выполнить другие задачи за это время.

Я бы предложил что-то подобное для вашей loop() функции:

if(digitalRead(2)==0) //loud
{
    unsigned long first_clap_time = millis();
    unsigned long elapsed_time = 0;
    bool silence = false;
    bool exit = false;
    while (elapsed_time < 5000 || exit)  // allow a max delay of 5sec
    {
        if (digitalRead(2)!=0) silence = true;
        elapsed_time = millis() - first_clap_time;
        if (digitalRead(2)==0 && elapsed_time > 500 && silence) 
        {
            Serial.println("Two claps detected!");  //if a second clap is detected 500 milliseconds after the first, and before 5 sec, and a silence was detected
            exit = true;
        }
    }      
}

Это должно быть в состоянии обнаружить только два хлопка, разделенных временем между 500 миллисекундами и 5 секундами (для регулировки, конечно).У меня нет возможности протестировать эту программу, поэтому не стесняйтесь оставлять отзывы!

Надеюсь, это поможет,

...