Buonasera a tutti, ho realizzato una centralina il mio presepe che devo portare ad una mostra con le fasi alba - giorno - tramonto - notte da uno sketch che ho trovato su internet.
Allo sketch originale ho aggiunto un sensore capacitivo in modo che chi va a vedere il presepe se "preme" sul sensore si attivano le fasi del giorno e vede un solo ciclo di giorno per poi tornare alla modalità statica altrimenti il presepe rimane statico con delle luci accese.
Il problema è che se "premo" sul sensore durante l'esecuzione delle fasi del giorno, il ciclo si blocca e rimane fermo fino a quando non "ripremo" il sensore , io invece vorrei che se "ripremo" le luci ritornino in modalità statica.
Se non si ripreme sul sensore funziona tutto correttamente, una volta finito il ciclo il presepe ritorna in modalità statica.
Posto lo sketch, dove ho sbagliato???
#define pin_down 9
#define pin_sun 11
#define pin_sunset 10
#define pin_moon 2
#define pin_starsA 3
#define pin_starsB 4
int oneminrome[4] = { 4194,22958,4195,28651 };
int oneminbtlm[4] = { 3668,25189,3668,27474 };
int timeStepOld = 0;
int timeStep = 0;
int TouchSensor = 5; // Collegato a pin SIG del sensore
int val = 0; // si userà val per conservare lo stato del pin di input
int vecchio_val = 0; // si userà vecchio_val per conservare lo stato del pin di input al passo precedente
int stato = 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;
void setup() {
Serial.begin( 9600 );
pinMode( pin_down ,OUTPUT );
pinMode( pin_sun ,OUTPUT );
pinMode( pin_sunset,OUTPUT );
pinMode( pin_moon ,OUTPUT );
pinMode( pin_starsA,OUTPUT );
pinMode( pin_starsB,OUTPUT );
pinMode(TouchSensor, INPUT);
analogWrite( pin_down ,LOW );
analogWrite( pin_sun ,LOW );
analogWrite( pin_sunset,LOW );
digitalWrite( pin_moon ,LOW );
digitalWrite( pin_starsA,LOW );
digitalWrite( pin_starsB,LOW );
Serial.println("-- START --");
}
void loop() {
timeCurr = oneminrome[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);
val = digitalRead(TouchSensor); // legge il valore dell'input e lo conserva
// controlla se è accaduto qualcosa
if ((val == HIGH) && (vecchio_val == LOW)) {
stato = 1 - stato;
delay(15); // attesa di 15 millisecondi
}
vecchio_val = val; // memorizza il valore precedente di val
if (stato == 1) {
//ciclo delle fasi giorno notte
// down
if ( curr == 0 ) {
Serial.print("Fase: "); Serial.println("DOWN");
for ( int i=0; i<52; i++) {
analogWrite(pin_down, fade[(51-i)]);
analogWrite(pin_sun, 0 );
analogWrite(pin_sunset, 0 );
digitalWrite(pin_moon, HIGH );
digitalWrite(pin_starsA, LOW );
digitalWrite(pin_starsB, LOW);
delay( timeStep );
}
timeStepOld = timeStep;
}
// sun
if ( curr == 1 ) {
Serial.print("Fase: "); Serial.println("SUN");
for ( int i=0; i<52; i++) {
analogWrite(pin_down, fade[i]);
if ( fade[i] < 125) analogWrite(pin_sun, fade[(51-i)]*2 );
analogWrite(pin_sunset, 0 );
digitalWrite(pin_moon, LOW );
digitalWrite(pin_starsA, LOW );
digitalWrite(pin_starsB, LOW );
delay( timeStepOld );
}
timeStepOld = (timeStepOld*52); // elapsed time
timeCurr = (timeCurr - timeStepOld);
delay( timeCurr );
}
// sunset
if ( curr == 2 ) {
Serial.print("Fase: "); Serial.println("SUNSET");
for ( int i=0; i<52; i++) {
analogWrite(pin_down, 0);
analogWrite(pin_sun, fade[i] );
analogWrite(pin_sunset, fade[(51-i)] );
digitalWrite(pin_moon, HIGH );
digitalWrite(pin_starsA, LOW );
digitalWrite(pin_starsB, LOW );
delay( timeStep );
}
timeStepOld = timeStep;
}
// moon
if ( curr == 3 ) {
Serial.print("Fase: "); Serial.println("MOON");
for ( int i=0; i<52; i++) {
analogWrite(pin_down, 0);
analogWrite(pin_sun, 0 );
analogWrite(pin_sunset, fade[i] );
digitalWrite(pin_moon, HIGH);
digitalWrite(pin_starsA, HIGH );
digitalWrite(pin_starsB, LOW );
delay( timeStepOld );
}
timeStepOld = (timeStepOld*52); // elapsed time
timeCurr = (timeCurr - timeStepOld);
delay( timeCurr );
}
curr++ ;
if ( curr == 4 ) {stato = 0; }
if ( curr >= 4 ) { curr = 0; }
}
else {
//modalità statica
analogWrite(pin_sun, 52);
digitalWrite(pin_starsB, HIGH);
}
}