Go Down

Topic: IDE Arduino - variables (Read 2061 times) previous topic - next topic

Phoenix65

Bonjour.

J'ai de la peine à comprendre ce que fait la "fonction" #define
Et j'aimerais aussi savoir si ce qui est défini avec ça est valable pour tout les onglets dans l'IDE ?

Christian_R

#define permet de créer en début de programme une "variable fixe", non modifiable dans la suite car fixée lors de la compilation, ça permet d'économiser de la mémoire aussi.
Christian

Phoenix65

Et est-ce équivalent alors à un truc comme ça ?
const int maVariable = 0;

fdufnews

C'est un peu restrictif comme définition.
Code: [Select]
#define nomDeChaine chaine

La ligne ci-dessus définit une chaine nommée nomDeChaine. Dans le fichier où est situé ce #define, à chaque fois que le pré-processeur recontrera nomDeChaine il lui substituera chaine.

Le #define est visible dans le fichier où il est défini mais aussi dans les fichiers qui incluent ce fichier (c'est typiquement le cas des fichiers .h qui contiennent des définitions et que l'on appelle par un #include en début d'un autre .h ou d'un .c, .cpp, .....)

Pour plus d'info http://fr.cppreference.com/w/cpp/preprocessor/define

Phoenix65

OK.

Et sur mon image plus haut, quel onglet s'exécute en premier ? Tous ? celui de gauche ?

fdufnews

Si tu veux que les définitions dans pins.h soient utilisées dans un autre fichier source du même projet il faut ajouter un #include "pins.h" au début du fichier.

Phoenix65

Ok merci !

Et dernière question en passant, il est pas possible d'avoir une condition directement sur une entrée digitale ?
Par exemple ici, tester directement l'état de "interupteur" sans devoir passer par "onoff" ?

fdufnews

Bien sur que c'est possible. C'est plus une facilité pour la mise au point. Cela permet de faire imprimer la valeur s'il y a des problèmes pendant le debug du programme.
D'ailleurs, il est fort possible que l'optimisation par le compilateur aboutisse à la suppression de cette variable car elle n'est utilisée nulle part ailleurs par la suite.

L'écriture suivante est parfaitement pertinente
Code: [Select]

if (digitalRead(interrupteur)==HIGH){
  faireCeci();
}else{
  faireCela();
}

voir même (dans la mesure ou digitalRead retourne soit 0 pour LOW, soit 1 pour HIGH)
Code: [Select]

if (digitalRead(interrupteur)){
  faireCeci();
}else{
  faireCela();
}

guix

CTRL+C et CTRL+V pour copier-coller du code, au lieu de faire des images :D

skywodd

Bonjour,


Et est-ce équivalent alors à un truc comme ça ?
const int maVariable = 0;

