Go Down

Topic: problema instruzione Notone() (Read 263 times) previous topic - next topic

Nik_90

Salve a tutti, sto trovando difficoltà nel combinare la libreria "Tone.h" con l'accensione di un led tramite fotoresistenza, e messaggio su display. In poche parole avrei intenzione di fare una cosa del genere:

- Quando nella stanza non ce luce, tramite la fotoresistenza, avviene l'accenzione di un LED.
- In seguito, se la luminosità del led è magari, maggiore di 1, allora deve partire una melodia,
- Dopo di che, avrei intenzione di far comparire un messaggio su display.

Il problema è questo, la mia intenzione è che non appena il valore della luminosità del led ritorna a 0, la melodia si deve bloccare. Nel mio caso invece, spegnendo la luce, il LED si accende, la melodia parte, però quando la luce ritorna, la melodia non si ferma !! Ho notato però che è quasi logico che non si fermi perchè anche dopo aver riacceso la luce il led rimane acceso (FINO ALLA FINE DELLA MELODIA).. poi si spegne.. quindi è come se, anche riavendo la luce, la funzione che chiama l'esecuzione della melodia necessita di finire prima lei..

Ho cercato di fare una cosa del genere:
Code: [Select]

 if (LEDbrightness > 1)
{
 play_rtttl(song);
}
else

{
 noTone(7);
}


ma mi da un errore nella compilazione se gli imposto il pin (quindi (7))

se invece gli metto solo
Code: [Select]

 if (LEDbrightness > 1)
{
 play_rtttl(song);
}
else

{
 noTone;
}


il file si compila ma mi da l'errore sopra citato, (la melodia non si ferma).

Per comodita arrivati a questo punto vi lascio tutti il codice scritto così è più facile.

Grazie in anticipo!!!

Code: [Select]

#include <Tone.h>
#include <LiquidCrystal.h>

// 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";

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("hello, World");
 lcd.setCursor(0,1);
 lcd.print("PROVA..");
}

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);
 if (LEDbrightness > 1)
{
 play_rtttl(song);
}
else

{
 noTone(7);
}
}

#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;

 // 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)
   {
     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
   {
     Serial.print("Pausing: ");
     Serial.println(duration, 10);
     delay(duration);
   }
 }
}

Go Up