For (int x=0 ; x<3 ; x++)

Bonjour à tous,
Je suis tombé sur le tuto suivant et j'aimerais avoir quelques explications :

Int ledPin = 10 ; // on crée une constante « ledPin » que l’on associe à la broche PIN 10
Voidsetup () {
pinMode (ledPin, OUTPOUT) ; //on indique que la constante « ledPin » est une sortie
}
Voidloop ()
//pour faire les 3 signaux courts
For (int x=0 ; x<3 ; x++) {
digitalWrite (ledPin, HIGH) ; //on laisse passer l’électricité et allume le PIN de la broche 10
delay(150); // on attend un délai de 150 millisecondes
digitalWrite (ledPin, LOW) ; // on ne laisse pas passer l’électricité et éteint le PIN de la broche 10
delay(100); // on attend un délai de 100 millisecondes
}
// créer un delais entre les signaux courts et longs
delay(100); // on attend un délai de 100 millisecondes
//pour faire les 3 signaux longs
For (int x=0 ; x<3 ; x++) {
digitalWrite (ledPin, HIGH) ; //on laisse passer l’électricité et allume le PIN de la broche 10
delay(400); // on attend un délai de 400 millisecondes
digitalWrite (ledPin, LOW) ; // on ne laisse pas passer l’électricité et éteint le PIN de la broche 10
delay(100); // on attend un délai de 100 millisecondes
}
// créer un delais entre les signaux longs et cours
delay(100); // on attend un délai de 100 millisecondes
//pour faire les 3 signaux courts
For (int x=0 ; x<3 ; x++) {
digitalWrite (ledPin, HIGH) ; //on laisse passer l’électricité et allume le PIN de la broche 10
delay(150); // on attend un délai de 150 millisecondes
digitalWrite (ledPin, LOW) ; // on ne laisse pas passer l’électricité et éteint le PIN de la broche 10
delay(100); // on attend un délai de 100 millisecondes
}
// créer un delais de 5 secondes avant de lancer la boucle et donc le SOS
delay(5000); // on attend un délai de 5000 millisecondes soit 5 secondes

A quoi sert le code For (int x=0 ; x<3 ; x++), je pensait qu'il limitait la boucle à ne pas reboucler au début de ce code.

Merci pour votre éclairage.

Je sais pas où tu as trouvé ce tuto mais il n'est pas des mieux écrits

Une boucle for s'écrit for(... ; ... ; ...) et pas For(... ; ... ; ...) (avec une majuscule)
Déclarer le variable int x dans chaque boucle for ne sert à rien

void loop() {
   int x;
   for(x=0, x<3; x++) {
      ...
      }
   for(x=0; x<3; x++) {
      ...
      }

Passons.

For (int x=0 ; x<3 ; x++) {
digitalWrite (ledPin, HIGH) ;  //on laisse passer l'électricité et allume le PIN de la broche 10
delay(150);  // on attend un délai de 150 millisecondes
digitalWrite (ledPin, LOW) ;  // on ne laisse pas passer l'électricité et éteint le PIN de la broche 10
delay(100);  // on attend un délai de 100 millisecondes
}

Exécute 3 fois les lignes de code entre { et }

C'est valable pour les 3 boucles

Mais comme loop() est une boucle qui se répète indéfiniment toutes les lignes contenues entre { et } après loop(), se répètent elles aussi indéfiniment

Juste pour info : 3 signaux courts, 3 signaux longs, 3 signaux courts
En morse ça donne ...---...
Qui est le signal de détresse SOS

Déclarer le variable int x dans chaque boucle for ne sert à rien

Bof votre déclaration en variable locale de la boucle dans ce cas n’est pas mieux.

Comme x n’est pas utilisé en dehors de la boucle for, c’est tout à fait acceptable de faire cela et ça ne prend pas plus de temps vu que c’est sur la pile. Donc rien ne s’y oppose

Cela dit compter à 3 avec un int, ça s’est ridicule... il faut utiliser un byte ou char - ce sera plus performant sur un processeur 8 bits

Cela dit compter à 3 avec un int, ça s'est ridicule... il faut utiliser un byte ou char - ce sera plus performant sur un processeur 8 bits

C'est certain que gagner quelques µs est indispensable avec un code qui totalise 8000 ms de delay :grin:

Alain46:
C'est certain que gagner quelques µs est indispensable avec un code qui totalise 8000 ms de delay :grin:

C’est surtout gagner 1 octet de RAM qui est super important :slight_smile:

On peut même en gagner deux autres

int ledPin = 10 ;  // on crée une constante « ledPin » que l'on associe à la broche PIN 10

En utilisant vraiment une constante...const byte ledPin = 10 ;  // on crée une constante « ledPin » que l'on associe à la broche PIN 10

et avec

#define ledPin 10

le compilateur optimise en chargeant directement un registre sans utiliser de variable

Alain46:
et avec

#define ledPin 10

le compilateur optimise en chargeant directement un registre sans utiliser de variable

Exactement comme avec un const byte :slight_smile: (d’où le gain des 2 octets mentionnés) et avec de surcroît une aide à la compilation en précisant le type (qui dans un #define par défaut sera un int, pas vraiment génant pour un N° de pin)

ÉDIT - votre point sur un registre n’est pas correct - ce que va réaliser le préprocesseur est ainsi: Votre pinMode(ledPin, OUTPUT) va être récrit par le pré processeur en pinMode(10, OUTPUT) ou 10 est traité comme un entier par défaut (OUTPUT va aussi être remplacé bien sûr) . C’est un littéral et la fonction attend un uint8_t donc le compilo va voir que la valeur tient sur un octet et va sans doute faire ce qu’il faut e ne mettre qu’un octet sur la pile - pas dans un registre. Mais il se pourrait qu’il fasse un masque pour ne prendre que l’octet de poids faible du littéral fourni pour l’adapter (cast) au type attendu dans l’appel de fonction. Donc générer plus de code que avec le const byte

En pratique plus vous pouvez donner d’information au compilateur, mieux ça vaut. donc préférer toujours un typage fort des données.

Si vous regardez comment arduino définit les noms de quelques pins significatives ils font comme cela

#define PIN_SPI_SS    (10)
#define PIN_SPI_MOSI  (11)
#define PIN_SPI_MISO  (12)
#define PIN_SPI_SCK   (13)

static const uint8_t SS   = PIN_SPI_SS;
static const uint8_t MOSI = PIN_SPI_MOSI;
static const uint8_t MISO = PIN_SPI_MISO;
static const uint8_t SCK  = PIN_SPI_SCK;

vous voyez qu’ils utilisent du typage fort.

Bonsoir,

Merci pour toutes ses explications.