Code panneau solaire traqueur de soleil

Bonjour, Bonsoir

Cela fait maintenant 2 semaine en cours de SI en première que je cherche ce qui ne fonctionne pas avec mon code, mais je ne trouve toujours pas.

Le projet est de faire un panneau solaire qui traque le soleil tout seul. Jusqu’ici je pensais avoir bien compris ce qu'il fallait faire, et que j'y arrivais plutôt bien. Mais malheureusement ce n'était apparemment pas le cas.

#include <Servo.h>

Servo myservo1;
Servo myservo2;
int value;
double angle_1;
double angle_2;
double angle_3;
double angle_4;
bool C1=false, C2=false, C3=false, C4=false;
bool M1Sh180=false, M1Sa180=false, M2Sh180=false, M2Sa180=false;
bool M1Sh90=false, M1Sa90=false, M2Sh90=false, M2Sa90=false;
bool Defaut=false, Perfect=false;
bool M2h_90_180=false, M2a_0_90=false;

void setup () 
{
// Configuration initial
 Serial.begin(9600);
 myservo1.attach(9);
 myservo2.attach(10);

}

void loop () 
// En boucle
{
// Récupération des valeurs aux Analog
 int valeur_1=analogRead(A2);
 int valeur_2=analogRead(A3);
 int valeur_3=analogRead(A4);
 int valeur_4=analogRead(A5);
  
/* Calcul de la tension
Plus la tension (U) est élevé, plus la résistance (R) l'est aussi
Et vis versa, pas besoin de calculer R*/
 float tension_1=valeur_1*(5.0 / 1023.0);
 float tension_2=valeur_2*(5.0 / 1023.0);
 float tension_3=valeur_3*(5.0 / 1023.0);
 float tension_4=valeur_4*(5.0 / 1023.0);
  
// Indique sur le Moniteur la valeur de la tension (U)
 Serial.println(tension_1);
 Serial.println(tension_2);
 Serial.println(tension_3);
 Serial.println(tension_4);
  
// Mettre en true ou false les variables C1, C2, C3, C4
 if (valeur_1<252)
   C1=true;
 else
   C1=false;
 if (valeur_2<252)
   C2=true;
 else
   C2=false;
 if (valeur_3<252)
   C3=true;
 else
   C3=false;
 if (valeur_4<252)
   C4=true;
 else
   C4=false;
 
 
// Position par défaut et variables de mouvements de servos moteurs
 M1Sh180= !(C1) and !(C2) and !(C3) and C4 or C1 and !(C2) and !(C3) and !(C4) or C1 and !(C2) and C3 and C4 or C1 and C2 and !(C3) and C4;
 M1Sa180=!(C1) and !(C2) and C3 and !(C4) or !(C1) and C2 and !(C3) and !(C4) or !(C1) and C2 and C3 and !(C4) or !(C1) and C2 and C3 and C4 or C1 and C2 and C3 and !(C4);
 M2Sh180=!(C1) and !(C2) and !(C3) and C4 or !(C1) and !(C2) and !(C3) and !(C4) or !(C1) and !(C2) and C3 and C4 or !(C1) and C2 and C3 and C4 or C1 and !(C2) and C3 and C4 or C1 and !(C2) and !(C3) and C4;
 M2Sa180=!(C1) and C2 and !(C3) and !(C4) or C1 and !(C2) and !(C3) and !(C4) or C1 and C2 and !(C3) and !(C4) or C1 and C2 and !(C3) and C4 or C1 and C2 and C3 and !(C4);
 M1Sh90=!(C1) and !(C2) and C3 and !(C4) or !(C1) and C2 and !(C3) and !(C4) or !(C1) and C2 and C3 and !(C4) or !(C1) and C2 and C3 and C4 or C1 and C2 and C3 and !(C4);
 M1Sa90=!(C1) and !(C2) and !(C3) and C4 or C1 and !(C2) and !(C3) and !(C4) or C1 and !(C2) and C3 and C4 or C1 and C2 and !(C3) and C4;
 M2Sh90= !(C1) and !(C2) and !(C3) and C4 or !(C1) and !(C2) and !(C3) and !(C4) or !(C1) and !(C2) and C3 and C4 or !(C1) and C2 and C3 and C4 or C1 and !(C2) and C3 and C4;
 M2Sa90=C1 and !(C2) and !(C3) and !(C4) or !(C1) and C2 and !(C3) and !(C4) or C1 and !(C2) and !(C3) and C4 or C1 and C2 and !(C3) and !(C4) or C1 and C2 and !(C3) and C4 or C1 and C2 and C3 and !(C4);
 M2h_90_180=C1 and C2 and !(C3) and !(C4) or C1 and C2 and C3 and !(C4) or C1 and C2 and !(C3) and C4 or C1 and !(C2) and !(C3) and !(C4) or !(C1) and C2 and !(C3) and !(C4);
 M2a_0_90=!(C1) and !(C2) and C3 and C4 or C1 and !(C2) and C3 and C4 or !(C1) and C2 and C3 and C4 or !(C1) and !(C2) and C3 and !(C4) or !(C1) and !(C2) and !(C3) and C4;
 Defaut=!(C1) and !(C2) and !(C3) and !(C4);
 Perfect=C1 and C2 and C3 and C4;

// Position de lever de soleil
 if (Defaut==true);
  angle_1=90;
  angle_2=180;
  myservo1.write(angle_1);
  myservo2.write(angle_2);
 
// Faire bouger les servos moteurs suivant les variables positives ou non si Perfect==false
 if (Perfect==false);
   if (angle_2>90)
     if (M1Sh180==true);
       angle_1=angle_1-1;
     if (M1Sa180==true);
       angle_1=angle_1++;
     if (M2Sh180==true);
       angle_2=angle_2++;
     if (M2Sa180==true);
       angle_2=angle_2--;
   
// Deuxième partie des 180 degrès du M2
  if (angle_2<90)
     if (M1Sh90==true);
       angle_1=angle_1--;
     if (M1Sa90==true);
       angle_1=angle_1++;
     if (M2Sh90==true);
       angle_2=angle_2++;
     if (M2Sa90==true);
       angle_2=angle_2--;
   
// Si le pannau solaire est parallèle au sol
   if (angle_2=90)
     if (Defaut==true);
       if (M2h_90_180==true);
         angle_2=angle_2++;
       if (M2a_0_90==true);
         angle_2=angle_2--;
 myservo1.write(angle_1);
 myservo2.write(angle_2);
 delay (250) ;
}

