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.
What I want to do now is add sound. I have 3 sound files, 01.mp3, 02.mp3 & 03.mp3. I want 1 sound file to play & loop for each of the 3 stages listed above.
I have a BY8301-16p module that I have loaded the 3 sound files onto.
If I take the input pin 1 of the module and draw it to ground, the sound plays through the speaker, but using the rx and tx pins in the Nano, I cannot get the module to work or play the sound.
I’ve tried using this library GitHub - Critters/MP3FLASH16P: Library for the "MP3 FLASH 16P" MP3/WAV player, which didn't work for me
& i’ve also been trying to use this library GitHub - NachtRaveVL/BY8X01-16P-Arduino: Arduino Library for the BY8001-16P/BY8301-16P Audio Module. but i cant get even the simple example sketch to verify to try it out.
I have added a 1K resistor to the TX Nano & per the instructions on the NachtRaveVL library page, I have removed the surface mount resistors on the device at points A, B & C. Everything is on a breadboard & is being powered from the PC usb plugged into the arduino board and the 5v pin of the arduino to the vcc pin of the sound board & the servo motor
I’ve been stuck on this for the last week & i realise it’ll be something that i’ve missed, coded wrongly or just misunderstood.
I REALLY need some advice on how best to wire up the board and the correct code, which library I should be using, or if there is a simple way to add the 3 sound files that I haven't considered, any help would be greatly appreciated by this Arduino newbie.
[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]


