[Résolu] Pb pour réinitialiser une variable, paramètre d'une fonction

Bonjour,

Je souhaite créer une extension (robot.h & robot.cpp) pour le logiciel mBlock afin de l’utiliser sur un robot avec des élèves.

Je travaille actuellement sur l’utilisation d’une télécommande IF (NEC) et la librairie IRremote.h .

Dans le programme principal, je lis la valeur de reçue par la télécommande, puis on appelle une fonction définie dans robot.h : robot.ir(2,valeur)
Le paramètre 2 est la touche qui serait appuyée et valeur la valeur reçue.

La fonction va analyser si la valeur reçue correspond bien à la valeur théorique de la télécommande si oui elle renvoie la valeur True et on réalise alors une action par exemple avancer.

Je souhaite ré-initialer la variable valeur (valeur = 0) à la fin de la fonction robot.ir(2,valeur) et je n(y arrive pas. Lors du retour sur le programme principal valeur n’a pas changée et est toujours la dernière valeur reçue.

Merci de votre aide

Voici mon code :
Le programme principal :

#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>

#include "robot.h"
#include <IRremote.h>

int RECV_PIN = 8;
IRrecv irrecv(RECV_PIN);
decode_results results;

double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
RobotClass robot; 

unsigned long valeur;

void setup(){
    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver
}

void loop(){

  
    if (irrecv.decode(&results)) {
        valeur = results.value;
        Serial.print(valeur, HEX);
        irrecv.resume(); // Receive the next value
    }
    
    if(robot.ir(2,valeur) 
    ){
        Serial.print("Avance");
        //valeur = 0; 
    }
    
    if(robot.ir(1,valeur) 
    ){
        Serial.print("Stop");
        //valeur = 0;
    }
    
}

Robot.cpp

#include "Robot.h"

#include "IRremote.h"

extern IRrecv irrecv;
extern decode_results results;

int RobotClass::ir(byte touche, unsigned long valeur){
  
  boolean resultat;
  resultat = false;

    switch (touche)
          {
            case 1:
            {
            if (valeur == 0xFF02FD) resultat = true;
            }
              break;
            case 2:
            {
            if (valeur == 0xFF629D) resultat = true;
            }
              break;
            case 3:
            {
            if (valeur == 0xFFA857) resultat = true;
            }
              break;
            case 4:
            {
            if (valeur == 0xFF22DD) resultat = true;
            }
              break;
            case 5:
            {
            if (valeur == 0xFFC23D) resultat = true;
            }
              break;
            case 6:
            {
            if (valeur == 0xFF4AB5) resultat = true;
            }
              break;
            case 7:
            {
            if (valeur == 0xFF6897) resultat = true;
            }
              break;
            case 8:
            {
            if (valeur == 0xFF9867) resultat = true;
            }
              break;
            case 9:
            {
            if (valeur == 0xFFB04F) resultat = true;
            }
              break;
            case 10:
            {
            if (valeur == 0xFF30CF) resultat = true;
            }
              break;
            case 11:
            {
            if (valeur == 0xFF18E7) resultat = true;
            }
              break;
            case 12:
            {
            if (valeur == 0xFF7A85) resultat = true;
            }
              break;
            case 13:
            {
            if (valeur == 0xFF10EF) resultat = true;
            }
              break;
            case 14:
            {
            if (valeur == 0xFF38C7) resultat = true;
            }
              break;
            case 15:
            {
            if (valeur == 0xFF5AA5) resultat = true;
            }
              break;
            case 16:
            {
            if (valeur == 0xFF52AD) resultat = true;
            }
              break;
            case 17:
            {
            if (valeur == 0xFF42BD) resultat = true;
            }
              break;
      
          };
  valeur = 0;
  return resultat;
}

Robot.h

#ifndef Robot_h
#define Robot_h

#include <Arduino.h>

class RobotClass
{
	public:
		RobotClass();
		void motor(byte mode, byte vitesse);
		void singleMotor(int mot, int speed_direction);
		int ir(byte touche, unsigned long valeur);
	private:
		int level;
};

#endif

Bonjour,

Il faut la passer par référence

int RobotClass::ir(byte touche, unsigned long &valeur)

Je vous remercie pour votre aide.

Je viens d'essayer le fonctionnement à bien évolué puisque qu'il ne me prend bien en compte qu'un seul appui sur le bouton MAIS c'est bizarre cela fonctionne que pour la touche 2.

Le programme principal ne lit que le premier if(robot.ir ?

C'est normal puisque valeur est remis à 0 par le premier appel à robot.ir()
il ne faut pas remettre valeur à 0 et faire le traitement uniquement quand on a reçu qqchose

void loop() {
  if (irrecv.decode(&results)) {
    valeur = results.value;
    Serial.print(valeur, HEX);
    irrecv.resume(); // Receive the next value

    if (robot.ir(2, valeur))
    {
      Serial.print("Avance");
    }

    if (robot.ir(1, valeur))
    {
      Serial.print("Stop");
    }
  }
}

Oups désolé
Effectivement, je viens de ré-initialiser la variable que si la touche est 'Vrai".
C'est parfait cela fonctionnement.

Je vous remercie beaucoup, je vais regarder cette notion de passer par référence pour mieux comprendre.
Bonne journée