Voici à quoi ressemble mon code et mon projet sur tinkerkad.

Dans un premier temps je récupère donc les valeurs analogique, et défini à partir de quel valeur analogique récupérer je considère que les photorésistance captent le soleil.

Ensuite je définie plusieurs variable qui vont changer suivant quel photorésistances captent du soleil.

Si l'angle_2 est strictement supérieur à 90°:
Moteur 1 :
M1Sh180=true alors le moteur 1 doit tourner dans le sens horaire lorsque angle_2>90°
M1Sa180=true alors le moteur 1 doit tourner dans le sens anti horaire lorsque angle_2>90°

Moteur 2:
M2Sh180=true alors le moteur 2 doit tourner dans le sens horaire lorsque angle_2>90°
M2Sa180=true alors le moteur 2 doit tourner dans le sens anti horaire lorsque angle_2>90°

Si l'angle_2 est strictement inférieur à 90°:
Moteur 1 :
M1Sh90=true alors le moteur 1 doit tourner dans le sens horaire lorsque angle_2<90°
M1Sa90=true alors le moteur 1 doit tourner dans le sens anti horaire lorsque angle_2<90°

Moteur 2 :
M2Sh90=true alors le moteur 2 doit tourner dans le sens horaire lorsque angle_2<90°
M2Sa90=true alors le moteur 2 doit tourner dans le sens anti horaire lorsque angle_2<90°

Si l'angle_2=90°=
M2h_90_180=true alors le moteur 2 doit tourner dans le sens horaire lorsque angle_2=90°
M2h_0_90=true alors le moteur 2 doit tourner dans le sens anti horaire lorsque angle_2=90°

Si aucune des photorésistance ne captent le soleil:
Defaut=true alors le panneau solaire doit retourner à sa position matin (avec angle_1=90 et angle_2=180)

Si toutes les photorésistances captent le soleil:
Perfect=true alors il ne bouge pas

Ainsi, lorsque je fait varier les photorésistances, les moteurs sont sensé tourner jusqu'à trouver le soleil. Mais ça ne marche pas :sweat_smile: .

Je ne te cacherais pas que je me suis perdu en lisant ton code.
La quantité de variables MxShxx me semble un peu too much.

Admettons que les 4 LDR sont disposées en croix avec un masque lui-même composé d'une croix pour les isoler l'une de l'autre.
On a 2 LDR pour l'axe X et 2 pour l'axe Y
Au final, qu'est-ce qu'il faut faire?

  • pour chaque axe, si l'une des 2 LDR reçoit plus de lumière que l'autre il faut se déplacer dans la direction de celle qui est le plus illuminée jusqu'à ce que l'on ait sensiblement la même luminosité sur les 2.
  • on fait la même chose pour le second axe.

Autre chose, tu fais des comparaisons avec un seuil fixe pour déterminer si une LDR reçoit de la lumière ou pas. Ce seuil fixe va fonctionner un jour pour une condition d'éclairement donné mais ne fonctionnera pas le lendemain (voir même une heure plus tard) si les conditions sont différentes.
Il vaut mieux travailler en calculant la différence des valeurs retournées par les 2 capteurs d'un axe.

  • si la valeur absolue de la différence est faible (seuil à déterminer empiriquement) on peut considérer que l'on est bien aligné et on ne fait rien
  • si la différence est importante et positive on tourne dans un sens
  • si la différence est importante et négative on tourne dans l'autre sens

Il faudra aussi peut-être considérer des cas particuliers comme le niveau moyen de la luminosité retourné par les 4 capteurs. Si cette moyenne est faible (peut-être qu'il fait nuit, que le soleil est masqué ou que l'on tourne le dos au soleil)

Essaye pour commencer de donner des noms plus parlant à tes variables.
Parce que là, les valeurs_1 et tension_4, ça n'aide en rien à comprendre ce que tu fais.

Bonjour,
J'ai vu un projet similaire avec démo, mais je ne sais plus où. Je recherche et je reviens proposer une solution.

Bonjour Messieurs, j'ai réglé plusieurs des problèmes de mon code, mais en rencontre un nouveau que j'ai exposé dans un autre sujet si vous souhaitez encore m'aider :smile:

Bonsoir @alexator3000

On continue içi les échanges sur ton projet et son code.
le 'problème nouveau' y sera traité dans le prolongement des autres en conservant une vue d'ensemble du projet et de son code dans sa totalité et une vue du plan de câblage

pas de saucissonnage !

Il est fréquent et normal sur ce forum d'aider dans un fil de discussion unique , sur plusieurs aspects , plusieurs points d'achoppement d'un même projet.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.