This is a night LED controller i wrote a year and a half ago, when I was doing my first experiences with Arduino. It is a fading LED of which you can set fade time between 10 and 60 minutes pushing the button at power on:
#include<avr/sleep.h>
#include<EEPROM.h>
#define LED 10
#define SW 4
byte B=0;
int X=0;
byte n=0;
byte minuti=10; // Durata dello sfumo
unsigned long T=0;
unsigned long t0=0;
unsigned long t1=0;
byte S=0; // S=1 indica che è passato per il "set"
int I[]={0,20,40,70,120,180,255}; // I[minuti/10] indica l'intensità del LED
// per indicare le diverse durate, I[0] è 0 poiché non lo uso.
void setup()
{
Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(SW, INPUT);
pinMode(SW, HIGH); // Pullup
lamp();
t0=millis();
while(millis()-t0<2000)
{
if(digitalRead(SW)==LOW) set();
}
} // END Setup
void loop()
{
inizia:
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.
T=B*60000/255; // Calcola la durata di ciascun passo.
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++)
{
analogWrite(LED,I[n]); // Visualizza la scala fino al tempo preimpostato.
delay(600);
}
delay(400);
digitalWrite(LED,0);
delay(1000);
}
else{digitalWrite(LED,0); delay(1000);} // Se viene dal "set", fa solo
// 1 secondo di buio.
for(X=256; X>0; X--) // Inizia lo sfumo.
{
analogWrite(LED,X-1);
delay(T);
} // 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(LED,I[1]); minuti=10;
while(digitalRead(SW)==LOW); // Attende che venga lasciato il pulsante.
t1=millis();
while(millis()-t1<1000)
{
if(digitalRead(SW)==LOW) {analogWrite(LED,I[2]); minuti=20; delay(300); goto due;}
} // I[...] è l'intensità relativa ai minuti impostati.
EEPROM.update(0,10); Serial.println("10 Update!"); goto fuori;
due:
while(digitalRead(SW)==LOW); // Attende che venga lasciato il pulsante
t1=millis();
while(millis()-t1<1000)
{
if(digitalRead(SW)==LOW) {analogWrite(LED,I[3]); minuti=30; delay(300); goto tre;}
}
EEPROM.update(0,20); Serial.println("20 Update!"); goto fuori;
tre:
while(digitalRead(SW)==LOW); // Attende che venga lasciato il pulsante
t1=millis();
while(millis()-t1<1000)
{
if(digitalRead(SW)==LOW) {analogWrite(LED,I[4]); minuti=40; delay(300); goto quattro;}
}
EEPROM.update(0,30); Serial.println("30 Update!"); goto fuori;
quattro:
while(digitalRead(SW)==LOW); // Attende che venga lasciato il pulsante
t1=millis();
while(millis()-t1<1000)
{
if(digitalRead(SW)==LOW) {analogWrite(LED,I[5]); minuti=50; delay(300); goto cinque;}
}
EEPROM.update(0,40); Serial.println("40 Update!"); goto fuori;
cinque:
while(digitalRead(SW)==LOW); // Attende che venga lasciato il pulsante
t1=millis();
while(millis()-t1<1000)
{
if(digitalRead(SW)==LOW) {analogWrite(LED,I[6]); minuti=60; EEPROM.update(0,60); Serial.println("60 Update!"); goto fuori;}
}
EEPROM.update(0,50); Serial.println("50 Update!"); goto fuori;
fuori:
Serial.print(minuti); Serial.print(" minuti ");Serial.println(I[int(minuti/10)]);
delay(10); // No operation
} // END Set
void lamp()
{
digitalWrite(LED,1);
delay(50);
digitalWrite(LED,0);
delay(50);
}