Software per dimmer 220v ac

Salve a tutti, come da titolo mi sto cimentando (per la prima volta) nella programmazione di un software per arduino che sia in grado di comandare autonomamente un dimmer a 220v in corrente alternata.

Ovviamente ho già preparato la parte hardware (in cui sono abbastanza pratico) da adattare a tale progetto prendendo ispirazione dalle istruzioni riportate su queste pagine di instructables:

Il tutto funziona alla perfezione se non fosse per il fatto che il software riportato nel link non fa quello che mi serve ovvero accendere lentamente la luce (circa un quarto d'ora di rampa) e mantenerla accesa per un periodo di circa otto ore per poi farla spegnere sempre con una quindicina di minuti di rampa e mantenere la luce spenta per circa 14 ore.

Attualmente sto usando Arduino uno e lo alimento con la presa USB del computer (uso un Mac aggiornato a munitain lion).

Vi ringrazio anticipatamente per le dritte che potrete darmi!
Un salutone a tutti!

come vorresti fare la rampa di accensione / spegnimento?

Esempio da http://www.instructables.com/id/Arduino-controlled-light-dimmer-The-circuit/step2/Arduino-controlled-light-dimmer-The-software/ :

/*
AC Voltage dimmer with Zero cross detection
Author: Charith Fernanado http://www.inmojo.com
Adapted by DIY_bloke
License: Creative Commons Attribution Share-Alike 3.0 License.
Attach the Zero cross pin of the module to Arduino External Interrupt pin
Select the correct Interrupt # from the below table (the Pin numbers are digital pins, NOT physical pins: digital pin 2 [INT0]=physical pin 4 and digital pin 3 [INT1]= physical pin 5)

Pin    |  Interrrupt # | Arduino Platform
---------------------------------------
2      |  0            |  All
3      |  1            |  All
18     |  5            |  Arduino Mega Only
19     |  4            |  Arduino Mega Only
20     |  3            |  Arduino Mega Only
21     |  2            |  Arduino Mega Only

In the program pin 2 is chosen
*/
int AC_LOAD = 3;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

void setup()
{
  pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

// the interrupt function must take no parameters and return nothing
void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation : 1 full 50Hz wave =1/50=20ms 
  // Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) For 60Hz => 8.33ms (10.000/120)
  // 10ms=10000us
  // (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65

  int dimtime = (75*dimming);    // For 60Hz =>65    
  delayMicroseconds(dimtime);    // Off cycle
  digitalWrite(AC_LOAD, HIGH);   // triac firing
  delayMicroseconds(10);         // triac On propogation delay (for 60Hz use 8.33)
  digitalWrite(AC_LOAD, LOW);    // triac Off
}

void loop()  {
  for (int i=5; i <= 128; i++){
    dimming=i;
    delay(10);
   }
}

la variabile che controlla la percentuale di accensione é

int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

Al posto della rampa:

for (int i=5; i <= 128; i++){
    dimming=i;
    delay(10);
   }

puoi mettere quello che vuoi Tu.

Ciao Uwe

Intanto grazie mille della risposta. Quel codice l'ho provato e funziona egregiamente, l'unico problema è che la modifica da apportare al ciclo, per me, non è stata così semplice come invece mi aspettavo che fosse. Andando ad esempio ad aumentare il tempo di delay l'unico risultato che sono riuscito ad ottenere è stato uno sfarfallio incontrollato della lampada (anche moltiplicando tutto per fattori interi così da ottenere multipli dei 10 ms in cui la semionda della corrente alternata percorre il tragitto per arrivare a zero volt). A me invece la luce dovrebbe accendersi piano piano (cosa che tra l'altro quel codice fa solo quando viene cambiato il coefficiente per cui deve essere moltiplicata la variabile dimming con 78 anziché 75), rimanere accesa per otto ore, spegnersi piano piano e rimanere spenta per 14/16 ore. Il tutto deve ripetersi ciclicamente e con delle rampe accensione/spegnimento di almeno 10/15 minuti.

Purtroppo sono a secco di idee perché conoscendo solo le basi della programmazione in c (e pure male) creare da zero uno sketch per la rampa mi sembra un'idea forse troppo ambiziosa.
Devo dire che mi sono un po' pentito di essermi imbarcato nel progetto, a vederlo sembrava così banale (a livello hardware) che ho pensato fosse semplice o almeno alla mia altezza programmarlo. Cercherò di studiarmi per bene il linguaggio di Arduino, nel frattempo qualunque consiglio o stralcio di codice di esempio mi farebbe comodissimo!

se riuscissi a rettificare la corrente 220V forse potresti usare un paio di mosfet e il pwm per gestire questa cosa...
//pwm.ino
const short pwm=9;
//Sensore analogico per variare il duty cycle
const short sensore=0;
void setup() {
pinMode(pwm, OUTPUT);
}
void loop() {
//Variabile che contiene il valore proporzionato letto dal sensore analogico
byte valore=map(analogRead(sensore),0,1023,0,255);
//Il valore viene attuato sul piedino PWM
analogWrite(pwm,valore);
//Piccola pausa
delay(10);
}