Suiveur solaire 2 axes +anémomètre

Bonjour à tous, svp je travaille sur un projet de réalisation d'un suiveur solaire 2 axes en utilisant Arduino, 4 LDRs ; un vérin linéaire 12 volt pour inclinaison et un moteur 12 volt pour azimute; une carte uno plus une carte Shield Motor+une anémomètre. J'ai pas des bases solides en programmation, quelqu'un pour m'aider svp?
j'ai essayer de copier des code similaire mais j'ai l'impression que les ldrs ne prennent pas les bonnes infos et que la carte Shield ne répond pas. Besoin d'aide svp🙏

Bonjour et Bienvenue !!

Prends le temps de lire les recommendations concernant l'usage de ce forum , en particulier l'ensemble des informations techniques à fournir et la façon de publier le code,......toutes choses nécessaires pour l'aide.

En l'état, avec les maigres informations fournies un éventuel aidant en est réduit à imaginer le montage (alimentation comprise) , le code ainsi que les références précises des matériels utilisés..... ce n'est pas très motivant....

l'ensemble est fixé sur un ancien support de parabole, le système est alimenté par une batterie de 12 volt qui régulé par un mppt solaire( voir foto)

voici ma plate-forme d'essais pour tester mon code

Bonjour.
je ne vois pas en quoi quelques photos pourraient aider à résoudre un problème de code.

#include <Adafruit_MotorShield.h>




 
 
 
 
 

#define IN1 12
#define IN2 9
#define IN3 13
#define IN4 8
#define ldrEast 2
#define ldrWest 3
#define ldrUp 4
#define ldrDown 5
#define pinILS 12
#define pi 3.14159265359
#define RayonDesBras    0.1 // en mètre de l'anénomètre



int ldrEastState = 0; //variable for reading east LDR status
int ldrWestState = 0; //variable for reading west LDR status
int ldrUpState = 0; //variable for reading Up LDR status
int ldrDownState = 0; //variable for reading Down LDR status

void setup() {
  
pinMode(IN1, OUTPUT);//make two output pins
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);//make two output pins
pinMode(IN4, OUTPUT);
pinMode(ldrEast, INPUT); //make LDR input pin
pinMode(ldrWest, INPUT); //make LDR input pin
pinMode(ldrUp, INPUT); //make LDR input pin
pinMode(ldrDown, INPUT); //make LDR input pin
 pinMode(pinILS, INPUT);
  Serial.begin(9600);
unsigned long millis_old(0);
float deltaTime(0);
float vitesseVent(0);
float NombreTourSec(0);
float FEtalonage(1);
bool isActive(false);
 //lecture du capteur
    isActive = digitalRead(pinILS);
 
    if(isActive)
    {
        deltaTime = (millis() - millis_old) / 1000 ; // div en 1000 pour avoir le résultat en sec
        millis_old = millis(); // remise à 0 du compteur pour capturé la différence de temps au prochain tour
    }







}

void loop() {
  //check east-west orientation first
ldrEastState = digitalRead(ldrEast); //read east ldr
ldrWestState = digitalRead(ldrWest); //read west ldr
digitalWrite(IN1,LOW); //set signal to motor driver board to low
digitalWrite(IN2,LOW); //set signal to motor driver board to low
digitalWrite(IN3,LOW); //set signal to motor driver board to low
digitalWrite(IN4,LOW); //set signal to motor driver board to low

//manual overwrite to orientate panel to west
if (digitalRead  == LOW) {
  analogWrite (IN2,150); //turn motor CCW to go towards west
} else {
  digitalWrite (IN2,LOW);
  }

//manual overwrite to orientate panel to east
if (digitalRead  == LOW) {
  analogWrite (IN1, 150); //turn motor CW to go towards east
} else {
   digitalWrite (IN1, LOW);
  }

if (ldrWestState == HIGH) {
  if (ldrEastState == LOW) {
    analogWrite (IN2,150); //turn motor CCW to go towards west
  } else {
    }
} 

if (ldrWestState == LOW) {
  if (ldrEastState == HIGH) {
    analogWrite (IN1, 150); //turn motor CW to go towards east
  } else {
    }
}
delay (500); //wait 0.5 second


//check up-down orientation after eas-west orientation has been adjusted
ldrUpState = digitalRead(ldrUp); //read up ldr
ldrDownState = digitalRead(ldrDown); //read down ldr
digitalWrite(IN1,LOW); //set signal to motor driver board to low
digitalWrite(IN2,LOW); //set signal to motor driver board to low
digitalWrite(IN3,LOW); //set signal to motor driver board to low
digitalWrite(IN4,LOW); //set signal to motor driver board to low

if (ldrUpState == HIGH) {
  if (ldrDownState == LOW) {
    analogWrite (IN3,150); //ON tilt motor to rotate up
  } else {
    }
} 

if (ldrUpState == LOW) {
  if (ldrDownState == HIGH) {
    analogWrite (IN4, 150); //ON tilt motor to rotate down
  } else {
    }
}
delay (500); //wait 0.5 second
 
    //convertion periode -> fréquense
    
    //vitesse du vent
 
    
    //affichage de la vitesse
    Serial.print("la vitesse du vent est de ");
    
    Serial.print(" m/s.");








}

