Show Posts
Pages: 1 ... 15 16 [17] 18 19
241  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 06:26:03 pm
miiiii non l'avevo visto smiley-razz
è agli antipodi dell'if.
e se i facessi while una cosa tipo play_rtttl & luce = true?

mmm... puoi spiegarmi meglio non ho capito scusaa..
242  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 01:10:53 pm
esattamente... solo che non va..
243  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 12:55:16 pm
scusa ma la funzione che suona la melodia non è play_rtttl ?

sisi è proprio lei.. play_rtttl si occupa di suonare la melodia..
244  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 12:39:46 pm
e io che pensavo che quel delay servisse a far finire tutta la melodia e non solo una nota  smiley-sad-blue
ma la variabile note dove viene inizializzata?

guarda questo è il codice completo.. così controlli per bene stesso tu..
Code:
#include <Tone.h>
#include <LiquidCrystal.h>
int controllo_lum(int);

// inizializzo display LCD
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);


Tone tone1;

//setto i PIN
int photocellPin = 0;     // the cell and 10K pulldown are connected to a0
int photocellReading;     // the analog reading from the sensor divider
int LEDpin = 6;          // connect Red LED to pin 11 (PWM pin)
int LEDbrightness;

#define OCTAVE_OFFSET 0

int notes[] = { 0,
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};
//CANZONI DISPINIBILI IN RTTTL

char *song = "The Simpsons:d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p,8f#,8f#,8f#,8g,a#.,8c6,8c6,8c6,c6";
//char *song = "Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6";

void setup(void)
{
 
  Serial.begin(9600);
  tone1.begin(7);          //porta a cui e connesso lo speaker
  lcd.begin(16, 2);        //setto colonne e righe display
   lcd.setCursor(0,0);      //setto il cursore sopra a sinistra
  lcd.print("CIAO");
}

void loop()
{
  photocellReading = analogRead(photocellPin); 
 
  //Serial.print("Analog reading = ");
  //Serial.println(photocellReading);     // the raw analog reading
 
  // LED gets brighter the darker it is at the sensor
  // that means we have to -invert- the reading from 0-1023 back to 1023-0
 
  photocellReading = 1023 - photocellReading;
  //now we have to map 0-1023 to 0-255 since thats the range analogWrite uses
 
  photocellReading = constrain(photocellReading, 600, 1023); //<-- il 970 potete cambiarlo
 
  LEDbrightness = map(photocellReading, 600, 1023, 0, 255);
 
  analogWrite(LEDpin, LEDbrightness);
  delay(100);
   play_rtttl(song);
  }
#define isdigit(n) (n >= '0' && n <= '9')

void play_rtttl(char *p)
{
  // Absolutely no error checking in here

  byte default_dur = 4;
  byte default_oct = 6;
  int bpm = 63;
  int num;
  long wholenote;
  long duration;
  byte note;
  byte scale;
  int luce;
  luce = LEDbrightness;

  // format: d=N,o=N,b=NNN:
  // find the start (skip name, etc)

  while(*p != ':') p++;    // ignore name
  p++;                     // skip ':'

  // get default duration
  if(*p == 'd')
  {
    p++; p++;              // skip "d="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    if(num > 0) default_dur = num;
    p++;                   // skip comma
  }

  Serial.print("ddur: "); Serial.println(default_dur, 10);

  // get default octave
  if(*p == 'o')
  {
    p++; p++;              // skip "o="
    num = *p++ - '0';
    if(num >= 3 && num <=7) default_oct = num;
    p++;                   // skip comma
  }

  Serial.print("doct: "); Serial.println(default_oct, 10);

  // get BPM
  if(*p == 'b')
  {
    p++; p++;              // skip "b="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    bpm = num;
    p++;                   // skip colon
  }

  Serial.print("bpm: "); Serial.println(bpm, 10);

  // BPM usually expresses the number of quarter notes per minute
  wholenote = (60 * 1000L / bpm) * 4;  // this is the time for whole note (in milliseconds)

  Serial.print("wn: "); Serial.println(wholenote, 10);


  // now begin note loop
  while(*p)
  {
    // first, get note duration, if available
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
   
    if(num) duration = wholenote / num;
    else duration = wholenote / default_dur;  // we will need to check if we are a dotted note after

    // now get the note
    note = 0;

    switch(*p)
    {
      case 'c':
        note = 1;
        break;
      case 'd':
        note = 3;
        break;
      case 'e':
        note = 5;
        break;
      case 'f':
        note = 6;
        break;
      case 'g':
        note = 8;
        break;
      case 'a':
        note = 10;
        break;
      case 'b':
        note = 12;
        break;
      case 'p':
      default:
        note = 0;
    }
    p++;

    // now, get optional '#' sharp
    if(*p == '#')
    {
      note++;
      p++;
    }

    // now, get optional '.' dotted note
    if(*p == '.')
    {
      duration += duration/2;
      p++;
    }
 
    // now, get scale
    if(isdigit(*p))
    {
      scale = *p - '0';
      p++;
    }
    else
    {
      scale = default_oct;
    }

    scale += OCTAVE_OFFSET;

    if(*p == ',')
      p++;       // skip comma for next note (or we may be at the end)

    // now play the note
   
   
   
    if((note) && (luce>1))
    {
      Serial.print("Playing: ");
      Serial.print(scale, 10); Serial.print(' ');
      Serial.print(note, 10); Serial.print(" (");
      Serial.print(notes[(scale - 4) * 12 + note], 10);
      Serial.print(") ");
      Serial.println(duration, 10);
      tone1.play(notes[(scale - 4) * 12 + note]);
      delay(duration);
      tone1.stop();
    }
    else
    {
    return;
   //Serial.print("Pausing: ");
   //Serial.println(duration, 10);
    //delay(duration);
    }
    }
   
  }

sembra faccia uso di uno switch..
245  Using Arduino / Audio / Re: tone.h melody when led is ON on: September 02, 2011, 11:21:10 am
If you want the turning off of the LED to be more responsive, change play_rtttl(char *p) to check after every note to see if the LED should be turned off.  If you turn off the LED, return from the play_rtttl(char *p) function to end the melody.

ok.. but, when i can chek if the led is on or off ?!

this is the complete code:
Code:
#include <Tone.h>
#include <LiquidCrystal.h>
int controllo_lum(int);

// inizializzo display LCD
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);


Tone tone1;

//setto i PIN
int photocellPin = 0;     // the cell and 10K pulldown are connected to a0
int photocellReading;     // the analog reading from the sensor divider
int LEDpin = 6;          // connect Red LED to pin 11 (PWM pin)
int LEDbrightness;

#define OCTAVE_OFFSET 0

int notes[] = { 0,
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};
//CANZONI DISPINIBILI IN RTTTL

char *song = "The Simpsons:d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p,8f#,8f#,8f#,8g,a#.,8c6,8c6,8c6,c6";
//char *song = "Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6";

void setup(void)
{
 
  Serial.begin(9600);
  tone1.begin(7);          //porta a cui e connesso lo speaker
  lcd.begin(16, 2);        //setto colonne e righe display
   lcd.setCursor(0,0);      //setto il cursore sopra a sinistra
  lcd.print("CIAO");
}

void loop()
{
  photocellReading = analogRead(photocellPin); 
 
  //Serial.print("Analog reading = ");
  //Serial.println(photocellReading);     // the raw analog reading
 
  // LED gets brighter the darker it is at the sensor
  // that means we have to -invert- the reading from 0-1023 back to 1023-0
 
  photocellReading = 1023 - photocellReading;
  //now we have to map 0-1023 to 0-255 since thats the range analogWrite uses
 
  photocellReading = constrain(photocellReading, 600, 1023); //<-- il 970 potete cambiarlo
 
  LEDbrightness = map(photocellReading, 600, 1023, 0, 255);
 
  analogWrite(LEDpin, LEDbrightness);
  delay(100);
   play_rtttl(song);
  }
#define isdigit(n) (n >= '0' && n <= '9')

