IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Factorisation du code / Appels de fonctions


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut Factorisation du code / Appels de fonctions
    Bonjour,
    Je me heurte à un problème bloquant, que je ne sais plus par quel bout prendre...

    Mon programme se présentait sous la forme suivante:
    Déclarations diverses
    void setup
    void loop
    if {
    blabla
    }
    if {
    blabla
    }
    }
    fonctionnait parfaitement, mais il y avait beaucoup de "if" (>15) et les instructions à l'intérieur de chaque if étaient longues.

    Pour améliorer la lisibilité de mon programme, j'ai déclaré des fonctions void nom() sans arguments avant l'instruction "void setup", et j'ai appelé ces fonctions void à l'intérieur du if concerné.

    C'est bien avant "void setup" qu'il faut définir les fonctions "void" que l'on utilisera ensuite à l'intérieur de "void loop" ? ou après ?

    Je n'ai aucune erreur à la compilation ni au transfert (nickel) sauf que mon programme ne fonctionne plus du tout: même l'affichage d'une chaîne de caractère (en l'occurrence la version du Firmware stockée en dur dans une constante) n'affiche plus rien.

    Si je recharge la version non factorisée du programme (c'est-à-dire avec toutes les instructions à l'intérieur de chaque if, sans appeler de void à l'intérieur de ces if, ça remarche.

    J'ai mis des points de déboguage (des Serial.println) qui me confirment que le programme passe bien là où il faut et appelle bien les fonctions void ad'hoc, c'est le cas puisqu'on voit bien sur le moniteur série qu'il passe là où il faut, mais aucune action en sortie de la Mega ! par exemple, des relais qui sont parfaitement commandés avec la version non factorisée ne le sont plus avec la version factorisée: les pins de sortie de la Mega restent à +5V alors que le programme passe bien par les instructions où je les mets à LOW.

    Je m'épuise à essayer de comprendre en vain...

    Avez-vous déjà eu ce phénomène ?

    En attendant de vous lire, je vais extraire une partie du code pour le poster.

    Merci à tous,

  2. #2
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    Comme promis, voici un extrait du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    char version[14]="ME_ZXL_v3.37F";
    boolean eclairage = true; 
    boolean status_function_pause = false;	// initialise le status de PAUSE à false au départ, puisqu'on n'a pas encore appuyé dessus.
    										// utilisé car le Nakamichi a besoin d'activer [PLAY] en plus pour lancer l'enregistrement
     
    boolean status_function_record = false; 	// initialise le status de la fonction RECORD à false au départ: permet de savoir si on vient d'une boucle Record
    boolean status_play = false; 				// initialise le status de PLAY à false au départ, puisqu'on n'a pas encore appuyé dessus.
     
    // DEBUT DE LA DECLARATION DES PINS DIGITALES POUR LES RELAIS DE LA CARTE "RM-300 MECHANISM" (identiques à l'ancienne RC-57):
    	int relai_STOP=46; // puisque c'est la pin D46 qui commande le relai N°1 "STOP" avec la nappe 6 fils reliant MEGA-2560 à la carte "RM-300 MECHANISM"
    	int relai_PAUSE=44; // puisque c'est la pin D44 qui commande le relai N°2 "PAUSE" (erreur sur la v250.ino où il avait "REC" avec la nappe 6 fils
    						// reliant MEGA-2560 à la carte "RM-300 MECHANISM"
    	int relai_PLAY=42; // puisque c'est la pin D42 qui commande le relai N°3 "PLAY" avec la nappe 6 fils reliant MEGA-2560 à la carte "RM-300 MECHANISM"
    	int relai_FF=40; // puisque c'est la pin D40 qui commande le relai N°4 "FF" avec la nappe 6 fils reliant NMEGA-2560 à la carte "RM-300 MECHANISM"
    	int relai_REW=38; // puisque c'est la pin D38 qui commande le relai N°5 "REW" avec la nappe 6 fils reliant MEGA-2560 à la carte "RM-300 MECHANISM"
    	int relai_REC=36; // puisque c'est la pin D36 qui commande le relai N°6 "REC" avec la nappe 6 fils reliant MEGA-2560 à la carte "RM-300 MECHANISM"
     
    // FIN DE LA DECLARATION DES PINS DIGITALES POUR LES RELAIS DE LA CARTE "RM-300 MECHANISM"
     
     
     
     
    // DEBUT DES DECLARATIONS POUR ECRAN LCD
    	#include <Wire.h> 	// librairy requise pour l'écran LCD, incluse dans l'IDE Arduino et qui n'apparaitra donc pas 
    						// dans le sous-dossier 'Librairies' du répertoire Arduino
     
    	#include <DFRobot_LCD.h> // librairy gérant les afficheurs DFRobot 0555 et équivalents
    	DFRobot_LCD lcd(16,2);  //16 characters and 2 lines of show
     
    // FIN DES DECLARATIONS POUR ECRAN ECRAN LCD 
     
     
    // =======================================================
    // DEBUT DES DECLARATIONS POUR RECEPTION
     
    	#include <IRremote.h>  	// librairy permettant d'utiliser l'IR, ici c'est la v3.3.0 qui est utilisée, d'où les syntaxes différentes
    							// par rapport aux versions 2.x de IRremote.h
    	const int RECV_PIN = 49; // car on relie la sortie du récepteur IR à la pin D49 de la MEGA-2560
     
    	char active_input[17]="Ready";// déclare la chaine appelée "active_input" que l'on affichera sur le LCD
     
     
    // FIN DES DECLARATIONS POUR RECEPTION         
    // =======================================================
     
     
    	void firmware()
    	{
    		Serial.println("Appui sur 0 ou HOME: Firmware ");
    		Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
    		// ATTENTION: inclure la modif demandée par TURCOVITCH pour réafficher la fonction en cours: à reprendre d'une
    		// version précédente v220 ???
     
     
    		lcd.clear(); // clear display
    		lcd.setCursor(0,0);
    		lcd.print("Firmware version"); // affichera "Firmware version" sur la 1ere ligne
    		lcd.setCursor(2,1); 
    		lcd.print(version); 
    		delay(3000); 
     
    		lcd.clear(); // clear display,
    		lcd.setCursor(1,1); // left second line (1 from 1-16, Ligne 1 from 0-1)
    		lcd.print(active_input); // puis remet re-affiche la fonction qui était active avant l'appel du Firmware
     
     
    	}
     
    void setup() 
    {
     
    	Serial.begin(115200); /
     
    	Serial3.begin(9600); // permet d'initialiser le port série Serial3 sur lequel est connecté le HC08
     
    	IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); // c'est l'instruction de remplacement donné par le Wiki Youtube
     
     
    // Et aussi tous les pinmode des RELAIS en Output ici:
     
    	pinMode(relai_PLAY,OUTPUT);
    	pinMode(relai_REW,OUTPUT);
    	pinMode(relai_FF,OUTPUT);
    	pinMode(relai_PAUSE,OUTPUT);
    	pinMode(relai_REC,OUTPUT);
    	pinMode(relai_STOP,OUTPUT);
     
     
    	Wire.begin(); // join I2C bus (address optional for master)
     
    // initialize d'après l'exemple fourni par DFRobot pour l'écran DFR0555
    	lcd.init();
     
    	// Print a message to the LCD.
        lcd.setCursor(0, 0); // 1ère position de la ligne 0
        lcd.print("Toto1");
        lcd.setCursor(0, 1); // 1ère position de la ligne 1
        lcd.print("Toto2");
    	delay(3000);
    	lcd.clear();
     
    // Par sécurité, on désactive TOUS les relais en les passant à LOW, puisqu'ils s'activent lorsqu'on les met à HIGH
    // au cas où un relais resterait collé 
    	digitalWrite(relai_REC,LOW);
    	digitalWrite(relai_PAUSE,LOW); 
    	digitalWrite(relai_FF,LOW);
    	digitalWrite(relai_REW,LOW);
    	digitalWrite(relai_PLAY,LOW);
    	digitalWrite(relai_STOP,LOW);
     
     
     
    } //Fin du void setup
     
    void loop()
    {
    	if((IrReceiver.decodedIRData.decodedRawData==0x87637D88)||(IrReceiver.decodedIRData.decodedRawData==0x2837E784))
    				{ 
     
    					firmware;	//on appelle donc la fonction FIRMWARE définie au début				
     
     
    					IrReceiver.decodedIRData.decodedRawData==0x000;
    					IrReceiver.resume();
    				} //Fin du IF pour la Fonction HOME affichant le FIRMWARE
     
     
     
     
    			delay(500);
    			IrReceiver.resume();
    		}
     
     
     
     
     
    }
    Bien sûr il y a des tas d'autres fonctions et des tas d'autres "if", mais ça me semble venir de l'emplacement erroné de certaines instructions...

  3. #3
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    on met des parenthèses pour un appel de fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if ((IrReceiver.decodedIRData.decodedRawData == 0x87637D88) || (IrReceiver.decodedIRData.decodedRawData == 0x2837E784)) {
        firmware(); //on appelle donc la fonction FIRMWARE définie au début
        IrReceiver.decodedIRData.decodedRawData == 0x000;
        IrReceiver.resume();
      } //Fin du IF pour la Fonction HOME affichant le FIRMWARE
    sinon pour la question, oui en C ou C++ il faut que le compilateur connaisse la déclaration de ce que vous utilisez AVANT que vous ne l'utilisiez. Donc c'est bien de déclarer (et définir dans votre cas) les fonctions avant le setup()

    cela dit l'IDE arduino essaye (mais parfois ça ne fonctionne pas) de détecter les fonctions pour vous mêmes si elles sont définies plus tard et injecte du code (la définition du prototype de la fonction) pour vous avant de compiler.


    PS/ attention vous appelez deux fois IrReceiver.resume(); si vous êtes rentré dans le if et il manque sans doute un appel à decode()

  4. #4
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    on met des parenthèses pour un appel de fonction
    quel âne je suis !!

    à force d'avoir le nez dessus, on ne voit plus rien...

    attention vous appelez deux fois IrReceiver.resume(); si vous êtes rentré dans le if et il manque sans doute un appel à decode()
    c'est peut-être parce que j'ai extrait certaines sections seulement: je vais vérifier ça de ce pas...

    Mille mercis comme d'hab !

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Oui, que le développeur qui n’a jamais fait ça vous jette la première pierre!!
    Ça m’est arrivé aussi. Dans ce cas un petit tour dehors, on se change les idées et quand on revient on trouve

  6. #6
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    Merci pour ta compréhension: ça sent le "vécu" et l'empathie...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. simplifier un code : appel de fonctions d'une liste
    Par marco056 dans le forum Général Python
    Réponses: 9
    Dernier message: 17/12/2015, 10h58
  2. [.net]Appeler une fonction située dans le code behind
    Par anto dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 20/05/2009, 13h05
  3. Appeler une fonction dans un code PHP
    Par Nasky dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/08/2007, 16h19
  4. Appel de fonction C# depuis du code C++
    Par yaumeguy dans le forum C++/CLI
    Réponses: 8
    Dernier message: 25/05/2007, 12h05
  5. appeler une fonction javascript dans le code html
    Par kawther dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/05/2007, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo