I do know it's " another language " ( and written in French ! ) ... but might be useful

Code:
volatile int f_wdt=1;
volatile int Nb_Inter;

const int Fuseau_horaire=0; // Pour la france +0
//const float Latitude = 46.309; // latiture du poulailler pour le calcul du lever et du coucher du soleil
//const float Longitude = 5.165; // longitude idem ""
const float Latitude = 49.916549; // latiture du poulailler pour le calcul du lever et du coucher du soleil
const float Longitude = 1.661536; // longitude idem ""
const float TensionMaxA0= 22.90; // Tension Max mesurable pour 1023 points dépend du pont de résistance
const float SeuilAlerteA0 = 10; // Alerte batterie faible sur mesure A0
const float TensionMaxA1= 5; // Tension Max mesurable pour 1023 points dépend du pont de résistance
const float SeuilAlerteA1 = -1; // Alerte batterie faible sur mesue A1
const int Nb_Boucles_Mini = 0; // Nb d'interruption Mini 1 = 8s
const int Nb_Boucles_Maxi = 0; // Nb d'interruption Maxi 1 = 8s valeur par defaut 8
const unsigned long TempsCycleStd = 1000; //Temps de cyle standard en ms valeur 60000
const unsigned long TempsCycleAnomalie = 1000; //Temps de cyle anomalie en ms
const int on_off_moteur=2; // Sortie N°2 pour on_off moteur
const int sens_moteur=3; // Sortie N°3 pour le sens
const int Porte_ON=4; // Entrée N° 4 pour le contact de porte fermée
const int Porte_OFF=5; // Entrée N° 5 pour le contat de porte ouverte
const int M_A=6; // Entrée N° 6 pour la fonction marche /arrêt
const int Led_Nuit=7; // Sortie N°7 pour Flash Nuit
const int DC=8; // Sortie N°8 pour activer convertisseur DC-DC
const int Beeper_Out=12; // Sortie N°12 pour Beeper
const int Seuil_Nuit = 500; // Seuil de détection de la nuit à calibrer en fonction de la cellule photorésitance
const int Seuil_Jour = 700; // Seuil de détection du jour à calibrer en fonction de la cellule photorésitance
const int Nb_Anomalie_Max=1; // Nb d'essai en cas d'anomalie
const unsigned long TempsMaxConst= 35; // Limite de temps ouveture ou fermeture avant anomalie en secondes
const unsigned long TempsSecurite = 10; //  % temps complémentaire se sécurité après temps étalonnage
const int Marge=0.50; // latitude en heures pour tenir compte de la photorésistance par rapport aux dates prévues de fermeture et d'ouverture
const float Aube=0.50; // temps en heures entre l'aube et le levé du soleil
const float Crepuscule=1.00; // temps en heures entre le couché du soleil et le crépuscule
const int Nb_Cycles_Detection=5; // Nb de cycles pour détection jour-nuit cellule 
const boolean Debug_2=false; // flag pour le débug avancé
const boolean Calcul_Soleil_OK = true; // flag pour utiliser le calcul du soleil sinon utilisation du tabelau des heures
const int Heure_chgt_horaire = 3; // à 3h le dernier dimache de mars, il sera 4h (+1) idem avec -1 le dernier dimanche d'octobre
const boolean Etalonnage_OK = true; // détermine si le système engage un cycle d'étalonnage pour mesurer le temps d'ouverture
const int Bauds =9600;// détermine la vitesse de communication de la RS
const int Tps_secu =10;// Temps de sécurité de maintien de la descente lors de la fermeture de la porte en ms
const boolean Debugage = false; // à mettre à true pour faire des modification et activer le mode débug

//Variables

boolean Etalonnage_Fait = false;
unsigned long TempsMax;
int Heure=21;
int Minute=30;
int Jour=24;
int Mois=01;
int Annee=2015;
boolean Date; // Mode réception Date via RS
int IndDate=0; // Indice de réception format Date via RS sous Forme HHMMJJMMAAAA
int Nb_Anomalie=0; // Nb d'anomalie constatées 
boolean Debug=false; // active l'envoi par ligne série des infos de débug
unsigned long prevtime;  // Variable qui stock le temps
unsigned long MemoTemps; // Variable qui stock en temps  en secondes
unsigned long TempsDerMvt; // Variable qui stock le temps en secondes du dernier mvt
float Temps; // Variable qui stock le temps en hh.mm
float nuit_mois[13]; // Tableau Heure de fermeture hh.mm
float jour_mois[13]; // Tableau Heure d'ouverture hh.mm
unsigned long TempsCycle; // Temps de cycle
float Heure_Ouverture;
float Heure_Fermeture;
float Heure_Couche_Soleil;
float Heure_Leve_Soleil;
boolean RTC_OK=true; // utilise ou non le module RTC Tiny à mettre en constante si taille mémoire trop grande


int Led_Arduino = 13; // N° Led interne Arduino
boolean Memo_Led_Nuit = false; // Pilote declignotement de la led Nuit
boolean Memo_Led_Arduino = false; // Pilote declignotement de la led Nuit
int Etat_Porte=-1; // Etat de la porte 0=Ouvertr 1=fermée -1 en mouvement (indéterminé)
boolean Anomalie = false; // Gère les anomalies reset par M_A
boolean Beeper = true; // active la gestion des alertes beep des niveau bas batterie
char Carlu; // Caratère lu
boolean Interruption = true; // 
boolean Autoris_Inter = true; // autorise le mode interrution en marche
int Ana0; // Pour lecture Analogique 0
int Ana1; // Pour lecture Analogique 1
int Ana2; // Pour lecture Analogique 2
int Nb_Boucles; // Compte le nb d'interruption
int Nb_Cycles_Jour; // Compte le nb de cycles avec détection Jour
int Nb_Cycles_Nuit; // Compte le nb de cycles avec détection Nuit
int Rang_Jour; // Rang d'une journée dans l'année pour calculer lever et coucher du soleil
int Memo_Rang_Jour; // Mémorise le rang jour
int Rang_Jour_date_chgt_hr_ete; // Mémorise le rang jour pour la date de chgt d'heure d'été
int Rang_Jour_date_chgt_hr_hiver; // Mémorise le rang jour pour la date de chgt d'heure d'été
int Heure_ete_OK = true; 
int Memo_Annee =0;
boolean Chgt_hr_ete_fait=false;
boolean Chgt_hr_hiver_fait=false;


// convertit un angle degré en radian
float conv_rad(float angle_degre)
{
  return( (angle_degre * 71.0) / 4068.0);
}

// convertit un angle radian en degré
float conv_deg(float angle_radian)
{
  return ( (angle_radian * 4068.0) / 71.0);
}

// calcul de N° du jour dans la semaine 0=Dimanche, 1= Lundi etc..
// Jour de semaine D = { [(23m)/9] + d + 4 + y + [z/4] - [z/100] + [z/400] - 2 (si m >= 3) } mod 7 
// algo de Mike Keith
int calcul_jour_semaine(int jour,int mois,int annee)
{
  int num_jour_semaine;
  int z;
  if (mois >=3 )
  {
    z= annee;
    num_jour_semaine = ((23*mois)/9+ jour+ 4+ annee+(z/4)-(z/100)+(z/400)-2) %7;
  }
  else
  {
    z= annee-1;
    num_jour_semaine = ((23*mois)/9+ jour+ 4+ annee+(z/4)-(z/100)+(z/400)) %7;
  }
  // num_jour_semaine = (jour + annee + annee/4 - annee/100 + annee/400 + ((31*mois)/12) ) % 7; ancienne formule

  if (Debug_2)
  {
    Serial.print("num jour semaine:");
    Serial.print(num_jour_semaine);
    Serial.println(); 
  }
  return(num_jour_semaine); 
}

// calcul de dernier dimanche du mois
void calcul_dates_chgt_hr (int annee)
{
  boolean trouver_dimanche = false;
  // on recherche le dernier dimanche de mars
  int num_jour=31; // pour le mois de mars
  while (!trouver_dimanche)
  {
    if (calcul_jour_semaine(num_jour,3,annee)==0)
      trouver_dimanche = true;
    else
      num_jour--;
  }
  Rang_Jour_date_chgt_hr_ete =calcul_rang_date(num_jour,3,annee);

  // on recherche le dernier dimanche d'octobre
  trouver_dimanche = false;
  num_jour=31; // pour le mois d'octobre
  while (!trouver_dimanche)
  {
    if (calcul_jour_semaine(num_jour,10,annee)==0)
      trouver_dimanche = true;
    else
      num_jour--;
  }
  Rang_Jour_date_chgt_hr_hiver =calcul_rang_date(num_jour,10,annee);
  if (Debug)
  {
    Serial.print("Rang Jour :");
    Serial.print(Rang_Jour);
    Serial.print(" Rang chtg ete:");
    Serial.print(Rang_Jour_date_chgt_hr_ete);
    Serial.print(" Rang chtg hiver:");
    Serial.print(Rang_Jour_date_chgt_hr_hiver);
    Serial.println(); 
  }
}



// calcul le rang d'un journée pour le calcul du coucher du soleil http://jean-paul.cornec.pagesperso-orange.fr/formule_rang.htm
// vérifier les calculs sur tables http://jean-paul.cornec.pagesperso-orange.fr/rang_des_jours.htm
int calcul_rang_date(int jour,int mois,int annee) 
{
  int N1;
  int N2;
  int K;
  int Rang;

  N1= int(( mois* 275 ) / 9);
  N2 = int( (mois + 9) / 12 );
  K = 1 + int( ( annee - 4 * int (annee / 4) + 2 ) / 3 );
  Rang = N1 - N2*K + jour -30;
  if (Debug_2)
  {
    Serial.print("Rang :");
    Serial.print(Rang);
    Serial.println(); 
  }
  return(Rang);
}

// calcul l'heure de lever et du coucher du soleil
// basé sur le calcul simplifié de jean-paul Cornec http://jean-paul.cornec.pagesperso-orange.fr/heures_lc.htm

void calcul_soleil()
{

  float M;
  float C;
  float L;
  float R;
  float Et;
  float Dec;
  float Ho;
  float VL;
  float TL;
  float HL;
  float VC;
  float TC;
  float HC;

  M = 357.0 + (0.9856 * Rang_Jour);
  C = (1.914 * sin(conv_rad(M))) + (0.02 * sin(conv_rad(2.0*M)));
  L = 280.0 + C + (0.9856 * Rang_Jour);

  R = (-2.465 * sin(conv_rad(2.0*L))) + (0.053 * sin(conv_rad(4.0*L)));
  Et = 4.0*(C + R);
  Dec =conv_deg(asin(0.3978 * sin(conv_rad(L))));
  Ho = conv_deg(acos(( -0.01454 - sin ( conv_rad(Dec) ) * sin ( conv_rad(Latitude) ) ) / ( cos ( conv_rad(Dec) ) * cos ( conv_rad(Latitude) ) )));
  VL = 12 - Ho/15;
  TL = 12 - Ho/15 + Et/60 + Longitude/15;
  if (Heure_ete_OK)
    HL = 12 - Ho/15 + Et/60 + Longitude/15 + Fuseau_horaire +1; //(+ 1 pour heure été)
  else 
    HL = 12 - Ho/15 + Et/60 + Longitude/15 + Fuseau_horaire;

  Heure_Leve_Soleil=HL;

  VC = 12 + Ho/15;
  TC = 12 + Ho/15 + Et/60 + Longitude/15;
  if (Heure_ete_OK)
    HC = 12 + Ho/15 + Et/60 + Longitude/15 + Fuseau_horaire +1; //(+ 1 pour heure été)
  else
    HC = 12 + Ho/15 + Et/60 + Longitude/15 + Fuseau_horaire;

  Heure_Couche_Soleil=HC;
  if (Debug_2)
  {
    Serial.print("M:");
    Serial.println(M);
    Serial.print("C:");
    Serial.println(C);
    Serial.print("L:");
    Serial.println(L);
    Serial.print("R:");
    Serial.println(R);
    Serial.print("Et:");
    Serial.println(Et);
    Serial.print("Dec:");
    Serial.println(Dec);
    Serial.print("Ho:");
    Serial.println(Ho);
    Serial.print("VL:");
    Serial.println(VL);
    Serial.print("HL:");
    Serial.println(HL);
    Serial.print("VC:");
    Serial.println(VC);
    Serial.print("TC:");
    Serial.println(TC);
    Serial.print("HC:");
    Serial.println(HC);
  }
}

Alain