[RISOLTO] Progetto beep da tastiera

Ciao ragazzi, sono nuovo sia nel forum sia nel fare questo tipo di progetti. Sto provando a progettare un rover, un robot che si muove comandato da me tramite seriale. Quello che vorrei aggiungere è il suono del beep (cicalino) quando premo un tasto da tastiera. La canzone che vorrei si sentisse è la marcia imperiale di cui ho postato il codice ma non la vorrei in loop così come è impostato. Vorrei che prendo il pulsante da tastiera, riproduce una sola volta la canzone e poi si ferma. Come potrei fare? Qualcuno potrebbe aiutarmi ad aggiungere il controllo da tastiera e a togliere il loop? Grazie mille

int ledPin = 10;
//led for visualization (use 13 for built-in led)

int speakerPin = 11;
//speaker connected to one of the PWM ports

#define c 261
#define d 294
#define e 329
#define f 349
#define g 391
#define gS 415
#define a 440
#define aS 455
#define b 466
#define cH 523
#define cSH 554
#define dH 587
#define dSH 622
#define eH 659
#define fH 698
#define fSH 740
#define gH 784
#define gSH 830
#define aH 880
//frequencies for the tones we're going to use
//used http://home.mit.bme.hu/~bako/tonecalc/tonecalc.htm to get these

void setup()    
{    
 pinMode(ledPin, OUTPUT);
 // sets the ledPin to be an output
 pinMode(speakerPin, OUTPUT);  
 //sets the speakerPin to be an output
}    
    
void loop()   // run over and over again
{
 march();
}    
    
void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
{ 
   digitalWrite(ledPin, HIGH);  
   //use led to visualize the notes being played
   
   int x;   
   long delayAmount = (long)(1000000/frequencyInHertz);
   long loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2));
   for (x=0;x<loopTime;x++)   
   {    
       digitalWrite(speakerPin,HIGH);
       delayMicroseconds(delayAmount);
       digitalWrite(speakerPin,LOW);
       delayMicroseconds(delayAmount);
   }    
   
   digitalWrite(ledPin, LOW);
   //set led back to low
   
   delay(20);
   //a little delay to make all notes sound separate
}    
    
void march()
{    
   //for the sheet music see:
   //http://www.musicnotes.com/sheetmusic/mtd.asp?ppn=MN0016254
   //this is just a translation of said sheet music to frequencies / time in ms
   //used 500 ms for a quart note
   
   beep(speakerPin, a, 500); 
   beep(speakerPin, a, 500);     
   beep(speakerPin, a, 500); 
   beep(speakerPin, f, 350); 
   beep(speakerPin, cH, 150);
   
   beep(speakerPin, a, 500);
   beep(speakerPin, f, 350);
   beep(speakerPin, cH, 150);
   beep(speakerPin, a, 1000);
   //first bit
   
   beep(speakerPin, eH, 500);
   beep(speakerPin, eH, 500);
   beep(speakerPin, eH, 500);    
   beep(speakerPin, fH, 350); 
   beep(speakerPin, cH, 150);
   
   beep(speakerPin, gS, 500);
   beep(speakerPin, f, 350);
   beep(speakerPin, cH, 150);
   beep(speakerPin, a, 1000);
   //second bit...
   
   beep(speakerPin, aH, 500);
   beep(speakerPin, a, 350); 
   beep(speakerPin, a, 150);
   beep(speakerPin, aH, 500);
   beep(speakerPin, gSH, 250); 
   beep(speakerPin, gH, 250);
   
   beep(speakerPin, fSH, 125);
   beep(speakerPin, fH, 125);    
   beep(speakerPin, fSH, 250);
   delay(250);
   beep(speakerPin, aS, 250);    
   beep(speakerPin, dSH, 500);  
   beep(speakerPin, dH, 250);  
   beep(speakerPin, cSH, 250);  
   //start of the interesting bit
   
   beep(speakerPin, cH, 125);  
   beep(speakerPin, b, 125);  
   beep(speakerPin, cH, 250);      
   delay(250);
   beep(speakerPin, f, 125);  
   beep(speakerPin, gS, 500);  
   beep(speakerPin, f, 375);  
   beep(speakerPin, a, 125); 
   
   beep(speakerPin, cH, 500); 
   beep(speakerPin, a, 375);  
   beep(speakerPin, cH, 125); 
   beep(speakerPin, eH, 1000); 
   //more interesting stuff (this doesn't quite get it right somehow)
   
   beep(speakerPin, aH, 500);
   beep(speakerPin, a, 350); 
   beep(speakerPin, a, 150);
   beep(speakerPin, aH, 500);
   beep(speakerPin, gSH, 250); 
   beep(speakerPin, gH, 250);
   
   beep(speakerPin, fSH, 125);
   beep(speakerPin, fH, 125);    
   beep(speakerPin, fSH, 250);
   delay(250);
   beep(speakerPin, aS, 250);    
   beep(speakerPin, dSH, 500);  
   beep(speakerPin, dH, 250);  
   beep(speakerPin, cSH, 250);  
   //repeat... repeat
   
   beep(speakerPin, cH, 125);  
   beep(speakerPin, b, 125);  
   beep(speakerPin, cH, 250);      
   delay(250);
   beep(speakerPin, f, 250);  
   beep(speakerPin, gS, 500);  
   beep(speakerPin, f, 375);  
   beep(speakerPin, cH, 125); 
          
   beep(speakerPin, a, 500);            
   beep(speakerPin, f, 375);            
   beep(speakerPin, c, 125);            
   beep(speakerPin, a, 1000);       
   //and we're done \ó/    
}

Buongiorno,
prima di tutto, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

... E poi, se sei nuovo del mondo di Arduino ti consiglio di cominciare da qualcosa di più sempoice e di andare per gradi. Questo NON vuol dire "rinuncia", ma vuol dire " diluisci", o se preferisci "positcipa a quando saprai veramente fare". Imara con i ritmi giusti e vedi che ci esci

Silente:
... E poi, se sei nuovo del mondo di Arduino ti consiglio di cominciare da qualcosa di più sempoice e di andare per gradi. Questo NON vuol dire "rinuncia", ma vuol dire " diluisci", o se preferisci "positcipa a quando saprai veramente fare". Imara con i ritmi giusti e vedi che ci esci

E' per un progetto universitario, purtroppo non ho molto tempo per poter iniziare dai concetti base. Tuttavia ho visto qualcosa di più semplice ma ho difficoltà in questo caso. Il resto del codice l'ho scritto ed è completo, mi manca solo questo.

Condiziona l'esecusione di quello che hai scritto con una "flag" ... se è falsa, non fai nulla, se è vera, esegui quel codice e la rimetti falsa.

Sempre nel loop controlli un pulsante, se viene premuto, fai il tuo beep e poi metti la flag a vera così viene eseguito il codice.

In pratica ... la flag è inizialmente falsa ...

  1. verifica la flag
    1.1 se vera:
    1.1.1 suoni la musica
    1.1.2 metti la flag falsa
  2. leggi bottone
    2.1 bottone NON premuto, torna ad 1.
    2.2 bottone premuto :
    2.2.1 fai il beep
    2.2 2 metti la flag a vero e vai ad 1.

Spero sia chiara la logica ...

Guglielmo

gpb01:
Condiziona l'esecusione di quello che hai scritto con una "flag" ... se è falsa, non fai nulla, se è vera, esegui quel codice e la rimetti falsa.

Sempre nel loop controlli un pulsante, se viene premuto, fai il tuo beep e poi metti la flag a vera così viene eseguito il codice.

In pratica ... la flag è inizialmente falsa ...

  1. verifica la flag
    1.1 se vera:
    1.1.1 suoni la musica
    1.1.2 metti la flag falsa
  2. leggi bottone
    2.1 bottone NON premuto, torna ad 1.
    2.2 bottone premuto :
    2.2.1 fai il beep
    2.2 2 metti la flag a vero e vai ad 1.

Spero sia chiara la logica ...

Guglielmo

Si certo, la logica è molto chiara. Ora proverò a trasformarla in codice sperando di riuscirci. Grazie mille

fra_meccatr:
Si certo, la logica è molto chiara. Ora proverò a trasformarla in codice sperando di riuscirci. Grazie mille

Nulla, purtroppo non riesco. Ci provo da due giorni ma nulla..

Nel setup() dichiari una variablile

byte miaFlag = false;

nel loop() verifichi la flag:

if (miaFlag) {
   miaFlag = false;
   // suoni la musichetta
   ...
   ...
}
...
// leggi il bottone e se premuto metti miaFlag a true e fai un beep
...
...

...a te scriverlo.

Guglielmo

gpb01:
Nel setup() dichiari una variablile

byte miaFlag = false;

nel loop() verifichi la flag:

if (miaFlag) {

miaFlag = false;
  // suoni la musichetta
  ...
  ...
}
...
// leggi il bottone e se premuto metti miaFlag a true e fai un beep
...
...




...a te scriverlo.

Guglielmo

Grazie mille, ora ci riprovo! Gentilissimo