Buongiorno a tutti.
Vi chiedo un piccolo aiuto, vorrei modificare lo sketch originale in modo che la musica sia sempre continua. Come faccio ?
allego sketch
type or paste code here
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
const int P1 = 7;
const int P2 = 4;
const int P3 = 2;
const int OUT1 = 5;
const int OUT2 = 6;
const int OUT3 = 9;
const int OUT4 = 10;
const int OUT5 = 11;
const int OUT6 = 3;
const int CHANGESTATE = 12;
const int LEDPLAY = 13;
const int NEOPIXEL = 8;
const int TRIM1 = A0;
const int TRIM2 = A1;
const int TRIM3 = A2;
const int TRIM4 = A3;
const int TRIM5 = A4;
const int TRIM6 = A5;
//#define DEBUG
#define STATE_DAY 0
#define STATE_SUNSET 1
#define STATE_NIGHT 2
#define STATE_SUNRISE 3
#define TRIMMER_DAY 0
#define TRIMMER_SUNSET 1
#define TRIMMER_NIGHT 2
#define TRIMMER_SUNRISE 3
#define TRIMMER_EXT 4
#define TRIMMER_VOL 5
#define OUT_SUN 0
#define OUT_STARS 1
#define OUT_COMET 2
#define OUT_FIRE 3
int fsm_state;
int fsm_stateold;
unsigned long runtime;
unsigned long time_day;
unsigned long time_sunset;
unsigned long time_night;
unsigned long time_sunrise;
unsigned long time_trim;
unsigned long time_debug;
unsigned long time_sunset_running;
unsigned long time_comet_running;
unsigned long time_sunrise_running;
unsigned long time_fire_running;
unsigned long time_volume_running;
int valuesun=0;
int valuestars=0;
int valuecomet=0;
boolean startFire;
boolean startVol=false;
boolean stopVol=false;
int valuehighfire=50;
int valuelowfire=0;
boolean playing=true;
int SwitchPressed=0;
//int VolOld=0;
int volume=0;
uint8_t trimmer[] = {
TRIM1, TRIM4, TRIM2, TRIM3, TRIM5, TRIM6
};
unsigned long trimvalue[6] = {0,0,0,0,0,0};
uint8_t out[] = {
OUT6, OUT2, OUT1, OUT3, OUT5, OUT6
};
void setup() {
// declare pin 9 to be an output:
pinMode(OUT1, OUTPUT);
pinMode(OUT2, OUTPUT);
pinMode(OUT3, OUTPUT);
pinMode(OUT4, OUTPUT);
pinMode(OUT5, OUTPUT);
pinMode(OUT6, OUTPUT);
pinMode(LEDPLAY, OUTPUT);
pinMode(CHANGESTATE, OUTPUT);
pinMode(TRIM1, INPUT);
pinMode(TRIM2, INPUT);
pinMode(TRIM3, INPUT);
pinMode(TRIM4, INPUT);
pinMode(TRIM5, INPUT);
pinMode(TRIM6, INPUT);
pinMode(P1, INPUT_PULLUP);
pinMode(P2, INPUT_PULLUP);
pinMode(P3, INPUT_PULLUP);
delay (1000);
Serial.begin(9600);
mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module
setvolume(10);
fsm_state = STATE_DAY;
time_day=millis();
time_debug=millis();
time_trim=millis();
trimvalue[fsm_state]=ReadTrimmer(fsm_state)*1000;
SwitchPressed=checkSwitch();
playtrack(1);
}
void loop() {
runtime=millis();
if(runtime>time_debug+1000){
#ifdef DEBUG
Serial.print("runtime: ");
Serial.println(runtime);
Serial.print("fsm_state: ");
Serial.println(fsm_state);
switch (fsm_state){
case STATE_DAY:
Serial.print("time_day: ");
Serial.println(time_day+(trimvalue[TRIMMER_DAY]));
Serial.print("TRIMMER_DAY: ");
Serial.println((trimvalue[TRIMMER_DAY]));
Serial.println("-----------------");
break;
case STATE_SUNSET:
Serial.print("time_sunset: ");
Serial.println(time_sunset+(trimvalue[TRIMMER_SUNSET]));
Serial.print("TRIMMER_SUNSET: ");
Serial.println((trimvalue[TRIMMER_SUNSET]));
Serial.print("valuesun: ");
Serial.println(valuesun);
Serial.print("valuestars: ");
Serial.println(valuestars);
Serial.println("-----------------");
break;
case STATE_NIGHT:
Serial.print("time_night: ");
Serial.println(time_night+(trimvalue[TRIMMER_NIGHT]));
Serial.print("TRIMMER_NIGHT: ");
Serial.println((trimvalue[TRIMMER_NIGHT]));
Serial.print("valuecomet: ");
Serial.println(valuecomet);
Serial.println("-----------------");
break;
case STATE_SUNRISE:
Serial.print("time_sunrise: ");
Serial.println(time_sunrise+(trimvalue[TRIMMER_SUNRISE]));
Serial.print("TRIMMER_SUNRISE: ");
Serial.println((trimvalue[TRIMMER_SUNRISE]));
Serial.print("valuesun: ");
Serial.println(valuesun);
Serial.print("valuestars: ");
Serial.println(valuestars);
Serial.print("valuecomet: ");
Serial.println(valuecomet);
Serial.println("-----------------");
break;
}
#endif
if (fsm_state!=fsm_stateold){
digitalWrite(CHANGESTATE, HIGH);
fsm_stateold=fsm_state;
}
else
{
digitalWrite(CHANGESTATE, LOW);
}
time_debug=millis();
}
if(runtime>time_trim+200){
for (int i=0;i<6;i++){
trimvalue[i]=(ReadTrimmer(i));
trimvalue[i]=trimvalue[i]*100;
delay (2);
}
time_trim=millis();
}
switch (fsm_state){
case STATE_DAY:
digitalWrite(OUT4, LOW);
digitalWrite(OUT5, LOW);
valuesun=255;
SetOut(OUT_SUN,valuesun);
if(runtime>time_day+(trimvalue[TRIMMER_DAY])){
fsm_state=STATE_SUNSET;
stopVol=false;
valuehighfire=10;
valuelowfire=0;
time_sunset=millis();
time_sunset_running=millis();
break;
}
gestAudio(fsm_state);
break;
case STATE_SUNSET:
if(runtime>time_sunset_running+(trimvalue[TRIMMER_SUNSET]/255)){ //sostituire la risoluzione con il valore di un trimmer
if (valuesun>0) valuesun--;
if (valuestars<254) valuestars++;
SetOut(OUT_SUN,valuesun);
SetOut(OUT_STARS,valuestars);
time_sunset_running=millis();
}
if(runtime>time_sunset+((trimvalue[TRIMMER_SUNSET])/2)){
startFire= true;
}
if (startFire==true && (runtime>time_fire_running+20)){
if (valuehighfire<200) valuehighfire++;
if (valuelowfire<50) valuelowfire++;
SetFire(valuelowfire,valuehighfire);
time_fire_running=millis();
}
if(runtime>time_sunset+(trimvalue[TRIMMER_SUNSET])){
startFire= false;
stopVol=false;
fsm_state=STATE_NIGHT;
SetOut(OUT_SUN,0);
SetOut(OUT_STARS,255);
time_night=millis();
break;
}
gestAudio(fsm_state);
break;
case STATE_NIGHT:
analogWrite(OUT4, 255);
analogWrite(OUT5, 040);
if(runtime>time_comet_running+((trimvalue[TRIMMER_NIGHT]/255)/4)){ //la cometa ci mette 1/4 del tempo impostato dal trimmer della notte per salire a regime
if (valuecomet<254) valuecomet++;
SetOut(OUT_COMET,valuecomet);
time_comet_running=millis();
}
if(runtime>time_fire_running+20){ //la cometa ci mette 1/4 del tempo impostato dal trimmer della notte per salire a regime
SetFire(50,200);
time_fire_running=millis();
}
if(runtime>time_night+(trimvalue[TRIMMER_NIGHT])){
fsm_state=STATE_SUNRISE;
stopVol=false;
startFire=true;
SetOut(OUT_STARS,0);
time_sunrise=millis();
break;
}
gestAudio(fsm_state);
break;
case STATE_SUNRISE:
if(runtime>time_comet_running+((trimvalue[TRIMMER_SUNRISE]/255)/4)){ //la cometa ci mette 1/4 del tempo impostato dal trimmer dell'alba per spegnersi
if (valuecomet>0) valuecomet--;
SetOut(OUT_COMET,valuecomet);
time_comet_running=millis();
}
if(runtime>time_sunrise+((trimvalue[TRIMMER_SUNRISE])/2)){ //la cometa ci mette 1/4 del tempo impostato dal trimmer della notte per salire a regime
startFire= false;
SetOut(OUT_FIRE,0);
}
if (startFire==true && (runtime>time_fire_running+20)){ //la cometa ci mette 1/4 del tempo impostato dal trimmer della notte per salire a regime
if (valuehighfire>10) valuehighfire--;
if (valuelowfire>0) valuelowfire--;
SetFire(valuelowfire,valuehighfire);
time_fire_running=millis();
}
if(runtime>time_sunrise_running+(trimvalue[TRIMMER_SUNRISE]/255)){ //sostituire la risoluzione con il valore di un trimmer
if (valuesun<254) valuesun++;
if (valuestars>0) valuestars--;
SetOut(OUT_SUN,valuesun);
SetOut(OUT_STARS,valuestars);
time_sunrise_running=millis();
}
if(runtime>time_sunrise+(trimvalue[TRIMMER_SUNRISE])){
fsm_state=STATE_DAY;
stopVol=false;
SetOut(OUT_SUN,255);
SetOut(OUT_STARS,0);
time_day=millis();
break;
}
gestAudio(fsm_state);
break;
}
if (SwitchPressed!=checkSwitch()){
SwitchPressed=checkSwitch();
if (SwitchPressed!=0){
if (!playing){
#ifdef DEBUG
Serial.println("Play");
#endif
playing=true;
int i=fsm_state;
i++;
if (i==5) i=1;
playtrack(i);
// gestAudio(fsm_state);
}
else
{
#ifdef DEBUG
Serial.println("Stop");
#endif
mp3_stop ();
digitalWrite (LEDPLAY,LOW);
playing=false;
}
}
}
if ((volume!=(trimvalue[TRIMMER_VOL]/3500)) && (stopVol==true)){
#ifdef DEBUG
Serial.print("********* Volume ");
Serial.print(volume);
Serial.print(" - Trimm ");
Serial.println((trimvalue[TRIMMER_VOL]/3500));
#endif
volume=(trimvalue[TRIMMER_VOL]/3500);
setvolume(volume);
}
}
int ReadTrimmer (int id){
return(analogRead(trimmer[id]));
}
void SetOut (int id, int value){
analogWrite(out[id],value);
}
void SetFire(int low, int high){
int randNumber = random(low, high);
SetOut(OUT_FIRE,randNumber);
}
int checkSwitch(){
if (!digitalRead(P1)) return (1);
if (!digitalRead(P2)) return (2);
if (!digitalRead(P3)) return (3);
return(0);
}
void playtrack(int track){
#ifdef DEBUG
Serial.println("Playtrack");
#endif
mp3_play(track);
delay(100);
mp3_single_loop (true);
// playing=true;
delay(100);
digitalWrite (LEDPLAY,HIGH);
}
void setvolume(int volume){
mp3_set_volume(volume);
#ifdef DEBUG
Serial.print("Vol ");
Serial.println((volume));
#endif
}
void gestAudio(int track){
// digitalWrite (LEDPLAY,LOW);
if (playing==true){
// digitalWrite (LEDPLAY,HIGH);
track++;
if (track==5) track=1;
if (stopVol==false){
if(runtime>time_volume_running+250){
if(startVol==false){
if (volume>3) {
volume=volume-3;
#ifdef DEBUG
Serial.print("dec ");
Serial.println(volume);
#endif
}
else
{
playtrack(track);
delay (100);
startVol=true;
}
}
else
{
if (volume<(trimvalue[TRIMMER_VOL]/3500)) {
volume=volume+3;
#ifdef DEBUG
Serial.print("inc ");
Serial.println(volume);
#endif
}
else
{
startVol=false;
stopVol=true;
#ifdef DEBUG
Serial.println("finito ciclo");
#endif
}
}
time_volume_running=millis();
setvolume(volume);
delay (100);
}
}
}
}