Pages: [1] 2   Go Down
Author Topic: IDE Arduino - variables  (Read 1208 times)
0 Members and 1 Guest are viewing this topic.
Vallée de Joux (Suisse)
Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

france
Offline Offline
God Member
*****
Karma: 8
Posts: 689
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

#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.
Logged

Christian

Vallée de Joux (Suisse)
Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est un peu restrictif comme définition.
Code:
#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
Logged

Vallée de Joux (Suisse)
Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

OK.

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

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Vallée de Joux (Suisse)
Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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" ?
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
if (digitalRead(interrupteur)){
  faireCeci();
}else{
  faireCela();
}
Logged

France
Offline Offline
God Member
*****
Karma: 29
Posts: 898
Scientia potentia est.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

CTRL+C et CTRL+V pour copier-coller du code, au lieu de faire des images smiley-grin
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Vallée de Joux (Suisse)
Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

CTRL+C et CTRL+V pour copier-coller du code, au lieu de faire des images smiley-grin
Vous êtes pas marrant avec votre simplicité la !  smiley-lol smiley-lol

Merci pour les réponses en tout cas.
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

CTRL+C et CTRL+V pour copier-coller du code, au lieu de faire des images smiley-grin
Vous êtes pas marrant avec votre simplicité la !  smiley-lol smiley-lol

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.
Logged

Vallée de Joux (Suisse)
Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Voici alors ce que ça donne :
Code:
#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);
« Last Edit: November 22, 2012, 08:04:38 am by Phoenix65 » Logged

France
Offline Offline
God Member
*****
Karma: 29
Posts: 898
Scientia potentia est.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley


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:
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é smiley

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 smiley
« Last Edit: November 22, 2012, 09:13:48 am by guix » Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cette écriture
Code:
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.
Logged

Pages: [1] 2   Go Up
Jump to: