I'm making a speaking skull. Found lot's of info, and finally I've got it to work.
I am using an arduino mega with a adafruit MP3 shield VS1053 on top of it.
It works fine, but to (re-)start it you have to press the reset button. I want the arduino on, and as soon as a button is pressed it start to play the words.
I did found an answere on Reddit: https://www.reddit.com/r/arduino/comments/2bdurt/starting_the_loop_with_the_press_of_a_button/
They proposed :
void loop() { while (digitalread(pin) == LOW) {};
while (1) { // do stuff here, the loop will always repeat } }
or even better at the bottom of the setup()
while (digitalread(pin) == LOW) {}
Then you don't need "while (1) {...}". This is in the code
I tried to put the "{" and "}" almost every where, but I don't get it to work.
BTW: the button has 5 v incomming from the mega, outgoing 10K to gnd and a connection to pin 2.
What do I wrong?
[code]
/*17AUG21
Scope is: when skeleton is outside the coffin, the jaw moves with the spoken words.
This will be activated when the end switch is made. (Have to implement this switch).
jawservo works and eyeleds are working.
*/
/***************************************************
Designed specifically to work with the Adafruit VS1053 Music Maker shield
----> https://www.adafruit.com/product/1788
****************************************************/
// include SPI, MP3 and SD libraries
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
#include <Servo.h>
Servo jaw; // Creates a servo object called jaw
const int jawPin = 8; // Connect jaw to Pin 8
const int ledPin = 9; // Led's on Pin 9
int audioVal = 0; //
const int audioPin = 0; // Connect to audio output to AI Pin 0
const int buttonPin = 2; // Switch Case Open contact connect to Pin 2
int buttonState = 0; // Variable for reading S(witch)C(coffin)O(pen) contact
int busy;
// See http://arduino.cc/en/Reference/SPI "Connections"
// These are the pins used for the music maker shield
#define SHIELD_RESET -1 // VS1053 reset pin (unused!)
#define SHIELD_CS 7 // VS1053 chip select pin (output)
#define SHIELD_DCS 6 // VS1053 Data/command select pin (output)
// These are common pins between breakout and shield
#define CARDCS 4 // Card chip select pin
// DREQ should be an Int pin, see http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin
Adafruit_VS1053_FilePlayer musicPlayer =
Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
void setup()
{
Serial.begin(9600);
jaw.attach(jawPin); // Attaches the jawservo on jawPin
jaw.write(-90); // Put servo on -90 degrees
pinMode(jawPin, OUTPUT);
pinMode (buttonPin, INPUT);
pinMode (ledPin, OUTPUT); // set pin as output
pinMode (ledPin, HIGH); // set pin HIGH or LOW
Serial.println("Adafruit VS1053 Simple_servo Test");
if (! musicPlayer.begin()) { // initialise the music player
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
while (1);
}
Serial.println(F("VS1053 found"));
musicPlayer.sineTest(0x88, 500); // Make a tone to indicate VS1053 is working
if (!SD.begin(CARDCS)) {
Serial.println(F("SD failed, or not present"));
while (1); // don't do anything more
}
Serial.println("SD OK!");
//----list files----
printDirectory(SD.open("/"), 0);
//----Set volume for left, right channels. lower numbers == louder volume!----
musicPlayer.setVolume(5, 5);
// Timer interrupts are not suggested, better to use DREQ interrupt!
//musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // timer int
// If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background
// audio playing
musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int
// Play one file, don't return until complete //Important, track name: 8 letters dot 3 letters.
//Serial.println(F("Playing track 001"));
// musicPlayer.playFullFile("/track001.mp3");
// Play another file in the background, REQUIRES interrupts!
Serial.println(F("Playing track 002"));
musicPlayer.startPlayingFile("/track002.mp3");
while (digitalRead(buttonPin) == LOW){};
}
void loop() {
musicplayer();
}
void musicplayer()
{
int val = analogRead(audioPin);
val = map(val, 250, 1023, 15, 45); // Analog input between 0 and 1023 --> digital output between 0 and 255
jaw.write(val);
audioVal = analogRead(audioPin); // Read the audioPin
digitalWrite(ledPin, audioVal); // Light up the LED's. (original: audioVal / 4)
{
busy = analogRead(audioPin);
// File is playing in the background
if (musicPlayer.stopped()) {
Serial.println("Done playing music");
while (1) {
delay(10); // we're done! do nothing...
}
}
if (Serial.available()) {
char c = Serial.read();
// if we get an 's' on the serial console, stop!
if (c == 's') {
musicPlayer.stopPlaying();
}
// if we get an 'p' on the serial console, pause/unpause!
if (c == 'p') {
if (! musicPlayer.paused()) {
Serial.println("Paused");
musicPlayer.pausePlaying(true);
} else {
Serial.println("Resumed");
musicPlayer.pausePlaying(false);
}
}
}
delay(100);
}
}
/// File listing helper
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
//Serial.println("**nomorefiles**");
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
[/code]