ciao ragazzi... ci sto provando già da un po' ma non riesco a risolvere il problema... vi spiego riassumendo:
il mio programma deve riprodurre una melodia da suspance (quella di fringe e fino a quì tutto ok... il punto è che la melodia dura un po', quindi prima che finisca passano alcuni secondi, durante i quali il programma rimane bloccato...
quello che vorrei fare è fermare immediatamente la riproduzione dela melodia al cambio di stato di un pulsante... come cappero faccio? cioè mentre la melodia suona, non riesco a leggere il cambio di stato del pulsante, e quindi non riesco a far "accendere il mio ipotetico led", se non alla fine della stessa... qualche idea? ho provato con while, e for, ma niente...
#include "pitches.h"
int ledRosso = 4;
int ledBlu = 5;
int pulsanteRosso = 2;
int pulsanteBlu = 3;
int sirena = 6;
int statoRosso = 0;
int statoBlu = 0;
int melody[] = {
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};
int noteDurations[] = {
4, 8, 8, 4,4,4,4,4 };
void setup(){
pinMode (ledRosso, OUTPUT);
pinMode (ledBlu, OUTPUT);
pinMode (pulsanteRosso, INPUT);
pinMode (pulsanteBlu, INPUT);
pinMode (sirena, OUTPUT);
}
void loop() {
statoRosso=digitalRead(pulsanteRosso);
if (statoRosso==HIGH){
digitalWrite(ledRosso, HIGH);
for (int i=0; i<=5; i++){
noTone(sirena);
tone(sirena, 880, 200);
delay(50);
noTone(sirena);
tone(sirena, 1000, 200);
delay(50);
noTone(sirena);
tone(sirena, 1400, 200);
delay(50);
}
delay(1000);
digitalWrite(ledRosso, LOW);
}
else if(statoRosso==LOW){
melodia();
}
}
void melodia(){
for (int thisNote = 0; thisNote < 8; thisNote++) {
// to calculate the note duration, take one second
// divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000/noteDurations[thisNote];
tone(sirena, melody[thisNote],noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(sirena);
}
}