I've been tinkering around and have made considerable progress with doing multiple things as once. I have, however, encountered a problem.
I'm able to start my program and it turns on an LED and keeps it on while playing a sound file. The problem is that it seems to ignore the millis-related code. The LED won't turn off after the specified "OnTime." It just turns on at the start of the program and stays on. Attached is the .ino file.
Any help would be much appreciated. Hopefully it's just a simple beginner's mistake.
Thanks!
/***************************************************
This is an example for the Adafruit VS1053 Codec Breakout
Designed specifically to work with the Adafruit VS1053 Codec Breakout
----> https://www.adafruit.com/products/1381
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/
// include SPI, MP3 and SD libraries
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
// These are the pins used for the breakout example
#define BREAKOUT_RESET 9 // VS1053 reset pin (output)
#define BREAKOUT_CS 10 // VS1053 chip select pin (output)
#define BREAKOUT_DCS 8 // VS1053 Data/command select pin (output)
// 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
const int uplighting = 2;
int uplightingState = HIGH;
long previousMillis1 = 0;
long OnTime1 = (101000);
long OffTime1 = (15000);
const int flicker1 = 9;
const int flicker2 = 5;
const int lightning = 8;
const int servo = 10;
const int button = 1;
Adafruit_VS1053_FilePlayer musicPlayer =
// create breakout-example object!
//Adafruit_VS1053_FilePlayer(BREAKOUT_RESET, BREAKOUT_CS, BREAKOUT_DCS, DREQ, CARDCS);
// create shield-example object!
Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
////
void setup() {
Serial.begin(9600);
Serial.println("Adafruit VS1053 Library Test");
pinMode(uplighting, OUTPUT);
pinMode(flicker1, OUTPUT);
pinMode(flicker2, OUTPUT);
pinMode(lightning, OUTPUT);
pinMode(servo, OUTPUT);
pinMode(button, INPUT);
// initialise the music player
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(0x44, 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(15,15);
/***** Two interrupt options! *******/
// This option uses timer0, this means timer1 & t2 are not required
// (so you can use 'em for Servos, etc) BUT millis() can lose time
// since we're hitchhiking on top of the millis() tracker
//musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT);
// This option uses a pin interrupt. No timers required! But DREQ
// must be on an interrupt pin. For Uno/Duemilanove/Diecimilla
// that's Digital #2 or #3
// See http://arduino.cc/en/Reference/attachInterrupt for other pins
// *** This method is preferred
if (! musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT))
Serial.println(F("DREQ pin is not an interrupt pin"));
}
void loop() {
// Start playing a file, then we can do stuff while waiting for it to finish
if (! musicPlayer.startPlayingFile("track001.mp3")) {
Serial.println("Could not open file track001.mp3");
while (1);
}
Serial.println(F("Started playing"));
while (musicPlayer.playingMusic) {
// file is now playing in the 'background' so now's a good time
// to do something else like handling LEDs or buttons :)
// check to see if it's time to change the state of the LED
unsigned long currentMillis = millis();
if((uplightingState == HIGH) && (currentMillis - previousMillis1 >= OnTime1))
{
uplightingState = LOW; // Turn it off
previousMillis1 = currentMillis; // Remember the time
digitalWrite(uplighting, uplightingState); // Update the actual LED
}
else if ((uplightingState == LOW) && (currentMillis - previousMillis1 >= OffTime1))
uplightingState = HIGH; // turn it on
previousMillis1 = currentMillis; // Remember the time
digitalWrite(uplighting, uplightingState); // Update the actual LED
}
Serial.println("Done playing music");
}
/// 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();
}
}
Moderator edit: code added to post for mobile users
HMSR2.ino (5.22 KB)