Combining sketches is causing the servo to occasionally twitch

Over the last couple of weeks I've put together a sketch using an Arduino Uno, which I'll swap out later for the smaller Nano. The sketch controls Leds and their sequence using states, & a small servo motor.
It basically has three stages.
No buttons pressed, servo doesn't move and leds blink slowly
Button A pressed, servo moves 35 degrees and leds blink slightly faster
Button B pressed, servo moves 83 degrees and leds blink really fast
The sketch works without any issue.

[code]
#include<Servo.h>

// RED LEDS wired to buttonA & B press
int ledPinRA =  A0;      // the number of the LED pin
int ledPinRB =  A1;      // the number of the LED pin


Servo myservo; // create servo object to control servo

int buttonApin = 2;
int buttonBpin = 4;

int pos = 0; // set initial servo position to 0
int buttonAstate = 0; // variable for reading pushbutton status
int buttonBstate = 0;

/*
  by noiasca
  https://forum.arduino.cc/index.php?topic=666044
*/

const uint16_t intervalSLOW[] {1000, 1000, 1000, 1000, 1000, 1000, 1000, 100};  // time to wait in each intervall
const uint16_t intervalMEDIUM[] {400, 400, 400, 400, 400, 400, 400, 100};
const uint16_t intervalFAST[] {100, 100, 100, 100, 100, 100, 100, 100};


const byte ledPinA = 5;
const byte ledPinB = 6;
const byte ledPinC = 7;
const byte ledPinD = 8;
const byte ledPinE = 9;
const byte ledPinF = 10;
const byte ledPinG = 11;

void handleLedsSLOW()
{

  static uint32_t previousMillis = 0;
  static byte state = 7;
  if (millis() - previousMillis >= intervalSLOW[state])
  {
    // it's time for next state
    state++;
    state = state % 8;
    Serial.print(F("state=")); Serial.println(state);

    // act according state
    switch (state)
    {
      case 0:
        digitalWrite(ledPinA, HIGH);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 1:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, HIGH);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 2:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, HIGH);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 3:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, HIGH);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 4:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, HIGH);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 5:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, HIGH);
        digitalWrite(ledPinG, LOW);
        break;
      case 6:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, HIGH);
        break;
      case 7:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
    }
    previousMillis = millis();
  }
}

void handleLedsMEDIUM()
{

  static uint32_t previousMillis = 0;
  static byte state = 7;
  if (millis() - previousMillis >= intervalMEDIUM[state])
  {
    // it's time for next state
    state++;
    state = state % 8;
    Serial.print(F("state=")); Serial.println(state);

    // act according state
    switch (state)
    {
      case 0:
        digitalWrite(ledPinA, HIGH);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 1:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, HIGH);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 2:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, HIGH);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 3:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, HIGH);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 4:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, HIGH);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 5:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, HIGH);
        digitalWrite(ledPinG, LOW);
        break;
      case 6:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, HIGH);
        break;
      case 7:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
    }
    previousMillis = millis();
  }
}

void handleLedsFAST()
{

  static uint32_t previousMillis = 0;
  static byte state = 7;
  if (millis() - previousMillis >= intervalFAST[state])
  {
    // it's time for next state
    state++;
    state = state % 8;
    Serial.print(F("state=")); Serial.println(state);

    // act according state
    switch (state)
    {
      case 0:
        digitalWrite(ledPinA, HIGH);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 1:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, HIGH);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 2:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, HIGH);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 3:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, HIGH);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 4:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, HIGH);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 5:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, HIGH);
        digitalWrite(ledPinG, LOW);
        break;
      case 6:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, HIGH);
        break;
      case 7:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
    }
    previousMillis = millis();
  }

}



void setup() {
  myservo.attach(3);
  Serial.begin(9600);
  pinMode(3, OUTPUT); // initialize the servo pin as an output
  pinMode(buttonApin, INPUT_PULLUP); // initialize the button A pin as an input
  pinMode(buttonBpin, INPUT_PULLUP); // initialize the button B pin as an input
  pinMode(ledPinA, OUTPUT); // initialize the LED1 pin as an output
  pinMode(ledPinB, OUTPUT); // initialize the LED2 pin as an output
  pinMode(ledPinC, OUTPUT); // initialize the LED3 pin as an output
  pinMode(ledPinD, OUTPUT); // initialize the LED4 pin as an output
  pinMode(ledPinE, OUTPUT); // initialize the LED5 pin as an output
  pinMode(ledPinF, OUTPUT); // initialize the LED6 pin as an output
  pinMode(ledPinG, OUTPUT); // initialize the LED7 pin as an output

  pinMode(12, OUTPUT);    // sets the digital pin 12 as output for 2 SLIDE switch LEDS

  pinMode(ledPinRA, OUTPUT); // initialize the LED pin as an output
  pinMode(ledPinRB, OUTPUT); // initialize the LED pin as an output
}

void loop() {

  digitalWrite(12, HIGH); // sets the digital pin 12 on

  buttonAstate = digitalRead(buttonApin); // read the state of button A value
  buttonBstate = digitalRead(buttonBpin); // read the state of button B value

  // servo position
  if ((buttonAstate == HIGH) && (buttonBstate == HIGH)) {
    myservo.write(0);

    // LED controls
    handleLedsSLOW();  // checks if something is todo with the LEDs
    //do other important stuff here

    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonAstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRA, LOW);
    } else {
      // turn LED off:
      digitalWrite(ledPinRA, LOW);
    }


    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonBstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRB, LOW);
    } else {
      // turn LED off:
      digitalWrite(ledPinRB, LOW);
    }


  }

  else if (buttonAstate == LOW) { // check if button A is pressed
    myservo.write(35); // if it is rotate servo to 35 degrees

    handleLedsMEDIUM();  // checks if something is todo with the LEDs
    //do other important stuff here

    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonAstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRA, HIGH);
    } else {
      // turn LED off:
      digitalWrite(ledPinRA, LOW);
    }

  }

  else {
    (buttonBstate == LOW)  // check if button B is pressed
    ; myservo.write(83); // if it is rotate servo to 83 degrees

    handleLedsFAST();  // checks if something is todo with the LEDs
    //do other important stuff here

    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonBstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRB, HIGH);
    } else {
      // turn LED off:
      digitalWrite(ledPinRB, LOW);
    }
  }

  delay(100);                // waits for a second

}
[/code]

What I’m doing now is adding sound to the project. I have a BY8301-16p module loaded with 3 sound files, 01.mp3, 02.mp3 & 03.mp3, & using the Nano rx and tx pins, I can get the module to play the sound i want & loop it using the following sketch.

[code]
/*
    ===================================================================================================
    ==================================== BB-8 PADAWAN DOME ============================================
    ======================================  Version 0.07  =============================================
    ===================================================================================================

    Version History
    0.01 - Original Sketch by DavidScott
    0.02 - r0n_dL added annotations & variable for PIN_sound_BUSY as suggested by DavidScott
    0.03 - r0n_dL reassigned pins to align with Padawan control system
         - Changed SoftwareSerial pins (RX/TX) 10/9 to 8/4
    0.04 - Change pinMode for PIN_trigger to INPUT_PULLUP to resolve issue using with Pro Micro
    0.05 - Added support for the BY8301-16P and BY8001-16P sound modules
    0.06 - Using an updated version of MP3FLASH16P (MP3Flash16Pv2) which now removes static serial
           mappings out of the .cpp file
         - Add support to select between using 3 different sound modules by changing 1 variable
    0.07 - Changed hard coded serial port in library

    r0n_dL IMPORTANT NOTE & RECOGNITON: This sketch was written by DavidScott. Thanks for a great base!

    // DavidScott's original comment below

    // This example plays a random file (001 to 010) forever
    // It uses the playFileAndWait() command so no extra code is needed, it will play another file as soon as
    // the previous one finishes. If it doesn't work, try reversing the RX/TX wires as that's probably going to be
    // the most common mistake. Also check that the player's BUSY line is connected to Arduino pin 3
    // Finally check that the player has a speaker connected as well as ground and VCC

    r0n_dL NOTES:  Basic sketch provided by DavidScott to give sounds and synchronized voice lights for
                      scale BB-8 Domes

    REQUIRED Libaries to make this sketch work:

    MP3Flash16Pv2 Library
    https://github.com/r0ndL/MP3Flash16Pv2

    BY8x0116P Library
    https://github.com/r0ndL/BY8x0116Pv2


*/

