J’ai pour idée de faire un tracker solaire je sais que le sujet a déjà été mainte et mainte fois vu mais je ne trouve pas les info nécessaire .
je n’y connais rien en programmation et donc je décrypte au fut et a mesure les programmes comme je le peux .
voila j’ai pour idée que mon tracker solaire sois gérée pour une Arduino donc et deux moteur 12v DCC.
J’ai en ma possession une Arduino nano ,un pont H, et deux moteur DCC 12v et une petit bout de panneaux solaire 16v pour commencer et a améliorée bien sur.
je vous joint mon bout de code que J’ai plagier a droit et gauche .
merci de votre retour .
cordialement
[
/*
Programme tracker solair V1.1
Date : 11/07/2018
Auteur : ***********************
*/
// 4 LdRs capteurs de lumière
int PinLdrEst = A0; //LDR haut gauche
int PinLdrOuest = A1; //LDR haut droit
int PinLdrHauteurd = A2; //LDR bas droit
int PinLdrHauteurg = A3; //LDR bas gauche
int Ecart = 40;
// 2 moteurs horizontal Est/Ouest et vertical Haut/Bas
//Mot H
const int ENA = 10;
const int IN1 = 9;
const int IN2 = 8;
//Mot V
const int ENB = 5;
const int IN3 = 6;
const int IN4 = 7;
int lumi = 900; // intensité lumineuse minimum
void setup()
{
Serial.begin(9600); // lecture écran
pinMode(PinLdrEst,INPUT); // entrées / sorties Ldrs
pinMode(PinLdrOuest,INPUT);
pinMode(PinLdrHauteurd,INPUT);
pinMode(PinLdrHauteurg,INPUT);
pinMode(ENA, OUTPUT); //moteurs
pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
delay(500);
}
void loop()
{
int ValLdrEst = analogRead(PinLdrEst); // lire et calculer les valeurs
int ValLdrOuest = analogRead(PinLdrOuest);
int ValLdrHauteurd = analogRead(PinLdrHauteur);
int ValLdrHauteurg = analogRead(PinLdrHauteur);
//int Bas = (ValLdrHauteurd + ValLdrHauteurg) / 2;
Serial.print(" HD "); Serial.println(ValLdrHauteurd);
Serial.print(" E "); Serial.println(ValLdrEst);
Serial.print(" O "); Serial.println(ValLdrOuest);
Serial.print(" HG "); Serial.println(ValLdrHauteurg);
int test = ValLdrEst + ValLdrOuest + ValLdrHauteurd + ValLdrHauteurg; // établit la luminosité ambiante
test = test / 4;
Serial.print(" test ");
Serial.print (test);
Serial.print(" ");
int Diff1 = ValLdrEst - ValLdrOuest;
Diff1 = abs(Diff1);
int Diff2 = ValLdrHauteurd - ValLdrHauteurg;
Diff2 = abs(Diff2);
if (test <= lumi || Diff1 <= Ecart || Diff2 <= Ecart)
{
digitalWrite(ENA, LOW); // les 2 Moteurs sont arrétés !
digitalWrite(ENB, LOW);
}
if (test >= lumi && ValLdrEst < ValLdrOuest && Diff1 > Ecart)
{
digitalWrite(IN1, LOW); // Moteur H tourne dans un sens
digitalWrite(IN2, HIGH);
analogWrite(ENA, 130);
Serial.println(" Est < Ouest");
}
else if (test >= lumi && ValLdrEst > ValLdrOuest && Diff1 > Ecart)
{
digitalWrite(IN1, HIGH); // Moteur H tourne dans l'autre sens
digitalWrite(IN2, LOW);
analogWrite(ENA, 130);
Serial.println(" Est > Ouest ");
}
// SENS vertical
if(test >= lumi && ValLdrHauteurd < ValLdrHauteurg && Diff2 > Ecart)
{
digitalWrite(IN3, LOW); // Moteur V tourne dans un sens
digitalWrite(IN4, HIGH);
analogWrite(ENB, 120);
Serial.println(" Hauteur < Bas");
}
else if (test >= lumi && ValLdrHauteurd > ValLdrHauteurg && Diff2 > Ecart)
{
digitalWrite(IN3, HIGH); // Moteur V tourne dans l'autre sens
digitalWrite(IN4, LOW);
analogWrite(ENB, 120);
Serial.println(" Hauteur > Bas ");
}
delay (1000);
}
]
Merci de bien lire les règles du forum pour poster du code; corrigez votre post ci dessus, mettez le code dans le post et rajoutez les code tags autour du code: [code]`` [color=blue]// votre code ici[/color] ``[/code].
ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l’IDE avant de copier le code pour qu’il soit indenté correctement)
Bonjour
Ton code a l'air bien. Deux petites choses cependant :
La première lecture d'un pin analogique est toujours fausse. Pour éviter ça, tu devrais dupliquer les 4 lignes de lecture des pins analogiques dans le setup (tu les conserves dans la loop) afin d'avoir une phase de lecture "à blanc" qui règle ce problème.
Tel qu'il est écrit, ton code va constamment faire des mesures et des corrections de position du panneau solaire, et ceci à "grande vitesse" puisque tu mets le PWM à 120-130 soit près de la moitié de la vitesse maximale. Ça risque de consommer plus que ce que ça va produire Tu devrais te tourner vers un régulateur PID pour positionner le panneau de manière qu'il ne fasse que des petites corrections autour de la position optimale.
La première lecture d'un pin analogique est toujours fausse.
Non c’est une légende urbaine qui se propage sur le forum - ce n’est pas cela, il faut pas lire les 4 pins dans le setup ça sert absolument à rien
Le soucis que vous pouvez rencontrer c’est quand vous lisez deux pins différentes rapidement (consecutiveent) et qu’il y a une grosse différence de potentiel entre ces pins - comme il n’y a qu’un seul convertisseur il se peut dans ce cas que la lecture soit faussée à cause du temps de stabilisation du condensateur qui sert à la mesure.
=> Donc lire les 4 pins dans le setup ne sert absolument à rien - par contre dans la loop éventuellement faire 2 lectures par pins pour s’assurer de la stabilisation de l’entree Choisie xonnectee à l’étage de l’ADC (mais comme elles seront quand même route plus ou moins éclairées il
Ne devrait pas y avoir une mega différence de potentiel)
bonjour et encore merci pour vos réponse , j’espère avoir bien fait pour le code sur le 1er post dsl.
après vous allez un peu vite pour moi , dit moi si j'ai bien compris donc il faut que je place
// pinMode(PinLdrEst,INPUT);
pinMode(PinLdrOuest,INPUT);
pinMode(PinLdrHauteurd,INPUT);
pinMode(PinLdrHauteurg,INPUT);
dans le loop et que je passe a un delay(500) a (5000) par exemple pour donner le temps de bien calculer .
pour info je fait met test virtuel avec Tinkercad.
a oui pk quand je start mon code j'ai la valeur de mes ldr qui varie toute seul étant donner que c virtuel et que rien n'est brancher sur la carte ?
et petit question comment vous feriez pour que arriver a un point précis dans le temps ou sur un nombre de tour du moteur dcc par exemple le programme retourne a un point de départ (faut il mettre des End stop ) .
int ValLdrEst = analogRead(PinLdrEst); // lire et calculer les valeurs
int ValLdrOuest = analogRead(PinLdrOuest);
int ValLdrHauteurd = analogRead(PinLdrHauteur);
int ValLdrHauteurg = analogRead(PinLdrHauteur);
J-M-L dit que ce n'est pas nécessaire, par contre, il propose de les dupliquer. Ca reviendrait, si je comprends bien à les remplacer par :
int ValLdrEst = analogRead(PinLdrEst); // lire et calculer les valeurs
int ValLdrEst = analogRead(PinLdrEst);
int ValLdrOuest = analogRead(PinLdrOuest);
int ValLdrOuest = analogRead(PinLdrOuest);
int ValLdrHauteurd = analogRead(PinLdrHauteur);
int ValLdrHauteurd = analogRead(PinLdrHauteur);
int ValLdrHauteurg = analogRead(PinLdrHauteur);
int ValLdrHauteurg = analogRead(PinLdrHauteur);
La proposition de J-M-L est bonne, mais bien sur il ne faut pas dupliquer la définition des variables.
Ce qui donne:
analogRead(PinLdrEst); int ValLdrEst = analogRead(PinLdrEst);
analogRead(PinLdrOuest); int ValLdrOuest = analogRead(PinLdrOuest);
analogRead(PinLdrHauteurd); int ValLdrHauteurd = analogRead(PinLdrHauteurd);
analogRead(PinLdrHauteurg); int ValLdrHauteurg = analogRead(PinLdrHauteurg);
Si une entrée analogique est laissée en l'air, sa haute impédance fait varier son potentiel dans tous les sens. Mets ton doigt dessus et tu liras d'autres valeurs.
pinMode() pour une entrée analogique n'a aucun effet. C'est une fonction prévue pour les I/O digitales.
salut a tous dsl mais je suis a contre courant je ne comprend pas se qui parais si simple pour vous .
quelle qu'un de charitable pourrais prendre le temps de m'expliquer en détail la réponse de hbachetti.
car je suis comme st Thomas ce que je vois pas je le comprend pas lol mais la logique de ce programme puffff me dépasse . le pinMode() par exemple g pas compris car comme je l'ai dit g récupéré ce programme qui me semble adéquate pour mon projet et que je voudrais mettre en route ; j'y ai inclu une horloge car je voudrai que tout les jours a 22h30 celui ci revien a son point de depart qui sera un contacteur end stop qu'il faudrat inclure en fin de boucle loop je supose avec un if l'heure .
ps: ctrl-T m’ouvre une nouvelle page internet donc je repose mon code comme plus haut dsl .