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