// SET AUDIO OPTIONS...

// NOTE:  This sketch currently supports 3 different sound modules (MP3-FLASH-16P, BY8001-16P, BY8301-16P)

#define AUDIO1  2   // 1=MP3-FLASH-16P
// 2=BY8001-16P or BY8301-16P


// INCLUDE LIBS AND DECLARE VARIABLES...

#include "SoftwareSerial.h"
SoftwareSerial MP3Serial(A4, A5); // SoftwareSerial port assignments (RX, TX) to communicate with sound module

#if (AUDIO1==2)
//settings for BY8001-16P or BY8301-16P module...

#include "BY8x0116Pv2.h"
BY8x0116Pv2 myPlayer(MP3Serial); // Use SoftwareSerial as the serial port

#else
//settings for MP3-FLASH-16P...

#include "MP3Flash16Pv2.h"
MP3Flash16Pv2 myPlayer(MP3Serial); // Use SoftwareSerial as the serial port


#endif


// ARDUINO PIN ASSIGNMENTS...
// Default Pin Assignments - BASIC WIRING in NOTES

#define PIN_sound_BUSY    A3  //Connect to BUSY pin on sound module


// ADDITIONAL SOUND OPTIONS...

#define number_of_sounds  3

//
//
//

void setup()
{
  //Serial.begin(9600); // you can ommit this line


  MP3Serial.begin(9600);
  myPlayer.init(PIN_sound_BUSY);      // Init the player with the MP3 BUSY pin connected to Arduino pin defined

  //randomSeed(analogRead(0));

}

void loop() {

  if (!myPlayer.isBusy()) {
    myPlayer.playFile(1, 10);
    //delay(100);
  }
}
[/code]

I've now combined these 2 sketches & the buttons, servo, sounds & LEDS sequence just as they should BUT the servo has started twitching/pulsing occasionally when the sound file loops. Sometimes it's just one twitch, sometimes 2 or 3, sometimes no twitch at all.

[code]
/*
    ===================================================================================================
    ==================================== BB-8 PADAWAN DOME ============================================
    ======================================  Version 0.07  =============================================
    ===================================================================================================

    Version History
    0.01 - Original Sketch by DavidScott
    0.02 - r0n_dL added annotations & variable for PIN_sound_BUSY as suggested by DavidScott
    0.03 - r0n_dL reassigned pins to align with Padawan control system
         - Changed SoftwareSerial pins (RX/TX) 10/9 to 8/4
    0.04 - Change pinMode for PIN_trigger to INPUT_PULLUP to resolve issue using with Pro Micro
    0.05 - Added support for the BY8301-16P and BY8001-16P sound modules
    0.06 - Using an updated version of MP3FLASH16P (MP3Flash16Pv2) which now removes static serial
           mappings out of the .cpp file
         - Add support to select between using 3 different sound modules by changing 1 variable
    0.07 - Changed hard coded serial port in library

    r0n_dL IMPORTANT NOTE & RECOGNITON: This sketch was written by DavidScott. Thanks for a great base!

    // DavidScott's original comment below

    // This example plays a random file (001 to 010) forever
    // It uses the playFileAndWait() command so no extra code is needed, it will play another file as soon as
    // the previous one finishes. If it doesn't work, try reversing the RX/TX wires as that's probably going to be
    // the most common mistake. Also check that the player's BUSY line is connected to Arduino pin 3
    // Finally check that the player has a speaker connected as well as ground and VCC

    r0n_dL NOTES:  Basic sketch provided by DavidScott to give sounds and synchronized voice lights for
                      scale BB-8 Domes

    REQUIRED Libaries to make this sketch work:

    MP3Flash16Pv2 Library
    https://github.com/r0ndL/MP3Flash16Pv2

    BY8x0116P Library
    https://github.com/r0ndL/BY8x0116Pv2


*/

// SET AUDIO OPTIONS...

// NOTE:  This sketch currently supports 3 different sound modules (MP3-FLASH-16P, BY8001-16P, BY8301-16P)

#define AUDIO1  2   // 1=MP3-FLASH-16P
// 2=BY8001-16P or BY8301-16P


// INCLUDE LIBS AND DECLARE VARIABLES...

#include "SoftwareSerial.h"
SoftwareSerial MP3Serial(A4, A5); // SoftwareSerial port assignments (RX, TX) to communicate with sound module

#if (AUDIO1==2)
//settings for BY8001-16P or BY8301-16P module...

#include "BY8x0116Pv2.h"
BY8x0116Pv2 myPlayer(MP3Serial); // Use SoftwareSerial as the serial port

#else
//settings for MP3-FLASH-16P...

#include "MP3Flash16Pv2.h"
MP3Flash16Pv2 myPlayer(MP3Serial); // Use SoftwareSerial as the serial port


#endif


// ARDUINO PIN ASSIGNMENTS...
// Default Pin Assignments - BASIC WIRING in NOTES

#define PIN_sound_BUSY    A3  //Connect to BUSY pin on sound module


// ADDITIONAL SOUND OPTIONS...

#define number_of_sounds  3

//
//
//

#include<Servo.h>

// RED LEDS wired to buttonA & B press
int ledPinRA =  A0;      // the number of the LED pin
int ledPinRB =  A1;      // the number of the LED pin


Servo myservo; // create servo object to control servo

int buttonApin = 2;
int buttonBpin = 4;

int pos = 0; // set initial servo position to 0
int buttonAstate = 0; // variable for reading pushbutton status
int buttonBstate = 0;

/*
  by noiasca
  https://forum.arduino.cc/index.php?topic=666044
*/

const uint16_t intervalSLOW[] {1000, 1000, 1000, 1000, 1000, 1000, 1000, 100};  // time to wait in each intervall
const uint16_t intervalMEDIUM[] {400, 400, 400, 400, 400, 400, 400, 100};
const uint16_t intervalFAST[] {100, 100, 100, 100, 100, 100, 100, 100};


const byte ledPinA = 5;
const byte ledPinB = 6;
const byte ledPinC = 7;
const byte ledPinD = 8;
const byte ledPinE = 9;
const byte ledPinF = 10;
const byte ledPinG = 11;

void handleLedsSLOW()
{

  static uint32_t previousMillis = 0;
  static byte state = 7;
  if (millis() - previousMillis >= intervalSLOW[state])
  {
    // it's time for next state
    state++;
    state = state % 8;
    Serial.print(F("state=")); Serial.println(state);

    // act according state
    switch (state)
    {
      case 0:
        digitalWrite(ledPinA, HIGH);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 1:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, HIGH);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 2:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, HIGH);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 3:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, HIGH);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 4:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, HIGH);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 5:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, HIGH);
        digitalWrite(ledPinG, LOW);
        break;
      case 6:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, HIGH);
        break;
      case 7:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
    }
    previousMillis = millis();
  }
}

void handleLedsMEDIUM()
{

  static uint32_t previousMillis = 0;
  static byte state = 7;
  if (millis() - previousMillis >= intervalMEDIUM[state])
  {
    // it's time for next state
    state++;
    state = state % 8;
    Serial.print(F("state=")); Serial.println(state);

    // act according state
    switch (state)
    {
      case 0:
        digitalWrite(ledPinA, HIGH);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 1:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, HIGH);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 2:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, HIGH);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 3:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, HIGH);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 4:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, HIGH);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 5:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, HIGH);
        digitalWrite(ledPinG, LOW);
        break;
      case 6:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, HIGH);
        break;
      case 7:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
    }
    previousMillis = millis();
  }
}

void handleLedsFAST()
{

  static uint32_t previousMillis = 0;
  static byte state = 7;
  if (millis() - previousMillis >= intervalFAST[state])
  {
    // it's time for next state
    state++;
    state = state % 8;
    Serial.print(F("state=")); Serial.println(state);

    // act according state
    switch (state)
    {
      case 0:
        digitalWrite(ledPinA, HIGH);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 1:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, HIGH);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 2:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, HIGH);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 3:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, HIGH);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 4:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, HIGH);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 5:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, HIGH);
        digitalWrite(ledPinG, LOW);
        break;
      case 6:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, HIGH);
        break;
      case 7:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
    }
    previousMillis = millis();
  }

}



void setup() {
  myservo.attach(3);
  Serial.begin(9600);
  pinMode(3, OUTPUT); // initialize the servo pin as an output
  pinMode(buttonApin, INPUT_PULLUP); // initialize the button A pin as an input
  pinMode(buttonBpin, INPUT_PULLUP); // initialize the button B pin as an input
  pinMode(ledPinA, OUTPUT); // initialize the LED1 pin as an output
  pinMode(ledPinB, OUTPUT); // initialize the LED2 pin as an output
  pinMode(ledPinC, OUTPUT); // initialize the LED3 pin as an output
  pinMode(ledPinD, OUTPUT); // initialize the LED4 pin as an output
  pinMode(ledPinE, OUTPUT); // initialize the LED5 pin as an output
  pinMode(ledPinF, OUTPUT); // initialize the LED6 pin as an output
  pinMode(ledPinG, OUTPUT); // initialize the LED7 pin as an output

  pinMode(12, OUTPUT);    // sets the digital pin 12 as output for 2 SLIDE switch LEDS

  pinMode(ledPinRA, OUTPUT); // initialize the LED pin as an output
  pinMode(ledPinRB, OUTPUT); // initialize the LED pin as an output

  MP3Serial.begin(9600);
  myPlayer.init(PIN_sound_BUSY);      // Init the player with the MP3 BUSY pin connected to Arduino pin defined
}

void loop() {

  digitalWrite(12, HIGH); // sets the digital pin 12 on

  buttonAstate = digitalRead(buttonApin); // read the state of button A value
  buttonBstate = digitalRead(buttonBpin); // read the state of button B value

  // servo position
  if ((buttonAstate == HIGH) && (buttonBstate == HIGH)) {
    myservo.write(0);

    if (!myPlayer.isBusy()) {
      myPlayer.playFile(1, 10);
      //delay(100);
    }

    // LED controls
    handleLedsSLOW();  // checks if something is todo with the LEDs
    //do other important stuff here


    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonAstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRA, LOW);
    } else {
      // turn LED off:
      digitalWrite(ledPinRA, LOW);
    }


    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonBstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRB, LOW);
    } else {
      // turn LED off:
      digitalWrite(ledPinRB, LOW);
    }


  }

  else if (buttonAstate == LOW) { // check if button A is pressed
    myservo.write(35); // if it is rotate servo to 35 degrees

    if (!myPlayer.isBusy()) {
      myPlayer.playFile(2, 10);
      //delay(100);
    }

    handleLedsMEDIUM();  // checks if something is todo with the LEDs
    //do other important stuff here

    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonAstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRA, HIGH);
    } else {
      // turn LED off:
      digitalWrite(ledPinRA, LOW);
    }

  }

  else {
    (buttonBstate == LOW)  // check if button B is pressed
    ; myservo.write(83); // if it is rotate servo to 83 degrees

    if (!myPlayer.isBusy()) {
      myPlayer.playFile(3, 10);
      //delay(100);
    }

    handleLedsFAST();  // checks if something is todo with the LEDs
    //do other important stuff here

    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonBstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRB, HIGH);
    } else {
      // turn LED off:
      digitalWrite(ledPinRB, LOW);
    }
  }

  delay(100);                // waits for a second

}
[/code]

I have found that when I remove the following lines from the sketch, (its in 3 seperate sections to control the 3 sounds), the issue with the servo stops, but I also can't play the sounds without them.
if (!myPlayer.isBusy()) {
myPlayer.playFile(3, 10);
//delay(100);
}

Any help would be greatly appreciated by this Arduino newbie.

Are you powering the servo with the Uno 5V.

Yes, it's all powered off the uno 5v

Power the servo with an external supply. An Arduino is not a power supply. Any thing that needs more than several 10s of milliamps should be powered by a suitable external power supply.

Make sure that the external supply ground(s) are connected to Arduino ground.

1 Like

just connected the servo to an external 4xAA battery holder & connected the ground to the Arduino, unfortunately I still have the same issue. The servo will twitch/pulse occasionally when the sound file loops. Sometimes it's just one twitch, sometimes 2 or 3, sometimes no twitch at all.
Is there something I'm missing with a resistor that might be causing feedback or a delay or conflict in the sketch or included library's that causing the servo to twitch?

SoftwareSerial.h and Servo.h have been known to have problems. Try using AltSoftSerial.h or NeoSWSerial.h instead SoftwareSerial.h.

Or if that doesn't do it try ServoTimer2.h instead of Servo.h (but you'll need to change the writes to use microseconds not angles).

Steve

1 Like

slipstick, thank you I'll give that a try, I've just loaded the three libraries you recommended. Is it just as simple as removing SoftwareSerial.h and replacing with AltSoftSerial.h?

#include "SoftwareSerial.h"
SoftwareSerial MP3Serial(A4, A5); // SoftwareSerial port assignments (RX, TX) to communicate with sound module
#include "AltSoftSerial.h"
AltSoftSerial MP3Serial(A4, A5); // AltSoftSerial port assignments (RX, TX) to communicate with sound module

No. You'll need to juggle some pins around because AltSoftSerial uses fixed pins 8 and 9 and is setup just as
#include "AltSoftSerial.h"
AltSoftSerial MP3Serial;

Other than that nothing changes.

Steve

1 Like

Also tried NeoSWSerial.h but still has the same issue problem i had with SoftwareSerial.h, is there something else i need to change in the sketch?

[code]
/*
    ===================================================================================================
    ==================================== BB-8 PADAWAN DOME ============================================
    ======================================  Version 0.07  =============================================
    ===================================================================================================

    Version History
    0.01 - Original Sketch by DavidScott
    0.02 - r0n_dL added annotations & variable for PIN_sound_BUSY as suggested by DavidScott
    0.03 - r0n_dL reassigned pins to align with Padawan control system
         - Changed SoftwareSerial pins (RX/TX) 10/9 to 8/4
    0.04 - Change pinMode for PIN_trigger to INPUT_PULLUP to resolve issue using with Pro Micro
    0.05 - Added support for the BY8301-16P and BY8001-16P sound modules
    0.06 - Using an updated version of MP3FLASH16P (MP3Flash16Pv2) which now removes static serial
           mappings out of the .cpp file
         - Add support to select between using 3 different sound modules by changing 1 variable
    0.07 - Changed hard coded serial port in library

    r0n_dL IMPORTANT NOTE & RECOGNITON: This sketch was written by DavidScott. Thanks for a great base!

    // DavidScott's original comment below

    // This example plays a random file (001 to 010) forever
    // It uses the playFileAndWait() command so no extra code is needed, it will play another file as soon as
    // the previous one finishes. If it doesn't work, try reversing the RX/TX wires as that's probably going to be
    // the most common mistake. Also check that the player's BUSY line is connected to Arduino pin 3
    // Finally check that the player has a speaker connected as well as ground and VCC

    r0n_dL NOTES:  Basic sketch provided by DavidScott to give sounds and synchronized voice lights for
                      scale BB-8 Domes

    REQUIRED Libaries to make this sketch work:

    MP3Flash16Pv2 Library
    https://github.com/r0ndL/MP3Flash16Pv2

    BY8x0116P Library
    https://github.com/r0ndL/BY8x0116Pv2


*/

// SET AUDIO OPTIONS...

// NOTE:  This sketch currently supports 3 different sound modules (MP3-FLASH-16P, BY8001-16P, BY8301-16P)

#define AUDIO1  2   // 1=MP3-FLASH-16P
// 2=BY8001-16P or BY8301-16P


// INCLUDE LIBS AND DECLARE VARIABLES...

#include "NeoSWSerial.h"
NeoSWSerial MP3Serial(A4, A5); // NeoSWSerial port assignments (RX, TX) to communicate with sound module

#if (AUDIO1==2)
//settings for BY8001-16P or BY8301-16P module...

#include "BY8x0116Pv2.h"
BY8x0116Pv2 myPlayer(MP3Serial); // Use SoftwareSerial as the serial port

#else
//settings for MP3-FLASH-16P...

#include "MP3Flash16Pv2.h"
MP3Flash16Pv2 myPlayer(MP3Serial); // Use SoftwareSerial as the serial port


#endif


// ARDUINO PIN ASSIGNMENTS...
// Default Pin Assignments - BASIC WIRING in NOTES

#define PIN_sound_BUSY    A3  //Connect to BUSY pin on sound module


// ADDITIONAL SOUND OPTIONS...

#define number_of_sounds  3

//
//
//

#include<Servo.h>

// RED LEDS wired to buttonA & B press
int ledPinRA =  A0;      // the number of the LED pin
int ledPinRB =  A1;      // the number of the LED pin


Servo myservo; // create servo object to control servo

int buttonApin = 2;
int buttonBpin = 4;

int pos = 0; // set initial servo position to 0
int buttonAstate = 0; // variable for reading pushbutton status
int buttonBstate = 0;

/*
  by noiasca
  https://forum.arduino.cc/index.php?topic=666044
*/

const uint16_t intervalSLOW[] {1000, 1000, 1000, 1000, 1000, 1000, 1000, 100};  // time to wait in each intervall
const uint16_t intervalMEDIUM[] {400, 400, 400, 400, 400, 400, 400, 100};
const uint16_t intervalFAST[] {100, 100, 100, 100, 100, 100, 100, 100};


const byte ledPinA = 5;
const byte ledPinB = 6;
const byte ledPinC = 7;
const byte ledPinD = 0;
const byte ledPinE = 1;
const byte ledPinF = 10;
const byte ledPinG = 11;

void handleLedsSLOW()
{

  static uint32_t previousMillis = 0;
  static byte state = 7;
  if (millis() - previousMillis >= intervalSLOW[state])
  {
    // it's time for next state
    state++;
    state = state % 8;
    Serial.print(F("state=")); Serial.println(state);

    // act according state
    switch (state)
    {
      case 0:
        digitalWrite(ledPinA, HIGH);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 1:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, HIGH);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 2:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, HIGH);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 3:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, HIGH);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 4:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, HIGH);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 5:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, HIGH);
        digitalWrite(ledPinG, LOW);
        break;
      case 6:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, HIGH);
        break;
      case 7:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
    }
    previousMillis = millis();
  }
}

void handleLedsMEDIUM()
{

  static uint32_t previousMillis = 0;
  static byte state = 7;
  if (millis() - previousMillis >= intervalMEDIUM[state])
  {
    // it's time for next state
    state++;
    state = state % 8;
    Serial.print(F("state=")); Serial.println(state);

    // act according state
    switch (state)
    {
      case 0:
        digitalWrite(ledPinA, HIGH);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 1:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, HIGH);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 2:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, HIGH);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 3:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, HIGH);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 4:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, HIGH);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 5:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, HIGH);
        digitalWrite(ledPinG, LOW);
        break;
      case 6:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, HIGH);
        break;
      case 7:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
    }
    previousMillis = millis();
  }
}

void handleLedsFAST()
{

  static uint32_t previousMillis = 0;
  static byte state = 7;
  if (millis() - previousMillis >= intervalFAST[state])
  {
    // it's time for next state
    state++;
    state = state % 8;
    Serial.print(F("state=")); Serial.println(state);

    // act according state
    switch (state)
    {
      case 0:
        digitalWrite(ledPinA, HIGH);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 1:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, HIGH);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 2:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, HIGH);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 3:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, HIGH);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 4:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, HIGH);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
      case 5:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, HIGH);
        digitalWrite(ledPinG, LOW);
        break;
      case 6:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, HIGH);
        break;
      case 7:
        digitalWrite(ledPinA, LOW);
        digitalWrite(ledPinB, LOW);
        digitalWrite(ledPinC, LOW);
        digitalWrite(ledPinD, LOW);
        digitalWrite(ledPinE, LOW);
        digitalWrite(ledPinF, LOW);
        digitalWrite(ledPinG, LOW);
        break;
    }
    previousMillis = millis();
  }

}



