Программа работает неправильно во время воспроизведения мелодии

Мой робот работает нормально, но когда я добавил зуммер и мелодию в код, значит, что-то не так. Мелодия воспроизводится при активации акселерометра, но остальная часть кода должна дождаться окончания мелодии. Я хочу играть мелодию в фоновом режиме, когда программа работает. Как это сделать? Вот мой код:

#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);
   }

}
//мелодия

, 👍-1

Обсуждение

Определите неправильно. Кроме того, ссылки на код нежелательны. Разместите свой код в своем вопросе и отформатируйте его правильно. Расскажите нам, чего вы ожидаете, и что *на самом деле* происходит., @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


1 ответ


1

Вы используете delay() во многих частях кода, что делает его очень сложным. Я вижу здесь пару возможностей:

1 - если у вас есть лишнее время и терпение, избавьтесь от всех задержек и найдите вокруг них подсчет millis() или что-то подобное.

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

Существует также очень ленивое, почти не требующее работы и относительно дешевое решение: использовать небольшой модуль медиа/MP3-плеера, который также позволит вам иметь более одной мелодии и, в конечном итоге, дополнительные шумы.

,

Так, например, как изменить задержку (1000); в милли?, @P C PIOTRUSIO

посмотрите пример кода BlinkWithoutDelay в Arduino IDE, @jsotola