Vi spiego bene cosa devo fare di preciso. Ho il seguente sketch che sto utilizzando attualmente il cui scopo è quello di simulare il giorno e la notte, quindi con accensione e spegnimento in fade o normalmente di diversi led :
- Codice: Seleziona tutto
#define alba 10
#define sole 11
#define tramonto 9
#define lampi 6
#define stelleA 5
#define stelleB 3
#define luciint 2
#define luciest 4
#define cometa 7
long onemin1[4] = { 5000,5000,5000,5000 };
long onemin2[4] = { 12582,68874,12585,85953 };
long timeStepOld = 0;
long timeStep = 0;
long timeCurr = 0;
byte fade[] = {255,250,245,240,235,230,225,220,215,210,205,200,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0}; // 52 step
byte curr = 0;
unsigned long time_iniziale;
unsigned long time;
void setup() {
Serial.begin( 9600 );
pinMode( alba ,OUTPUT );
pinMode( sole ,OUTPUT );
pinMode( tramonto,OUTPUT );
pinMode( lampi ,OUTPUT );
pinMode( stelleA,OUTPUT );
pinMode( stelleB,OUTPUT );
pinMode( luciint,OUTPUT );
pinMode( luciest,OUTPUT );
pinMode( cometa,OUTPUT );
analogWrite( alba ,LOW );
analogWrite( sole ,LOW );
analogWrite( tramonto,LOW );
analogWrite( lampi ,LOW );
analogWrite( stelleA,LOW );
analogWrite( stelleB,LOW );
digitalWrite( luciint,LOW );
digitalWrite( luciest,LOW );
digitalWrite( cometa,LOW );
time_iniziale = millis();
Serial.println("-- START --");
}
void loop() {
timeCurr = onemin2[curr];
timeStep = (timeCurr/52);
Serial.print("Current: "); Serial.println(curr);
Serial.print("Time current: "); Serial.println(timeCurr);
Serial.print("Time single step: "); Serial.println(timeStep);
time = millis();
// alba
if ( curr == 0 ) {
Serial.print("Fase: "); Serial.println("ALBA");
for ( int i=0; i<52; i++) {
analogWrite(alba, fade[(51-i)]);
if ( fade[i] < 25) digitalWrite(luciest, 0 );
analogWrite(sole, 0 );
analogWrite(tramonto, 0 );
if ( fade[i] < 25) digitalWrite(cometa, 0 );
analogWrite(stelleA, fade[i] );
analogWrite(stelleB, fade[i] );
digitalWrite(luciint, 1 );
delay( timeStep );
}
timeStepOld = timeStep;
}
// giorno
if ( curr == 1 ) {
Serial.print("Fase: "); Serial.println("GIORNO");
for ( int i=0; i<52; i++) {
analogWrite(alba, fade[i]);
if ( fade[i] < 125) analogWrite(sole, fade[(51-i)]*2 );
if ( fade[i] < 10) digitalWrite(luciint, 0 );
analogWrite(tramonto, 0 );
analogWrite(cometa, 0 );
analogWrite(stelleA, 0 );
analogWrite(stelleB, 0 );
digitalWrite(luciest, 0 );
delay( timeStepOld );
}
timeStepOld = (timeStepOld*52); // elapsed time
timeCurr = (timeCurr - timeStepOld);
delay( timeCurr );
}
// tramonto
if ( curr == 2 ) {
Serial.print("Fase: "); Serial.println("TRAMONTO");
for ( int i=0; i<52; i++) {
analogWrite(alba, 0);
analogWrite(sole, fade[i] );
analogWrite(tramonto, fade[(51-i)] );
if ( fade[i] < 150) digitalWrite(luciint, 1 );
analogWrite(cometa, 0 );
analogWrite(stelleA, 0 );
analogWrite(stelleB, 0 );
digitalWrite(luciest, 0 );
delay( timeStep );
}
timeStepOld = timeStep;
}
// notte
if ( curr == 3 ) {
Serial.print("Fase: "); Serial.println("NOTTE");
for ( int i=0; i<52; i++) {
analogWrite(alba, 0);
analogWrite(sole, 0 );
analogWrite(tramonto, fade[i] );
if ( fade[i] < 20) digitalWrite(cometa, 1 );
if ( fade[i] < 125) analogWrite(stelleA, fade[(51-i)]*2 );
if ( fade[i] < 250) analogWrite(stelleB, fade[(51-i)]*2 );
if ( fade[i] < 100) digitalWrite(luciest, 1 );
digitalWrite(luciint, 1 );
delay( timeStepOld );
}
timeStepOld = (timeStepOld*52); // elapsed time
timeCurr = (timeCurr - timeStepOld);
delay( timeCurr );
}
curr++;
if ( curr >= 4 ) { curr = 0; }
}
A questo codice voglio aggiungere un altro effetto che consiste nel far lampeggiare un LED diverse volte per circa 100ms a distanza di tempo diverso. Per fare questo avevo pensato alla funzione millis dove stabilisco dopo quando tempo si deve accendere e spegnere. Ad esempio questo lampeggio vorrei aggiungerlo su questa parte di codice:
- Codice: Seleziona tutto
// giorno
if ( curr == 1 ) {
Serial.print("Fase: "); Serial.println("GIORNO");
for ( int i=0; i<52; i++) {
analogWrite(alba, fade[i]);
if ( fade[i] < 125) analogWrite(sole, fade[(51-i)]*2 );
if ( fade[i] < 10) digitalWrite(luciint, 0 );
analogWrite(tramonto, 0 );
analogWrite(cometa, 0 );
analogWrite(stelleA, 0 );
analogWrite(stelleB, 0 );
digitalWrite(luciest, 0 );
if ( time > time_iniziale + 6000 ){ digitalWrite ( lampi, HIGH); }
if ( time > time_iniziale + 8000 ){ digitalWrite ( lampi, LOW); }
delay( timeStepOld );
}
timeStepOld = (timeStepOld*52); // elapsed time
timeCurr = (timeCurr - timeStepOld);
delay( timeCurr );
}
Ho provato ad implementare qualche codice (come ho fatto sopra) ma il massimo che sono riuscito ad ottenere è che i LED passato quel lasso di tempo rimangono accesi e non si spengono.
Chiedo scusa se non sono stato chiaro e della mia ignoranza in materia, vi ringrazio per il tempo che mi avete dedicato.