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.
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
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
le compilateur optimise en chargeant directement un registre sans utiliser de variable
Exactement comme avec un const byte (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.