как заставить светодиод загораться и мигать при воспроизведении файла wav

Чтобы уточнить, я очень новичок в этом, и я использую Arduino Uno с волновым экраном. Моя схема работает, как задумано, но я недостаточно изучил код, чтобы понять, что нужно сделать, чтобы заставить его делать именно то, что я хочу.

Сейчас следующий код заставляет звук воспроизводиться при нажатии кнопки, но последовательность светодиодов не воспроизводится вообще. Если я перемещаю root.rewind(); play(root); после последнего digitalWrite, тогда последовательность светодиодов запускается, но звук не воспроизводится, пока последовательность светодиодов не закончится. Я собираюсь заставить звук воспроизводиться, пока работает светодиодная последовательность. Есть предложения?

if (state == 1) {
    root.rewind();
    play(root);
    for (i = 0; i < 255; i++) { // цикл от 0 до 254 (нарастание)
        analogWrite(LED,i);     // устанавливаем яркость светодиода
        delay(15);              // ждем 15 мс, потому что AnalogWrite
                                // мгновенно, и мы бы
                                // не видим никаких изменений
    }
    analogWrite(LED, HIGH);     // включает светодиод
    delay(300);                 // ждем секунду
    analogWrite(LED, LOW);      // выключает светодиод
    delay(100);                 // ждем секунду
    analogWrite(LED, HIGH);     // включает светодиод
    delay(300);                 // ждем секунду
    analogWrite(LED, LOW);      // выключает светодиод
    delay(100);                 // ждем секунду

    digitalWrite(RESET, LOW);
}

, 👍0

Обсуждение

analogWrite(LED, HIGH); эквивалентно analogWrite(LED, 1);, @gre_gor

@gre_gor в коде, который я предоставил, это не я, если вы это имеете в виду., @Dan Lexie


1 ответ


Лучший ответ:

3

Поскольку это не может быть весь ваш скетч, мы можем только догадываться, что вы используете какую-то музыку SDCard, проигрывающую Arduino Shield и библиотеку.

Приложение не может вызывать функцию delay(), если приложение пытается выполнить более одной задачи. Вызовы delay() блокируют выполнение процессором каких-либо действий, кроме ожидания истечения времени задержки.

Чтобы (казалось) выполнять несколько задач, запустите цикл без вызовов функции delay(). Вместо этого вызовите функцию millis(), проверяющую, прошло ли достаточно времени для вызова функции светодиода или функции звука. Ни в одной из функций вы не должны вызывать функцию delay()! Если вы не писали функцию (например, вы используете библиотеку), вам может потребоваться отредактировать код в библиотеке, чтобы убедиться, что он соответствует правилу функции no-call-to-delay()!

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

,

Спасибо, это работает отлично. Все еще изучаю словарный запас с помощью этой штуки, поэтому я был в блаженном неведении о функции миллиса. И да, я использую волновой щит adafruit для воспроизведения звука с SD-карты. Я не включил весь этот код, потому что большая его часть является одним из примеров кода adafruit, чтобы заставить его работать. Еще раз спасибо, ура, @Dan Lexie