D'un point de vue optimisation un #define ou une variable const (pas un tableau par contre) c'est la même chose.
Le const ayant l'immense avantage d'associer un type fixe à la variable (c'est pas juste un remplacement de chaine de caractères avant la compilation).


Et sur mon image plus haut, quel onglet s'exécute en premier ? Tous ? celui de gauche ?

Tous, dans l'ordre où ils sont ouverts, soit de gauche à droite.
Lors de la compilation tout les onglets sont mis les un à la suite des autres dans un énorme fichier cpp.

Toutes variables, fonctions, define, ... déclaraient dans un onglet "supérieur" est accessible dans un onglet "inférieur".
Mais coder en ayant cela en tête est juste idiot, rien ne dit que les prochaines versions de l'ide ne feront pas un fichier cpp par onglet.


D'ailleurs, il est fort possible que l'optimisation par le compilateur aboutisse à la suppression de cette variable car elle n'est utilisée nulle part ailleurs par la suite.

Si la variable est globale mais pas static le compilateur va la garder (il ne peut pas savoir si la variable va être utilisé ailleurs dans le code).
(le linker par contre peut la supprimer si on lui demande explicitement via (arguments gcc) -fdata-sections -ffunction-sections -Wl,--gc-sections)
Si la variable est static + globale (ou locale) elle sera automatiquement "optimisé" si -Os est spécifié lors de la compilation.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Phoenix65


CTRL+C et CTRL+V pour copier-coller du code, au lieu de faire des images :D

Vous êtes pas marrant avec votre simplicité la !  XD XD

Merci pour les réponses en tout cas.

fdufnews



CTRL+C et CTRL+V pour copier-coller du code, au lieu de faire des images :D

Vous êtes pas marrant avec votre simplicité la !  XD XD

Merci pour les réponses en tout cas.

C'est surtout que si tu mets ton code dans le post au lieu d'une image cela nous permet de le recopier pour le corriger ou pour en citer un morceau.

Phoenix65

#12
Nov 22, 2012, 02:02 pm Last Edit: Nov 22, 2012, 02:04 pm by Phoenix65 Reason: 1
Voici alors ce que ça donne :
Code: [Select]
#include <Servo.h>

Servo myservo;                   // create servo object to control a servo (max 8)
const int interupteur = 11;      // interupteur sur la pin 11 (digitale)

void setup()
{
 myservo.attach(9);              // attaches the servo on pin 9 to the servo object
 pinMode(interupteur, INPUT);  
}

void loop()
{
 if(digitalRead(interupteur) == HIGH)
 {
   myservo.write(180);             // dit au servo d'aller en position ouverte (180°)
 }
 else
 {
   myservo.write(0);              // dit au servo d'aller en position fermée (0°)
 }
}


Question, pour brancher une LED sur une sortie me faut-t-il mettre une résistance en série ? Si oui, de combien ?

Et serait-il possible de condenser la ligne "const int interupteur = 11;" + "pinMode(interupteur, INPUT);" et quelque chose ainsi :
pinMode(11, INPUT);

guix

#13
Nov 22, 2012, 03:04 pm Last Edit: Nov 22, 2012, 03:13 pm by guix Reason: 1
Oui il faut une résistance pour limiter le courant que la LED pourrait tirer du pin de l'Arduino, qui ne peut délivrer que 20mA (vaut mieux éviter de dépasser cette valeur).

Pour calculer la résistance il faut connaitre les caractéristiques de la LED: le voltage (forward voltage) et le courant (forward current), supposons que tu ai une LED qui a besoin de 3.3V @ 20 mA pour fonctionner normalement, alors tu aura besoin d'une résistance de

(5V - 3.3V) / 0.02A = 85 Ohm

Enfin je crois...j'y connais pas grand chose non plus :)



Et serait-il possible de condenser la ligne "const int interupteur = 11;" + "pinMode(interupteur, INPUT);" et quelque chose ainsi :
pinMode(11, INPUT);


Oui mais alors tu devra aussi changer cette ligne:
Code: [Select]

if(digitalRead(interupteur) == HIGH)

et toutes les autres lignes qui utilisent "interrupteur"...et le jour où tu voudra changer de pin pour l'interrupteur tu sera bien ennuyé :)

Je te conseille de la laisser tranquille cette const, faut pas toujours chercher à compresser le code en croyant qu'il sera plus rapide, c'est rarement le cas :)

fdufnews

Cette écriture
Code: [Select]
const int interupteur = 11;
........
pinMode(interupteur, INPUT);

est utilisée pour rendre le code plus lisible.

Si tu reprends ton code dans 6 mois tu vas te demander "pin 11, pin 11 mais à quoi sert-elle" ou bien "sur quelle pin était connecté l'interrupteur".

Cette écriture permet d'avoir un code plus lisible.
En tête du programme tu sais que l'interrupteur est connecté broche 11.
Dans le corps du programme, tu vois immédiatement que tu lis l'état de l'interrupteur.

De plus, demain, si tu décides de connecter l'interrupteur sur la broche 6 il te suffiras de changer une ligne du programme pour réaffecter l'interrupteur à la broche 6 au lieu de changer cela dans plusieurs lignes avec le risque d'en oublier une ou de faire une faute de frappe.

Go Up