void play_rtttl(char *p)
{
  // Absolutely no error checking in here

  byte default_dur = 4;
  byte default_oct = 6;
  int bpm = 63;
  int num;
  long wholenote;
  long duration;
  byte note;
  byte scale;
  int luce;
  luce = LEDbrightness;

  // format: d=N,o=N,b=NNN:
  // find the start (skip name, etc)

  while(*p != ':') p++;    // ignore name
  p++;                     // skip ':'

  // get default duration
  if(*p == 'd')
  {
    p++; p++;              // skip "d="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    if(num > 0) default_dur = num;
    p++;                   // skip comma
  }

  Serial.print("ddur: "); Serial.println(default_dur, 10);

  // get default octave
  if(*p == 'o')
  {
    p++; p++;              // skip "o="
    num = *p++ - '0';
    if(num >= 3 && num <=7) default_oct = num;
    p++;                   // skip comma
  }

  Serial.print("doct: "); Serial.println(default_oct, 10);

  // get BPM
  if(*p == 'b')
  {
    p++; p++;              // skip "b="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    bpm = num;
    p++;                   // skip colon
  }

  Serial.print("bpm: "); Serial.println(bpm, 10);

  // BPM usually expresses the number of quarter notes per minute
  wholenote = (60 * 1000L / bpm) * 4;  // this is the time for whole note (in milliseconds)

  Serial.print("wn: "); Serial.println(wholenote, 10);


  // now begin note loop
  while(*p)
  {
    // first, get note duration, if available
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
   
    if(num) duration = wholenote / num;
    else duration = wholenote / default_dur;  // we will need to check if we are a dotted note after

    // now get the note
    note = 0;

    switch(*p)
    {
      case 'c':
        note = 1;
        break;
      case 'd':
        note = 3;
        break;
      case 'e':
        note = 5;
        break;
      case 'f':
        note = 6;
        break;
      case 'g':
        note = 8;
        break;
      case 'a':
        note = 10;
        break;
      case 'b':
        note = 12;
        break;
      case 'p':
      default:
        note = 0;
    }
    p++;

    // now, get optional '#' sharp
    if(*p == '#')
    {
      note++;
      p++;
    }

    // now, get optional '.' dotted note
    if(*p == '.')
    {
      duration += duration/2;
      p++;
    }
 
    // now, get scale
    if(isdigit(*p))
    {
      scale = *p - '0';
      p++;
    }
    else
    {
      scale = default_oct;
    }

    scale += OCTAVE_OFFSET;

    if(*p == ',')
      p++;       // skip comma for next note (or we may be at the end)

    // now play the note
   
   
   
    if((note) && (luce>1))
    {
      Serial.print("Playing: ");
      Serial.print(scale, 10); Serial.print(' ');
      Serial.print(note, 10); Serial.print(" (");
      Serial.print(notes[(scale - 4) * 12 + note], 10);
      Serial.print(") ");
      Serial.println(duration, 10);
      tone1.play(notes[(scale - 4) * 12 + note]);
      delay(duration);
      tone1.stop();
    }
    else
    {
    return;
   //Serial.print("Pausing: ");
   //Serial.println(duration, 10);
    //delay(duration);
    }
    }
   
  }

where i can check the led?!

I am a beginner with arduino  smiley-sad

Thanks !!
246  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 10:51:15 am
io non ho capito ancora se non cammima il puntatore o se il delay(duation) non dà il tempo di avanzare smiley-sweat
per prova potresti sostituire duration con un numero tipo 5000?

"delay (duration)" è fondamentale a quanto pare.. già avevo provato a fare questo tentativo... praticamente se si sostituisce a duration un intero tipo 5000... ogni nota suona per 5 secondi.. quindi è una cosa fondamentale, sarebbe i millisecondi che la nota deve suonare..
247  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 09:57:42 am
ma usare while in entrata no? smiley-roll

Ho provato in questo modo:
Code:

 while (luce>1)

   

     if(note)
     {
   
      Serial.print("Playing: ");
      Serial.print(scale, 10); Serial.print(' ');
      Serial.print(note, 10); Serial.print(" (");
      Serial.print(notes[(scale - 4) * 12 + note], 10);
      Serial.print(") ");
      Serial.println(duration, 10);
      tone1.play(notes[(scale - 4) * 12 + note]);
      delay(duration);
      tone1.stop();
     }
   
    else
    {
     // return;
   Serial.print("Pausing: ");
   Serial.println(duration, 10);
   delay(duration);
      }

ho messo quindi
Code:
while (luce >1)

ma non va a quanto pare.. appena rivela la luce il risultato è quello che ho messo in allegato.. suona sempre una nota.. e ad esempio riaccendendo la luce nella stanza.. la fotoresistenza non rivela niente, il led non si spenge.. e la nota continua all'infinito.. smiley-roll
248  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 09:45:30 am
No, solo per il PWM .

Capito.. quindi non ci dovrebbero essereci di questi problemi.. Oddio inizio a non sopportare questo problema..xD E' anche poco documentato questo argomento comunque.. cioè alemno io non ho trovato quasi niente su qualcuno che vorrebbe far riprodurre una melodia quando si verifica una condizione.. e poi staccarsi quando quella condizione non ce.. anche di esempi con la tone.h non ne ho travati granchè..  smiley-confuse
249  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 09:27:24 am
Ah, ho capito. Luce indica l'intensità del led, non il rilevamento fatto dalla fotocellula.
Però ti suona sempre la stessa nota. Quindi nell'if ci entra ma il puntatore non viene aggiornato e ad ogni passatto nell'if ripete la stessa nota.

Ricorda che l'if non è come il while. L'If è una condizione controllata per entrare in una porzione di codice. Mentre il while è un controllo sull'uscita. Quindi dall'if il micro esce.

C'è un'altra possibilità. Nell'if hai:
tone1.play(notes[(scale - 4) * 12 + note]);
delay(duration);
tone1.stop();

Ho letto che tone() non è compatibile con la funzione PWM sui pin 3 e 11 perché usa lo stesso timer del segnale PWM. Tu che pin usi?

Questi sono i pin che uso:

Fotoresistenza: PIN analogico 0
LED: PIN digitale 6
Speaker: PIN digitale7

Quindi non dobrebbero esserci problemi di compatibilità giusto?

Comunque il pin digitale 3 ed 11 sono collegati al display.. (potrebbe essere questo il problema?)

Grazie!
250  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 09:04:30 am
Hai stampato sulla seriale i valori delle variabili prima dell'if?

Ciao, ho fatto le prove che mi avevi detto, lascio in allegato un file che mostra la situazione! La condizione if a questo punto dovrebbe funzionare tranquillamente o no? solo che non va per niente. smiley-sad Secondo me sto sbagliando il controllo dell'if.. non devo farlo lì.. perchè praticamente quello dice che se ce una nota, riproducila.. altrimenti "pausing..."  smiley-confuse
251  Using Arduino / Audio / tone.h melody when led is ON on: September 02, 2011, 08:01:50 am
Hello, I'm Italian, it is possible to make a melody to arduino ONLY when the LED is on?! Let me explain:

I connected a LED that lights up with photoresistor, if the LED is dark.

I wish that when the LED is on starts a tune, but as soon as the LED turns off the melody stops suddenly!

I'm finding some difficulties because I have basically implemented <tune.h> the library, and the melody part peacefully as soon as I turn on the LED lights up, but then to make sure that the LED turns off I have to wait until the end of the melody! smiley-eek-blue

That is how I found that if the function to play the melody RTTTL need to finish to complete the whole ..

LINK WITH CODE THAT I HAVE USED:
http://code.google.com/p/arduino-tone/source/browse/trunk/examples/RTTTL/RTTTL.pde?r=4

As soon as the song ends the LED turns off .. but I would like to return possibly as soon as the light, the LED goes out, and the melody stops.

Thanks in advance!
252  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 05:27:01 am
Se l'if non funziona è perché una delle due condizioni è false.
Magari metti le parentesi fra le condizioni:
if ((tone) && (luce>1))
non vorrei che ti eseguisse (tone && luce) e poi (>1)

Il fatto secondo me è che l'if funziona.. perchè lui si accorge che luce è maggiore di 1, e che note sta ad indicare che ce una nota da suonare..
quindi,  se (ce una nota da suonare && luce è maggiore di 1) riproduci quella nota.. Infatti appena con l'arduino avviato e la luce in camera accesa non succede nulla.. (perchè luce non è maggiore di 1 in quel momento). Non appena spengo la luce inizia a suonare (perchè luce in quel momento è maggiore di 1). Per questo dico che l'if dovrebbe funzionare.. solo che non suona tutte le note come dovrebbe.. Lui una volta entrato nell'if dovrebbe suonarmi tutta la melodia fino a quando il led non si spenge.. invece è come se costringe il led a restare acceso.. In pratica, entra nell'if ma non riesce ad uscirne quando dovrebbe... forse è questo.. smiley-confuse
253  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 05:01:45 am
In logica booleana un numero pari a 0 è un numero false, un qualunque valore pari a 1 o superiore equivale a true.
Tu scrivi:
if (tone && luce>1)

e già usi il modo di fare confronti che ti ho scritto perché
if (tone)
equivale a
if (tone>1)

quindi
if (tone && luce)
equivale a dire
se (tone > 1 && luce > 1)
e viceversa.

Hai stampato sulla seriale i valori delle variabili prima dell'if?

Okok perfetto.. I valori ancora non li ho stampati perchè sono a lavoro ora.. appena rientro ci provo. Quindi devo stampare sulla seriale i valori di tone e luce?! Cmq per luce non dovrebbero esserci problemi.. perchè non è nient'altro che la luminosità del LED.. quindi se è completamente spento è uguale a 0.. se è poco poco acceso è alemno 1.. fino a 255.. invece per tone sinceramente non so come funzioni..
Una cosa, se in questo modo non dovesse funzionare? ci sarebbe qlk altra alternativa?! O meglio, di soluzioni se ne trovano sempre, ma un qualcosa di non troppo complesso.. Sono alle primissime armi come avrai potuto notare..xD

Grazie!
254  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 02, 2011, 04:41:42 am
Non so come funziona la Tone, il controllo dovrebbe funzionare.
Al max prova con
Code:
if (code && luce)
Cmq se non funziona forse una delle due variabili non ha un valore "true". Prova con un Serial.print a mandarne i valori sul terminale ed a verificare.

Ciao, scusa ma sto avendo un po di confusione..xD che vuoi dire con:

al max prova con:
Code:
if (code && luce)

cioè non devo mettere la condizione di >1 ?!
Perchè se non riesco in quest'ultimo modo vedo di prendere un altra strada per risolvere qst problema.. anche se come si sta cercando di fare mi sembra il più immediato e semplice.. ma riscontro problemi.. smiley-cry..

Grazie mille !!!
255  International / Generale / Re: riproduzione melodia solo se il LED è acceso.. si può?! on: September 01, 2011, 03:04:09 pm
Ma luce lo rileggi prima di quell'if? Non si potrebbe avere tutto il codice invece di quello spezzone?

(cmq il confronto si fa con &&, non con &. Se a te funziona, è per altri motivi, non perché è "giusto")

ecco il codice completo:
Code:
#include <Tone.h>
#include <LiquidCrystal.h>
int controllo_lum(int);

// inizializzo display LCD
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);


Tone tone1;

//setto i PIN
int photocellPin = 0;     // the cell and 10K pulldown are connected to a0
int photocellReading;     // the analog reading from the sensor divider
int LEDpin = 6;          // connect Red LED to pin 11 (PWM pin)
int LEDbrightness;

#define OCTAVE_OFFSET 0

int notes[] = { 0,
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};
//CANZONI DISPINIBILI IN RTTTL

char *song = "The Simpsons:d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p,8f#,8f#,8f#,8g,a#.,8c6,8c6,8c6,c6";
//char *song = "Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6";

void setup(void)
{
 
  Serial.begin(9600);
  tone1.begin(7);          //porta a cui e connesso lo speaker
  lcd.begin(16, 2);        //setto colonne e righe display
   lcd.setCursor(0,0);      //setto il cursore sopra a sinistra
  lcd.print("CIAO");
}

void loop()
{
  photocellReading = analogRead(photocellPin); 
 
  //Serial.print("Analog reading = ");
  //Serial.println(photocellReading);     // the raw analog reading
 
  // LED gets brighter the darker it is at the sensor
  // that means we have to -invert- the reading from 0-1023 back to 1023-0
 
  photocellReading = 1023 - photocellReading;
  //now we have to map 0-1023 to 0-255 since thats the range analogWrite uses
 
  photocellReading = constrain(photocellReading, 600, 1023); //<-- il 970 potete cambiarlo
 
  LEDbrightness = map(photocellReading, 600, 1023, 0, 255);
 
  analogWrite(LEDpin, LEDbrightness);
  delay(100);
   play_rtttl(song);
  }
#define isdigit(n) (n >= '0' && n <= '9')

void play_rtttl(char *p)
{
  // Absolutely no error checking in here

  byte default_dur = 4;
  byte default_oct = 6;
  int bpm = 63;
  int num;
  long wholenote;
  long duration;
  byte note;
  byte scale;
  int luce;
  luce = LEDbrightness;

  // format: d=N,o=N,b=NNN:
  // find the start (skip name, etc)

  while(*p != ':') p++;    // ignore name
  p++;                     // skip ':'

  // get default duration
  if(*p == 'd')
  {
    p++; p++;              // skip "d="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    if(num > 0) default_dur = num;
    p++;                   // skip comma
  }

  Serial.print("ddur: "); Serial.println(default_dur, 10);

  // get default octave
  if(*p == 'o')
  {
    p++; p++;              // skip "o="
    num = *p++ - '0';
    if(num >= 3 && num <=7) default_oct = num;
    p++;                   // skip comma
  }

  Serial.print("doct: "); Serial.println(default_oct, 10);

  // get BPM
  if(*p == 'b')
  {
    p++; p++;              // skip "b="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    bpm = num;
    p++;                   // skip colon
  }

  Serial.print("bpm: "); Serial.println(bpm, 10);

  // BPM usually expresses the number of quarter notes per minute
  wholenote = (60 * 1000L / bpm) * 4;  // this is the time for whole note (in milliseconds)

  Serial.print("wn: "); Serial.println(wholenote, 10);


  // now begin note loop
  while(*p)
  {
    // first, get note duration, if available
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
   
    if(num) duration = wholenote / num;
    else duration = wholenote / default_dur;  // we will need to check if we are a dotted note after

    // now get the note
    note = 0;

    switch(*p)
    {
      case 'c':
        note = 1;
        break;
      case 'd':
        note = 3;
        break;
      case 'e':
        note = 5;
        break;
      case 'f':
        note = 6;
        break;
      case 'g':
        note = 8;
        break;
      case 'a':
        note = 10;
        break;
      case 'b':
        note = 12;
        break;
      case 'p':
      default:
        note = 0;
    }
    p++;

    // now, get optional '#' sharp
    if(*p == '#')
    {
      note++;
      p++;
    }

    // now, get optional '.' dotted note
    if(*p == '.')
    {
      duration += duration/2;
      p++;
    }
 
    // now, get scale
    if(isdigit(*p))
    {
      scale = *p - '0';
      p++;
    }
    else
    {
      scale = default_oct;
    }

    scale += OCTAVE_OFFSET;

    if(*p == ',')
      p++;       // skip comma for next note (or we may be at the end)

    // now play the note
   
   
   
    if((note) && (luce>1))
    {
      Serial.print("Playing: ");
      Serial.print(scale, 10); Serial.print(' ');
      Serial.print(note, 10); Serial.print(" (");
      Serial.print(notes[(scale - 4) * 12 + note], 10);
      Serial.print(") ");
      Serial.println(duration, 10);
      tone1.play(notes[(scale - 4) * 12 + note]);
      delay(duration);
      tone1.stop();
    }
    else
    {
    return;
   //Serial.print("Pausing: ");
   //Serial.println(duration, 10);
    //delay(duration);
    }
    }
   
  }


il controllo lo faccio proprio dove  si occupa di suaonare la nota..

Grazie!
Pages: 1 ... 15 16 [17] 18 19