Go Down

Topic: Inglobare un programma in un altro (Read 149 times) previous topic - next topic

Stilita

Jun 20, 2019, 09:06 am Last Edit: Jun 20, 2019, 09:34 am by Stilita
...Cerco di spiegarmi:
ho fatto uno scketch di 90 righe, al suo interno è previsto l'attivazione di un avviso(cicalino) per 15 secondi.
Invece di usare  due note alternate vorrei richiamare una melodia, ad esempio questa

https://www.princetronics.com/supermariothemesong/

solo che questo è lungo più del mio programma, sarebbe una confusione galattica.

Come potrei fare?

Grazie.
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

torn24

Ciao! Ho visionato il link e parliamo solo di questo caso specifico. Perché in linea generale non è sempre possibile unire due programmi :)

In questo caso particolare... Puoi usare un altra scheda dell'IDE arduino, li inserisci il programma da te linkato. Dovrai eliminare la funzione setup() e loop() che saranno quelle del tuo programma principale, copia il contenuto del setup() del programma linkato e inserisci il contenuto nel tuo setup, nel loop() del programma linkato ci sono chiamate a funzione, tu quella funzione la richiamerai nel tuo loop() quando vuoi generare il suono.

Controlla che i pin usati dal programma linkato non sono già usati dal tuo programma, in tal caso metti pin che non usi...

docdoc

solo che questo è lungo più del mio programma, sarebbe una confusione galattica.
Beh considera che la lunghezza del listato non implica necessariamente una corrispondente maggiore dimensione del programma compilato...

In quel listato ci sono tante #define che non hanno alcuna corrispondenza con il codice compilato, quindi la parte principale sono gli array che definiscono le note, e la funzione che le suona.

Nell'esempio ci sono due melodie, potresti togliere tutti i riferimento ad una e già il codice diventerebbe più piccolo. Ad es. Underworld, quindi rimuovere gli array underworld_melody[] e underworld_tempo[]  e tutta la "if (song == 2) { ... }" lasciando solo quello che ora è dentro all'"else". In pratica la "sing()" diventerebbe semplicemente:

Code: [Select]
void sing() {
    int size = sizeof(melody) / sizeof(int);
    for (int thisNote = 0; thisNote < size; thisNote++)
    {
      int noteDuration = 1000 / tempo[thisNote];
      buzz(melodyPin, melody[thisNote], noteDuration);
      int pauseBetweenNotes = noteDuration * 1.30;
      delay(pauseBetweenNotes);
      buzz(melodyPin, 0, noteDuration);
    }
  }


Al che quando vuoi suonare SuperMario ti basta inserire il comando:

sing();

ed hai fatto.

Altre alternative sono solo hardware, aggiungendo un modulino MP3/SD dove potresti avere svariati brani, e non solo singole note ma proprio audio.
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

Go Up