Ce code ne doit pas compiler.

Je suis surpris que les LDR soient lues par un digitalRead et non pas par un analogRead.

Il me paraît très surprenant qu'un tracker puisse fonctionner en tout ou rien.

il compile sans message d'erreurs (Arduino 1.8.15(windows Store 1.8.49.0)

Ma remarque ne va pas dans ce sens. Une LDR délivre un signal analogique, dont la valeur est comprise entre 0V (nuit noire) et plusieurs volts (plein soleil).
Donc la lecture se fait avec analogRead() sur une pin choisie entre A0 et A5.

if (digitalRead == LOW) {

Si, cette ligne va se compiler sans erreur, sauf que la condition n'a strictement aucune chance d'être vraie, puisque l'adresse de digitalRead n'est jamais égale à LOW.

Pour ma part, attaquer un projet de ce genre sans connaissances est une erreur.
Je commencerais par maîtriser les différents éléments, à l'aide de petits programmes :

  • pilotage moteur, vérin
  • lecture des LDRs et affichage des valeurs
  • faire des essais de lecture des LDRs en fonction de l'orientation
  • etc.

Tant que ces notions ne sont pas parfaitement claires, cela ne sert à rien d'aller plus loin.

merci, pour vos conseils, j'ai déjà effectué plusieurs module :allumage de led commende de Relay; et ma dernier en date détection de temperature et d'humidité pour commander un ventilateur d'extraction. Certe je suis par un genie d'Arduino ,mais j'essaye d'apprendre avec tous les outils que l'ont me met a disposition, je suis venue ici car je n'ai plus d'infos sur le net dans l'espoir que quelqu'un me donnerait un petit coup de pouce.

On a déjà donné un coup de pouce :

  • une LDR se lit avec analogRead()
  • if (digitalRead == LOW) ne rime à rien

ok, j'ai modifier et remplacer le digitatRead ;vérifier et compilé sa ne change pas pour autant le résultat

Il faut bien te rendre compte que pour déverminer ce programme il faut posséder le matériel et mettre en route une manip équivalente. A part toi-même, personne ici n'a cette possibilité, à moins d'avoir la chance qu'un bon samaritain se décide.

Un bon conseil : aide-toi du moniteur série pour afficher les valeurs lues :

affichage dans le moniteur serie;la vitesse du vent est de m/s

Bonjour hbachetti

Sauf si comme ça semble être le cas dans ce programme, on ne cherche pas une valeur intermédiaire mais uniquement si c'est insolé ou pas.
Donc dans ce cas if (digitalRead == LOW) est juste.

Cordialement
jpbbricole

merci pour toute vos reponse mais une autre question me taraude: pourquoi j'ai aucune lecture de ldrs?

Qu'en sais-tu, puisqu'aucune valeur lue n'est affichée ?

Il faudrait réviser tes notions de C/ C++.
digitalRead(pin) est un appel de fonction.
digitalRead, sans accolades ni paramètres, représente l'adresse de la fonction digitalRead.

1 Like

Ce n'est pas ce que je demande. Il s'agit d'afficher les valeurs lues sur les LDRs.
Tu t’apercevras très vite que digitalRead() renverra une valeur positive en plein jour, et LOW la nuit.
Si tu lis la valeur avec analogRead(), tu devrais voir une différence.

par comparaison quand j'utilise un code test lumiere j'ai 4 ldrs qui affiche une valeur