Программа работает неправильно во время воспроизведения мелодии
Мой робот работает нормально, но когда я добавил зуммер и мелодию в код, значит, что-то не так. Мелодия воспроизводится при активации акселерометра, но остальная часть кода должна дождаться окончания мелодии. Я хочу играть мелодию в фоновом режиме, когда программа работает. Как это сделать? Вот мой код:
#include <RedBot.h>
#include <RedBotSoftwareSerial.h>
RedBotAccel accel;
RedBotMotors motors;
int CM;
long CZAS;
bool started = false;
const int buzzer = A0;
int shortTone = 80;
int longTone = 200;
int standardDelay = 50;
int delayBetweenBars = 50;
void setup()
{
Serial.begin(9600);
accel.enableBump();
accel.setBumpThresh(150);
pinMode(A2, OUTPUT); //Триггер
pinMode(A3, INPUT); //Эхо
pinMode(buzzer, OUTPUT); //Зуммер
}
void pomiar_odleglosci()
{
digitalWrite(A2, HIGH);
delayMicroseconds(10);
digitalWrite(A2, LOW);
CZAS = pulseIn(A3, HIGH);
CM = CZAS / 58;
}
void loop(){
while (!accel.checkBump() && !started) delay(100);
started = true;
if(started = true)
{ DarudeSandstorm();
}
pomiar_odleglosci();
Serial.print("Odleglosc: ");
Serial.print(CM);
Serial.println(" cm");
if(CM>10)
{
motors.drive(100);
}
else
{
motors.drive(-100);
delay(400);
motors.stop();
delay(400);
motors.rightMotor(100);
delay(700);
motors.stop();
motors.drive(100);
}
}
//мелодия
@P C PIOTRUSIO, 👍-1
Обсуждение1 ответ
Вы используете delay() во многих частях кода, что делает его очень сложным. Я вижу здесь пару возможностей:
1 - если у вас есть лишнее время и терпение, избавьтесь от всех задержек и найдите вокруг них подсчет millis() или что-то подобное.
2 - если у вас есть лишние деньги, приобретите еще один контроллер только для воспроизведения мелодии, для этого ATtiny85 должен быть дешевым и практичным.
Существует также очень ленивое, почти не требующее работы и относительно дешевое решение: использовать небольшой модуль медиа/MP3-плеера, который также позволит вам иметь более одной мелодии и, в конечном итоге, дополнительные шумы.
Так, например, как изменить задержку (1000); в милли?, @P C PIOTRUSIO
посмотрите пример кода BlinkWithoutDelay
в Arduino IDE, @jsotola
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Определите неправильно. Кроме того, ссылки на код нежелательны. Разместите свой код в своем вопросе и отформатируйте его правильно. Расскажите нам, чего вы ожидаете, и что *на самом деле* происходит., @Majenko
Где играет мелодия? На мероприятии
DarudeSandstorm
? Где это определено? Пожалуйста, предоставьте ссылку на красный робот, чтобы мы могли их проверить., @chrislЭто весь код: https://pastebin.com/aihBQZT1, а это библиотека для redbot.h: https://github.com/sparkfun/SparkFun_RedBot_Arduino_Library/blob/master/src/RedBot.h, @P C PIOTRUSIO