Débutant je bloque dans le tutoriel d'Eskimon

Bouton simple, création d'une fonction

a marqué ce sujet comme résolu.

Bonjour

Je viens d'attaquer le très complet tutoriel d'Eskimon.

je bloque sur le programme sur la création de la fonction affiche :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
affiche(nombre_led);

void affiche(int valeur_recue)
{
    // on éteint toutes les LED
    digitalWrite(led_0, HIGH);
    digitalWrite(led_1, HIGH);
    digitalWrite(led_2, HIGH);
    digitalWrite(led_3, HIGH);

    // Puis on les allume une à une
    if(valeur_recue >= 1)
    {
        digitalWrite(led_0, LOW);
    }
    if(valeur_recue >= 2)
    {
        digitalWrite(led_1, LOW);
    }
    if(valeur_recue >= 3)
    {
        digitalWrite(led_2, LOW);
    }
    if(valeur_recue >= 4)
    {
        digitalWrite(led_3, LOW);
    }
}

J'ai beau relire la partie sur la création des fonction je ne comprend pas l'intérêt. J'ai supprimé la fonction affiche et utilisé directement la variable nombre_led dans la suite. Bon ca fonctionne mais je ne vois pas à côté de quoi je passe

J'ai l'impression que la fonction affiche ne fait que renommer la variable nombre_led en valeur_recue

(c'est aussi mon premier post j'espère l'avoir placé correctement)

Merci

Emmanuel

+0 -0

Salut,

Pour aider tout le monde qui vont venir t'aider, pourrais-tu éditer ton sujet pour que le code soit correctement coloré ? Deux solutions : tu sélectionne ton texte et tu clique sur l'icone <> dans la barre et tu choisi ton langage (Arduino n'y est pas mais on peut le changer).

Deuxième solution, tu le fait à la main : Tu rajoute ```arduino avant ta première ligne de code et ``` après la dernière.

Ça va rendre beaucoup mieux, exemple :

1
2
3
4
5
void affiche(int valeur_recue)
{
    // on éteint toutes les LED
    digitalWrite(led_0, HIGH);
}

ca fonctionne

Oui, les fonctions ne sont pas indispensable pour cet exemple.

La raison est donné dans le tutoriel « … pour éviter de se compliquer la vie et d'alourdir le code … ». Une fonction permet de regrouper un ensemble de lignes de code qui font sens ensemble. C'est très très utile en programmation pour simplifier le code et alléger le code mais comme tu va pas me croire sur parole, je vais te donner un exemple ;) .

Imagine, que dans ton programme, tu veux utiliser à plusieurs endroits ta fonction affiche (au début et à la fin de ton code). Tu pourrais très bien copier-coller le code qui convient sans utiliser de fonction mais tu aurais deux fois plus de ligne de code. Déjà, en soit c'est un souci mais imagine que tu es fait une erreur de développement, tu dois maintenant le changer à deux endroits différents.

N'hésite pas à continuer le tutoriel et tu te rendra rapidement compte que les fonctions, c'est le bien.

+4 -0

@kje désolé pour la forme du message initial c'était vraiment moche !

@hugo

mais tu aurais deux fois plus de ligne de code

Là c'est le code que j'ai mis pourquoi ça doublerait les lignes ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// on éteint toutes les led


    digitalWrite(led_0, HIGH);
    digitalWrite(led_1, HIGH);
    digitalWrite(led_2, HIGH);
    digitalWrite(led_3, HIGH);

    // Puis on les allume une à une
    if(nombre_led >= 1)
    {
        digitalWrite(led_0, LOW);
    }
    if(nombre_led >= 2)
    {
        digitalWrite(led_1, LOW);
    }
    if(nombre_led >= 3)
    {
        digitalWrite(led_2, LOW);
    }
    if(nombre_led >= 4)
    {
        digitalWrite(led_3, LOW);
    }

La structure de la fonction et l'intérêt m'échappe vraiment donc je vais suivre ton conseil et aller plus avant. J'avais peur que cela soit bloquant pour la suite.

Merci

+0 -0

La réponse d'Hugo est très bonne, et je vais la reformuler.

Imagine à un moment tu veux faire une animation avec tes 4 leds, on pourrait imaginer comme ca :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
digitalWrite(led_0, HIGH);
digitalWrite(led_1, HIGH);
digitalWrite(led_2, HIGH);
digitalWrite(led_3, HIGH);

// Oh le beau chenillard
digitalWrite(led_0, HIGH);
delay(100);
digitalWrite(led_0, HIGH);
digitalWrite(led_1, HIGH);
delay(100);
digitalWrite(led_1, HIGH);
digitalWrite(led_2, HIGH);
delay(100);
digitalWrite(led_2, HIGH);
digitalWrite(led_3, HIGH);
delay(100);
digitalWrite(led_3, HIGH);

Maintenant, admettons dans ton code selon différentes conditions tu veux afficher ce chenillard, (par exemple à 4 endroits différents), on aurait le code suivant par exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
void loop() {
    // ... Du code ...
    if(la_condition_un) {
        digitalWrite(led_0, HIGH);
        digitalWrite(led_1, HIGH);
        digitalWrite(led_2, HIGH);
        digitalWrite(led_3, HIGH);

        // Oh le beau chenillard
        digitalWrite(led_0, HIGH);
        delay(100);
        digitalWrite(led_0, HIGH);
        digitalWrite(led_1, HIGH);
        delay(100);
        digitalWrite(led_1, HIGH);
        digitalWrite(led_2, HIGH);
        delay(100);
        digitalWrite(led_2, HIGH);
        digitalWrite(led_3, HIGH);
        delay(100);
        digitalWrite(led_3, HIGH);
    }
    // ... Du code ...
    while(La_condition_2) {
        digitalWrite(led_0, HIGH);
        digitalWrite(led_1, HIGH);
        digitalWrite(led_2, HIGH);
        digitalWrite(led_3, HIGH);

        // Oh le beau chenillard
        digitalWrite(led_0, HIGH);
        delay(100);
        digitalWrite(led_0, HIGH);
        digitalWrite(led_1, HIGH);
        delay(100);
        digitalWrite(led_1, HIGH);
        digitalWrite(led_2, HIGH);
        delay(100);
        digitalWrite(led_2, HIGH);
        digitalWrite(led_3, HIGH);
        delay(100);
        digitalWrite(led_3, HIGH);
    }
    // ... Du code ...
    while(la_condition_3 && la_condition_4) {
        digitalWrite(led_0, HIGH);
        digitalWrite(led_1, HIGH);
        digitalWrite(led_2, HIGH);
        digitalWrite(led_3, HIGH);

        // Oh le beau chenillard
        digitalWrite(led_0, HIGH);
        delay(100);
        digitalWrite(led_0, HIGH);
        digitalWrite(led_1, HIGH);
        delay(100);
        digitalWrite(led_1, HIGH);
        digitalWrite(led_2, HIGH);
        delay(100);
        digitalWrite(led_2, HIGH);
        digitalWrite(led_3, HIGH);
        delay(100);
        digitalWrite(led_3, HIGH);
    }
    // ... Du code ...
    if(encore_une_condition) {
        // Quelque chose...
    } else {
        digitalWrite(led_0, HIGH);
        digitalWrite(led_1, HIGH);
        digitalWrite(led_2, HIGH);
        digitalWrite(led_3, HIGH);

        // Oh le beau chenillard
        digitalWrite(led_0, HIGH);
        delay(100);
        digitalWrite(led_0, HIGH);
        digitalWrite(led_1, HIGH);
        delay(100);
        digitalWrite(led_1, HIGH);
        digitalWrite(led_2, HIGH);
        delay(100);
        digitalWrite(led_2, HIGH);
        digitalWrite(led_3, HIGH);
        delay(100);
        digitalWrite(led_3, HIGH);
    }
}

Si maintenant tout le code du chenillard passe dans une fonction, voilà ce que le code devient :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void chenillard() {
    digitalWrite(led_0, HIGH);
    digitalWrite(led_1, HIGH);
    digitalWrite(led_2, HIGH);
    digitalWrite(led_3, HIGH);

    // Oh le beau chenillard
    digitalWrite(led_0, HIGH);
    delay(100);
    digitalWrite(led_0, HIGH);
    digitalWrite(led_1, HIGH);
    delay(100);
    digitalWrite(led_1, HIGH);
    digitalWrite(led_2, HIGH);
    delay(100);
    digitalWrite(led_2, HIGH);
    digitalWrite(led_3, HIGH);
    delay(100);
    digitalWrite(led_3, HIGH);
}

void loop() {
    // ... Du code ...
    if(la_condition_un) {
        chenillard();
    }
    // ... Du code ...
    while(La_condition_2) {
        chenillard();
    }
    // ... Du code ...
    while(la_condition_3 && la_condition_4) {
        chenillard();
    }
    // ... Du code ...
    if(encore_une_condition) {
        // Quelque chose...
    } else {
        chenillard();
    }
}

Pour exactement le même résultat, c'est quand même plus léger/clair non ?

+4 -0

Là j'ai bien intégré l'intérêt de la fonction :)

