Autres Comparaison dans un IF...

G

gaston83

Compagnon
Bonjour à tous,

Je suis sur un projet de Tracker Solaire... avec l'aide de @speedjf37. Il y a donc 4 LDR (topleft, topright, botleft et botright) pour le suivi.

Dans un If ... je dois comparer les mesures faites sur les 4 ldr avec des ET. Voilà ce que j'ai fait..




et ça fonctionne pas (peut-être qu'il y a trop d'opérandes à comparer... ? )

et si je fais çà..


çà fonctionne

en gros, si l'une des ldr est égal 511, je lance une fonction qui fait revenir mon panneau à l'Est. (levée du soleil)
 
D

Dudulle

Compagnon
Il faudrait voir le schéma, mais personnellement j'aurais plutôt calculé tr - tl et br - bl. Le résultat est stocké dans une variable.
Si la valeur absolue de cette différence est inférieure à une limite (à définir) tu ne fais rien, sinon tu actionne le servo selon le signe de la variable.
 
G

gerard crochon

Compagnon
j i pas mal de panneau installé sur les toits (40 KWC et pour 20KWC depuis 12 ans ) mais pas de traker ..
j'y avais réfléchi , un probleme de prise au vent suivant la surface des panneaux ,, un probleme de prix . a construire ..
pour la rotation , j'ai vu qu'il y a pas mal de solution toute faite ..
je pensais utiliser un moto réducteur ; j'ai besoin de 15° heure soit 0,25° seconde .. il n'y a pas besoin de grosse puissance vu la démultiplication ... rien pour le réglage en hauteur , juste une position été et hiver ..
j'ai abandonné le projet ....
 
F

Fran

Compagnon
Pourquoi xxx / 2 == 511 plutôt que xxx == 1022 ? Ça ferait déjà une opération de moins
 
C

coredump

Compagnon
Ça change rien, le compilateur optimise ça.
Par contre il faut être clair sur la precedence des opérateur en mettant de parenthèses entre autour des comparaisons.
 
D

Dudulle

Compagnon
Il faut surtout refaire toute la procédure, c'est un peu bancal là...
Pour commencer il faudrait écrire en langage naturel ce qui doit être fait.

Tu as utilisé 4 entrées, une par ldr ?
 
Dernière édition:
M

midodiy

Compagnon
Comment les 4 ldr peuvent voir la même luminosité ? La nuit? Mais si elles voient 1023, du coup, ca marche pas! Faudrait pas >= à la place de ==?
 
O

OldTom

Apprenti
En effet il faudrait plus d'informations sur ce qui doit être fait.

Par contre, les deux extraits de code ne font pas la même chose.
Dans le premier extrait, le code
n'est conditionné que par "servoh <= 25" alors que dans le second, il est conditionné par "tr / 2 == 511" && "tl / 2 == 511" && "br / 2 == 511" && "servoh <= 25".
D’où le comportement différent.

si l'une des ldr est égal 511, je lance une fonction qui fait revenir mon panneau à l'Est
Dans ce cas c'est des OR, pas des AND dans la condition.

Autre point, si les valeurs sont des relevés, il vaut pieux éviter les comparaisons strictes (l'opérateur ==).
Au passage il faut vérifier que les variables soient des "int", avec des "floats" il peut y avoir des surprises.
 
C

coredump

Compagnon
Il y a aussi une erreur la, ou du moins on n'écrit jamais de code comme ça:

if (servoh = 180)

Car c'est toujours vrai !
D'ailleurs certain utilisent cette notation pour éviter les erreurs:

if (180 == servoh)
 
  • Réagir
Reactions: g0b
G

gaston83

Compagnon
Tu as utilisé 4 entrées, une par ldr ?
Oui...

Comment les 4 ldr peuvent voir la même luminosité ? La nuit? Mais si elles voient 1023, du coup, ca marche pas!
C'est le but... si il n'y a plus de luminosité on a 1023 (511 dans mon cas puisque je divise par deux... je fais çà parce avec Serial.print dans l'editeur Teraterm l'affichagene correspondait à rien... pourquoi pfffffff ????
Dans ce cas c'est des OR, pas des AND dans la condition.
Exact... j'avais corrigé. Il faut que les 4 ldr soient à 511 et que servoh soit <= 25 pour lancer le retour
Au passage il faut vérifier que les variables soient des "int"
elles sont bien déclarées en "int"

Il y a aussi une erreur la, ou du moins on n'écrit jamais de code comme ça:

if (servoh = 180)
Non, c'est voulu. Il faut que servoh soit à 180 au début du Loop. Sa valeur est ensuite modifié en fonction du suivi.

Sinon, comment je dois l'écrire ?
 
S

speedjf37

Compagnon
Bonjour,

Bon résumons !!

Lorsqu'il fait nuit il faut ramener le panneau à sa position de départ vers l'est.

Les valeurs de LDR dans le noir = ( a fond de adc ) soit 1023 pts.

Pourquoi comparer avec 511 une fois / 2 ?????

il serait plus sur de comparer >= 1000



if ((tr / 2 == 511) && ( tl / 2 == 511) && ( br / 2 == 511) && (bl / 2 == 511 ))
C'est bien un problème de parenthèses !
Si on fait
if (servo = 155)
On "met" 155 dans servo.

Pour une comparaison, c'est toujours
if (servo == 155)
Tout à fait !

JF
 
S

speedjf37

Compagnon
C'est le but... si il n'y a plus de luminosité on a 1023 (511 dans mon cas puisque je divise par deux... je fais çà parce avec Serial.print dans l'editeur Teraterm l'affichagene correspondait à rien... pourquoi pfffffff ????
et dans le serial moniteur de l'IDE ?
 
G

gaston83

Compagnon
J'ai aussi essayé

if (tr / 2 == 511 && tl / 2 == 511 && br / 2 == 511 && bl / 2 == 511)

et çà

if ((tr / 2 == 511) && (tl / 2 == 511) && (br / 2 == 511) && (bl / 2 == 511))

les deux fonctionnent à priori.
 
D

Dudulle

Compagnon

Le soucis des ldr c'est leur réponse qui n'est pas du tout linéaire. En gros un capteur de ce type te dis si il y a de la lumière ou pas, ce n'est pas très précis.
Il faudrait plutôt les placer par 2 dans un pont de mesure. On a donc 1 entrée par point milieu.
On utilise éventuellement une autre entrée pour mesurer le flux lumineux, avec un petit panneau solaire qui alimente une résistance de faible valeur (calculée pour avoir P max), ou une photodiode pour avoir une réponse linéaire.
On pilote le servomoteur seulement si le flux est supérieur à une valeur définie.
 
G

gaston83

Compagnon
Il faudrait plutôt les placer par 2 dans un pont de mesure. On a donc 1 entrée par point milieu.
On utilise éventuellement une autre entrée pour mesurer le flux lumineux, avec un petit panneau solaire qui alimente une résistance de faible valeur (calculée pour avoir P max), ou une photodiode pour avoir une réponse linéaire.
On pilote le servomoteur seulement si le flux est supérieur à une valeur définie.

Pourrait-on avoir un petit développement de tout ça ... :lol:
 
D

Dudulle

Compagnon
Ci dessous un petit schéma.

Les 2 ldr sont placées dans un pont diviseur ; un potentiomètre permet d'ajuster le point milieu. Il permet aussi de limiter l'intensité dans la branche, car les ldr peuvent descendre très bas en résistance.

Un petit panneau solaire (quelques euros sur ali) est utilisé pour mesurer le flux lumineux. Prenons par exemple un 5V 30 mA sur cette page :
On le relie à une résistance 150 ohm pour être un peu en dessous de l'intensité max. De cette façon on a une tension aux bornes de la résistances qui est directement fonction de l'ensoleillement (on a transformé le panneau en luxmètre).

si la tension aux bornes du panneau est supérieure à une valeur seuil on actionne le servomoteur en fonction de la valeur mesurée sur A0 et A1, sinon on ne fait rien, quelle que soit la valeur lue sur les entrées A0 et A1
On définira de préférence une bande morte pour éviter que le servo actionne sans arrêt si les valeurs de ldr sont très proches : Si on se trouve dans cette bande on ne fait rien, si on est en dessous ou au dessus on actionne le servo en conséquence.



DSC_1484.JPG
 
S

speedjf37

Compagnon
J'ai aussi essayé

if (tr / 2 == 511 && tl / 2 == 511 && br / 2 == 511 && bl / 2 == 511)

et çà

if ((tr / 2 == 511) && (tl / 2 == 511) && (br / 2 == 511) && (bl / 2 == 511))

les deux fonctionnent à priori.
J'ai déjà eu des soucis avec ce genre d'écriture maintenat j'assure le coup avec les parenthèses !
 
A

Aeth

Nouveau
J'ai déjà eu des soucis avec ce genre d'écriture maintenat j'assure le coup avec les parenthèses !

Il faut faire attention à la priorité des opérateurs en C, si on ne veut pas avoir de problème, effectivement, le mieux étant d'entourer les expressions de parenthèse. Voir, même la division :

if ( ((tr / 2) == 511) && ((tl / 2) == 511) && ((br / 2) == 511) && ((bl / 2) == 511)) )

(Les espaces sont juste là pour la visibilité).

Attention aussi aux "i++" / "++i" et aux affectations dans les conditions. Un exemple qui me fait hurler, dont use certains de mes collègues :

if (var1 = my_func() == var2)
 
P

ppt

Compagnon
Merci pour cette écriture
Manque plus que quelques commentaires supplémentaires et c'est parfait.

Je suis effaré à chaque fois que je vois du code, généralement c'est impossible de faire de la maintenance dessus.
c'est quand même pas difficile de mettre des commentaires, ca prends du temps, mais au moins on peut relire et reprendre le code des années après sans problème.

Heureusement que les normes qualités et sécurités commencent à mettre le nez dedans, ca fait juste 70 ans qu'on code comme des cochons
 
C

coredump

Compagnon
Commencent ? Non ça fait bien longtemps que c'est le cas.

Une première chose c'est de regarder ce que sort le compilateur et de ne pas avoir de warning a la compilation.
 
C

coredump

Compagnon
Normalement -Wall devrait faire un warning (c'est le'cas avec un compilateur moyennement récent).

Après je ne sais pas quelle est la version du compilateur Arduino ni sa configuration.

En tout cas c'est pas très malin vu que c'est surtout utilisé par des débutants.
 
A

Aeth

Nouveau
L'autre moyen c'est d'activer -Werror => tous les warnings sont traités comme des erreurs.
 
C

coredump

Compagnon
Ça ne changera rien si le warning n'est pas émis.
Il se contrôle avec -Wparentheses
Avec avr-gcc 5.4 il est bien émis quand on fait -Wall
 
A

Aeth

Nouveau
J'ai mal tourné ma phrase, en plus du -Wall, ajouter -Werror force le fait de traiter les warnings, puisqu'étant tous activés et traités comme des erreurs, le binaire ne sera pas compilé.
 
S

speedjf37

Compagnon
Bonjour,

Je suis effaré à chaque fois que je vois du code, généralement c'est impossible de faire de la maintenance dessus.
c'est quand même pas difficile de mettre des commentaires, ca prends du temps, mais au moins on peut relire et reprendre le code des années après sans problème.
Tout à fait d'accord avec toi !

Mais de toute façon il est toujours difficile de reprendre du code d'un autre , déja qu'il n'est pas toujours facile de se relire!

Pour mes propres codes parfois très copieux:
Je sépare le plus possible en fichiers bien ciblés.
Je nomme les variables et fonctions avec des noms les plus explicite possible;

J'essaie de mettre des commentaires sur les modifs et de les encadrer avec soit une version soit une date.

pas de Warning en version IDE 1.8.19

Using board 'teensy2' from platform in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr
Using core 'teensy' from platform in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr
Detecting libraries used...
*********
Opening Teensy Loader...


@gaston83
il faudrait vérifier ce fichier
1661442657783.png



JF
 

Sujets similaires

V
Réponses
3
Affichages
1 042
vibram
V
G
Réponses
0
Affichages
606
gaston83
G
zygo4619
Réponses
34
Affichages
35 461
zygo4619
zygo4619
M
Réponses
185
Affichages
24 872
wika58
wika58
taratata
Réponses
4
Affichages
4 258
taratata
taratata
V
Réponses
7
Affichages
1 986
vibram
V
J
Réponses
1
Affichages
1 838
pinou29
pinou29
Haut