This is the v2.0, using an RGB LED:
/*
1.1b 12/9/16 Finalmente funziona tutto! Avevo anche avuto il problema che, facendo scrivere qualcosa dalla
seriale per le prove, andava a "premere" il pulsante che stava sulla porta 1!!!
2.0 12/9/16 Versione con LED RGB: Sfuma dal bianco verso il rosso. R, G e B deboli e poi intensi vengono
anche usati per indicare il tempo.
2.0a 14/9/16 Ho abbassato l'intensità dei lampi iniziali e velocizzato la scala del tempo preimpostato.
*/
#include<avr/sleep.h>
#include<EEPROM.h>
#define LEDR 3
#define LEDV 5
#define LEDB 6
#define SW 10
byte TEST=0;
byte B=0;
int X=0; int Y=0; int Z=0;
byte n=0;
byte minuti=10; // Durata dello sfumo
byte L=10; // Intensità bassa
byte H=80; // Intensità alta
unsigned long T=0;
unsigned long t0=0;
unsigned long t1=0;
byte S=0; // S=1 indica che è passato per il "set"
void setup()
{
// Serial.begin(9600);
pinMode(LEDR, OUTPUT);
pinMode(LEDV, OUTPUT);
pinMode(LEDB, OUTPUT);
pinMode(SW, INPUT_PULLUP);
if(digitalRead(SW)==LOW){TEST=1; lampR(); lampR(); lampR(); delay(1000);}
// Fa 3 lampi rossi per indicare che è in modalità TEST.
// 3 red flashes: TEST mode (fast cycle).
lampB(); // Fa 1 lampo blu per indicare che si può impostare il tempo.
t0=millis(); // 1 blue flash: you can set fade time.
while(millis()-t0<2000) {if(digitalRead(SW)==LOW) set();}
} // END Setup
void loop()
{
B=EEPROM.read(0); // Legge i minuti impostati.
if(B==255) EEPROM.update(0,10); // Se nella EEPROM c'è scritto 255, significa
// che è vergine o cancellata, perciò imposta 10 minuti.
if(TEST==0) {T=B*60000/255;} // Calcola la durata di ciascun passo.
else T=B*500/255; // In modo TEST va a 120x (5 sec = 10 min).
if(S==0) // Se non è passato dal "set", visualizza la scala di intensità
{ // fino al tempo precedentemente impostato.
for(n=1; n<=B/10; n++)
{
spegnetutto();
switch(n) // Visualizza la scala fino al tempo preimpostato.
{
case 1: analogWrite(LEDR,L); break;
case 2: analogWrite(LEDV,L); break;
case 3: analogWrite(LEDB,L); break;
case 4: analogWrite(LEDR,H); break;
case 5: analogWrite(LEDV,H); break;
case 6: analogWrite(LEDB,H); break;
}
delay(350);
}
delay(200); spegnetutto(); delay(1500);
}
else{spegnetutto(); delay(1500);} // Se viene dal "set", fa solo
// 1 secondo di buio.
Y=255; Z=255;
for(X=256; X>0; X--) // Inizia lo sfumo.
{
if(Y<0) Y=0; if(Z<0) Z=0;
analogWrite(LEDR,X-1);
analogWrite(LEDV,Y);
analogWrite(LEDB,Z);
delay(T); Y-=2; Z-=3;
} // Il tempo è finito: va in Power down.
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Imposta il modo Power down.
sleep_enable(); // Enables the sleep bit in the mcucr register
// so sleep is possible. Just a safety pin.
sleep_mode(); // Here the device is actually put to sleep!
}
void set()
{
S=1; // Memorizza che è passato per il "set".
analogWrite(LEDR,L); minuti=10;
while(digitalRead(SW)==LOW) {delay(100);} // Attende che venga lasciato il pulsante.
t1=millis();
while(millis()-t1<1000)
{
if(digitalRead(SW)==LOW) {spegnetutto(); analogWrite(LEDV,L); minuti=20; delay(300); goto due;}
} // I[...] è l'intensità relativa ai minuti impostati.
EEPROM.update(0,10); goto fuori;
due:
while(digitalRead(SW)==LOW) {delay(100);} // Attende che venga lasciato il pulsante
t1=millis();
while(millis()-t1<1000)
{
if(digitalRead(SW)==LOW) {spegnetutto(); analogWrite(LEDB,L); minuti=30; delay(300); goto tre;}
}
EEPROM.update(0,20); goto fuori;
tre:
while(digitalRead(SW)==LOW) {delay(100);} // Attende che venga lasciato il pulsante
t1=millis();
while(millis()-t1<1000)
{
if(digitalRead(SW)==LOW) {spegnetutto(); analogWrite(LEDR,H); minuti=40; delay(300); goto quattro;}
}
EEPROM.update(0,30); goto fuori;
quattro:
while(digitalRead(SW)==LOW) {delay(100);} // Attende che venga lasciato il pulsante
t1=millis();
while(millis()-t1<1000)
{
if(digitalRead(SW)==LOW) {spegnetutto(); analogWrite(LEDV,H); minuti=50; delay(300); goto cinque;}
}
EEPROM.update(0,40); goto fuori;
cinque:
while(digitalRead(SW)==LOW) {delay(100);} // Attende che venga lasciato il pulsante
t1=millis();
while(millis()-t1<1000)
{
if(digitalRead(SW)==LOW) {spegnetutto(); analogWrite(LEDB,H); minuti=60; EEPROM.update(0,60); delay(1000); goto fuori;}
}
EEPROM.update(0,50); goto fuori;
fuori:
delay(10); // No operation
} // END Set
void lampB()
{
analogWrite(LEDB, H); delay(50);
analogWrite(LEDB, 0); delay(50);
}
void lampR()
{
analogWrite(LEDR, H); delay(50);
analogWrite(LEDR, 0); delay(50);
}
void spegnetutto()
{
digitalWrite(LEDR, LOW);
digitalWrite(LEDV, LOW);
digitalWrite(LEDB, LOW);
}