Ce qui me perturbe c'est la variable nombre_led qui devient le paramètre de le fonction affiche qui devient ensuite valeur_recue

je ne vois pas la différence entre nombre_led et valeur_recue

1
2
3
affiche(nombre_led);

void affiche(int valeur_recue)

valeur_recue c'est le nom a l'intérieur de la fonction. A l'extérieur il peut meme ne pas y avoir de nom :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
void affiche(int valeur_recue){
    // ...

}

int a = 1, b = 2, c = 3;
affiche(a);
affiche(b);
affiche(c);
affiche(42);
affiche(2*4);

Salut !

Ici valeur_recue c'est bien une variable qui est égale à nombre_led ?

emmanuel_75

En effet. Comme l'a expliqué Kje ci-dessus, valeur_recue n'existe qu'au sein de la fonction. Pour plus de détails, voilà ce qui se passe lorsque tu as ce code :

1
2
3
4
5
6
affiche(nombre_led);

void affiche(int valeur_recue)
{
    // bla bla code de la fonction
}

La valeur de nombre_led est recopiée lors de l'appel de la fonction et elle est renommée valeur_recue à l'intérieur de la fonction affiche. Donc tant que tu ne modifies pas valeur_recue à l'intérieur de la fonction, c'est bien la même valeur. Mais les deux variables n'ont pas de lien ! Si tu décides de modifier valeur_recue ça ne changera rien pour nombre_led qui se trouve à l'extérieur de la fonction. Et quand la fonction se termine, valeur_recue est supprimée car elle "appartient" uniquement à la fonction.

Pour résumer on peut dire ça :

1
2
3
4
5
6
7
8
9
int nombre_led = 2;
affiche(nombre_led);
// à cet endroit la fonction est terminée, nombre_led vaut toujours 2 et valeur_recue n'existe plus

void affiche(int valeur_recue) // juste ici valeur_recue prend la valeur de nombre_led qui est en paramètre de la fonction, mais ce n'est qu'une copie !
{
    // bla bla code de la fonction
    valeur_recue = 4; // on modifie valeur_recue mais ça ne change rien pour nombre_led
} // fin de la fonction, valeur_recue est supprimée lors du retour au code principal

J'espère que ça va t'aider. :)

+1 -0

Hello

Bon je suis allé un peu plus avant mais pas beaucoup j'ai calé au décodeur BCD :honte:

Ca m'a paru relativement compliqué du coup j'ai survolé la suite du tuto et j'ai eu un peu peur car ça m'a paru allant vers des passages aussi ardu et surtout je ne suis pas sur sur d'arriver à mettre en oeuvre quoi que ce soit.

En surfant sur internet j’avais eu l'impression qu'il été possible de mettre rapidement en oeuvre des petits objets connectés orientés domotique.

Du coup à la lumière du tuto et en revenant faire un tour le net j'ai l'impression que rien n'est si simple que ça et que c'est peut être énormément de bidouille pour un petit résultat.

Pour vous donner une idée je pensais pouvoir récupérer des données téléinfo de mon compteur edf ou alors celles de sondes de température RF pour déclencher une action (ouvrir/fermer un relais)

J'ai un peu l'impression d'apprendre le chinois pour aller faire des courses dans un magasin chinois avant de faire ma recette o_O

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte