#include <Servo.h> // Inclusion de la bibliothèque permettant de contrôler un servomoteur

#define CaptG A1 // Définition des broches analogiques pour les LDR (gauche = A1)
#define CaptD A2 // Définition des broches analogiques pour les LDR (droite = A2)
#define capt_fdc 2 //borne d'entréee du fin de course

// Prototypes des fonctions
void mode_jour_ou_nuit();
void Retour_position_EST();
void Automatique(int CaptG, int CaptD);

Servo horizontal; // Création d'un objet 'horizontal' représentant le servomoteur

int servoh = 90; // Initialisation de la position du servo horizontal à 90° (plein SUD)

int val_captD; // Variable pour stocker la lecture du capteur LDR droit
int val_captG; // Variable pour stocker la lecture du capteur LDR gauche

bool img_capteur = 1; // Variable pour l'image de l'état du fin de course

const int calage_traqueur_haute = 270; //valeur maxi (diagramme ressource) pour inclinaison 30° panneau
const int calage_traqueur_basse = 90; //valeur mini (diagramme ressource) pour inclinaison 30° panneau
const int val_plein_sud = 90; //valeur angulaire position plein SUD
const int servoh_Limit_haute = 180; // Limite maxi de rotation du servomoteur (butée OUEST)
const int servoh_Limit_basse = 0;   // Limite mini de rotation du servomoteur (butée EST)

const int seuil_nuit = 100; //seuil de luminosité pour détecter la nuit

void setup() {
  Serial.begin(9600); // Démarrage de la communication série pour le débogage
  horizontal.attach(5); // Connexion du servomoteur à la broche numérique 5
  horizontal.write(servoh); // Envoi de la position initiale au servomoteur (90°)
  delay(3000); // Pause de 3 secondes pour stabiliser le système
}

void loop() {mode_jour_ou_nuit();}

void mode_jour_ou_nuit(){
	img_capteur = digitalRead(capt_fdc);
	val_captG = analogRead(CaptG); // Lecture du capteur de luminosité gauche
	val_captD = analogRead(CaptD); // Lecture du capteur de luminosité droit

	if(val_captD <= seuil_nuit && val_captG <= seuil_nuit){ // Si les deux capteurs détectent la nuit
		Retour_position_EST();
	}
	else { Automatique(val_captG, val_captD); } // Sinon, mode suivi automatique du soleil
}

// fonction de mise en position initiale du tracker
void Retour_position_EST() {
	while(img_capteur == 1){
		servoh -= 1;
		if (servoh < servoh_Limit_basse) { servoh = servoh_Limit_basse; } // protection butée basse
		horizontal.write(servoh);
		delay(100);
		img_capteur = digitalRead(capt_fdc);
	}
}

// fonction de mise en position du tracker
void Automatique(int CaptG, int CaptD) {

	int dhoriz = CaptG - CaptD; // Calcul de la différence entre les deux capteurs
	const int Tol = 30; // Tolérance définissant une zone morte pour éviter les micro-ajustements
	if (abs(dhoriz) > Tol) { // Si la différence dépasse la tolérance...
		if (dhoriz < 0) { servoh += 1; } // Si le capteur droit est plus lumineux, on tourne vers l'OUEST
		else { servoh -= 1; } // Sinon, on tourne vers l'EST

		servoh = constrain(servoh, servoh_Limit_basse, servoh_Limit_haute); // On limite dans les bornes autorisées
		horizontal.write(servoh); // Mise à jour de la position du servomoteur
		delay(100); // pause pour laisser le servo bouger
	}
}