Does anyone knows how to change delay() into millis() in ToneMelody function (https://www.arduino.cc/en/Tutorial/toneMelody). It would be nice if there is some explanation.
Have you tried to do it yourself ?
UKHeliBob:
Have you tried to do it yourself ?
Yes, a little bit. But I don't understand how to get there so it would be nice if someone explained it to me. Maybe I can try it myself after that. I'm not supposed to get the whole code, but more the explanation so I can try it myself.
Have you looked at Using millis() for timing. A beginners guide, Several things at the same time and the BlinkWithoutDelay example in the IDE ?
UKHeliBob:
Have you looked at Using millis() for timing. A beginners guide, Several things at the same time and the BlinkWithoutDelay example in the IDE ?
Yes I have, but I don't know how to implement this in my code.
What do you want the final sketch to do ?
larryd:
What do you want the final sketch to do ?
I am making a music player with buttons, 7 segment display etc. You can push for next or previous melody. I have made a function with a part from arduino.cc (toneMelody):
void playMelody (int melody)
…..
….
else if (melody == 3){
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations3[thisNote];
tone(speaker, melody3[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(speaker);
}
}
…….
…...
I would like to replace the delay for millis, because it's blocking the rest of my code.
Try this:
// Version YY/MM/DD
// 1.00 20/02/30 Running code
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
#define PUSHED LOW
//***********************************************************************
// notes in the melody:
int melody[] =
{
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] =
{
4, 8, 8, 4, 4, 4, 4, 4
};
const byte playSongSwitch = 2; //LOW = pushed
const byte tonePin = 8;
const byte heartbeatLED = 13;
byte counter;
byte lastPlaySongSwitch;
bool playingFlag = false;
int noteDuration;
//timing stuff
unsigned long heartbeatMillis;
unsigned long nextNoteMillis;
unsigned long switchMillis;
unsigned long pauseBetweenNotes;
//***********************************************************************
void setup()
{
pinMode(heartbeatLED, OUTPUT);
pinMode(playSongSwitch, INPUT_PULLUP);
lastPlaySongSwitch = digitalRead(playSongSwitch);
} //END of setup()
//***********************************************************************
void loop()
{
//*********************************
//heartbeat LED will toggle as long as the sketch is non blocking
if (millis() - heartbeatMillis >= 200)
{
//restart timer
heartbeatMillis = millis();
//toggle LED
digitalWrite(heartbeatLED , !digitalRead(heartbeatLED));
}
//*********************************
//time to check our switches ?
if (millis() - switchMillis >= 50)
{
//restart timer
switchMillis = millis();
checkSwitches();
}
//*********************************
//should we process the next note ?
if (playingFlag == true && millis() - nextNoteMillis > pauseBetweenNotes)
{
//restart timer
nextNoteMillis = millis();
playTune();
}
} //END of loop()
//***********************************************************************
void checkSwitches()
{
byte currentState;
//****************************
currentState = digitalRead(playSongSwitch);
//has this switch changed state ?
if (lastPlaySongSwitch != currentState)
{
//update to the new state
lastPlaySongSwitch = currentState;
//if we are not playing a tune, was the switch closed ?
if (playingFlag == false && currentState == PUSHED)
{
//enablePlaying
playingFlag = true;
counter = 0;
}
}
//****************************
} //END of checkSwitches()
//***********************************************************************
void playTune()
{
noTone(8);
noteDuration = 1000 / noteDurations[counter];
tone(8, melody[counter], noteDuration);
pauseBetweenNotes = noteDuration * 1.30;
//next note
counter++;
//are we finished ?
if (counter >= 8)
{
counter = 0;
//we are finished, disable playing
playingFlag = false;
}
} //END of playTune()
//***********************************************************************
larryd, thanks for this. Sorrym but this isn't what i need. I have written some code, so I would like to hold that. Could you also give an example how to do this in my function (the code above of me)? Maybe I can try to understand it better then.
There is more than enough documentation in post #7's sketch to show you how to proceed.
The sketch shows how BWD can be incorporated with playing tunes and how a switch can start the process.
The important lines and blocks of code have been commented for you.