Pages: [1]   Go Down
Author Topic: problema instruzione Notone()  (Read 224 times)
0 Members and 1 Guest are viewing this topic.
Montalbano Jonico
Offline Offline
Sr. Member
****
Karma: 1
Posts: 284
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
 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:
 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:
#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);
    }
  }
}
Logged

Pages: [1]   Go Up
Jump to: