I do know it's " another language "( and written in French ! ) ... but might be useful
AlainCode: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); } }


( and written in French ! ) ... but might be useful
👍


Bookmarks