void setup() {
  myservo.attach(3);
  Serial.begin(9600);
  pinMode(3, OUTPUT); // initialize the servo pin as an output
  pinMode(buttonApin, INPUT_PULLUP); // initialize the button A pin as an input
  pinMode(buttonBpin, INPUT_PULLUP); // initialize the button B pin as an input
  pinMode(ledPinA, OUTPUT); // initialize the LED1 pin as an output
  pinMode(ledPinB, OUTPUT); // initialize the LED2 pin as an output
  pinMode(ledPinC, OUTPUT); // initialize the LED3 pin as an output
  pinMode(ledPinD, OUTPUT); // initialize the LED4 pin as an output
  pinMode(ledPinE, OUTPUT); // initialize the LED5 pin as an output
  pinMode(ledPinF, OUTPUT); // initialize the LED6 pin as an output
  pinMode(ledPinG, OUTPUT); // initialize the LED7 pin as an output

  pinMode(12, OUTPUT);    // sets the digital pin 12 as output for 2 SLIDE switch LEDS

  pinMode(ledPinRA, OUTPUT); // initialize the LED pin as an output
  pinMode(ledPinRB, OUTPUT); // initialize the LED pin as an output

  MP3Serial.begin(9600);
  myPlayer.init(PIN_sound_BUSY);      // Init the player with the MP3 BUSY pin connected to Arduino pin defined
}

void loop() {

  digitalWrite(12, HIGH); // sets the digital pin 12 on

  buttonAstate = digitalRead(buttonApin); // read the state of button A value
  buttonBstate = digitalRead(buttonBpin); // read the state of button B value

  // servo position
  if ((buttonAstate == HIGH) && (buttonBstate == HIGH)) {
    myservo.write(0);

    if (!myPlayer.isBusy()) {
      myPlayer.playFile(1, 10);
      //delay(100);
    }

    // LED controls
    handleLedsSLOW();  // checks if something is todo with the LEDs
    //do other important stuff here


    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonAstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRA, LOW);
    } else {
      // turn LED off:
      digitalWrite(ledPinRA, LOW);
    }


    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonBstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRB, LOW);
    } else {
      // turn LED off:
      digitalWrite(ledPinRB, LOW);
    }


  }

  else if (buttonAstate == LOW) { // check if button A is pressed
    myservo.write(35); // if it is rotate servo to 35 degrees

    if (!myPlayer.isBusy()) {
      myPlayer.playFile(2, 10);
      //delay(100);
    }

    handleLedsMEDIUM();  // checks if something is todo with the LEDs
    //do other important stuff here

    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonAstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRA, HIGH);
    } else {
      // turn LED off:
      digitalWrite(ledPinRA, LOW);
    }

  }

  else {
    (buttonBstate == LOW)  // check if button B is pressed
    ; myservo.write(83); // if it is rotate servo to 83 degrees

    if (!myPlayer.isBusy()) {
      myPlayer.playFile(3, 10);
      //delay(100);
    }

    handleLedsFAST();  // checks if something is todo with the LEDs
    //do other important stuff here

    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (digitalRead(buttonBstate) == HIGH) {
      // turn LED on:
      digitalWrite(ledPinRB, HIGH);
    } else {
      // turn LED off:
      digitalWrite(ledPinRB, LOW);
    }
  }

  delay(100);                // waits for a second

}
[/code]

I don't know if this sheds any light on the issue but if i pull the TX wire out of the Uno, or the Busy Pin wire, it causes the servo to constantly pulse & the sound no longer loops, plugging it back in, the servo goes back to twitching/pulsing occasionally when the sound file loops. Sometimes it's just one twitch, sometimes 2 or 3, sometimes no twitch at all.
I bet it's something straightforward that I've missed, any help would be greatly appreciated

Okay best result so far has been changing to NeoSWSerial.h instead SoftwareSerial.h & changing ServoTimer2.h instead of Servo.h.
This has almost eliminated the servo twitch, lucky if it twitches once every 30 secs or more, is there anything else i can try/change in the sketch to remove the twitch?

Do you use Serial for anything other than debugging? If not, try using that to communicate with the music player.

Hi David, Sorry but im still learning about Arduino & i'm not sure what you mean. So far i've been able to take existing sketches that are close to what i want and alter & combine them. How would i change the code to try what you are suggesting, do you have a link to any tutorials?

SUCCESS!!!! Thank you slipstick your recommendations worked!
I changed to AltSoftSerial.h & ServoTimer2.h and that has stopped the servo from twitching & all the functions work just as they should. Thank you :slight_smile:

1 Like

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.