Conserver la valeur des variables sur plusieurs boucles

Bonjour à tous,
J'ai un problème de Noob très certainement mais je ne trouve pas d'explication sur des tutos.
Comment Dois je déclarer une variable pour que sa valeur reste identique sur plusieurs boucles ?
ex : durant l'une des boucle je dis à mon moteur que sa vitesse doit être 5, comment faire pour que la variable vitesse conserve sa valeur sans lui redonner de consigne ?
Merci :slight_smile:

Bonjour,

As-tu déjà écrit ton programme?
Si oui, postes le (entre balises code) avec quelques explicitons concernant le fonctionnement désiré.

pas facile de comprendre ta question car une variable garde ça valeur tant que tu ne lui donne pas une autre valeur, donne nous un code pour voir ou tu bloque .

bonjour,
+1 pour le code.
mais bon, le principe est simple a faire.
valeur = x
on donne la valeur 5
tant que valeur = de valeur_recue => valeur =valeur
si valeur différent de valeur_recue => valeur = valeur_recue

//inclusion des librairies
#include <Servo.h> 
#include <CurieIMU.h>
#include <MadgwickAHRS.h>
#include <SoftwareSerial.h>
#include <math.h>

//Definition des ESC/moteurs
Servo ESC_1;
Servo ESC_2;
Servo ESC_3;
Servo ESC_4;

#define PinESC_1 9
#define PinESC_2 6
#define PinESC_3 5
#define PinESC_4 3

#define PinBleu 12
#define PinRouge 13

//variables d'echantillonage gyroscope
unsigned long tpsEchantillonageAX, tpsPrecedAX;
float accelScale, gyroScale;
// Creation d'un objet filtre
Madgwick filter;

// Creation d'un objet SorftwareSerial
SoftwareSerial mySerial(11, 4); // RX, TX

// Déclration des prototypes
void prepaMoteurs();

void vitesse(int speed1, int speed2, int speed3, int speed4);

float convertRawAcceleration(int aRaw);
float convertRawGyro(int gRaw);

void fonctionArret ();

//Boucle d'initialisation
void setup() {
  
  pinMode ( PinBleu, OUTPUT);
  pinMode ( PinRouge, OUTPUT);
  digitalWrite ( PinBleu, HIGH);
  
  //on initialise les ESCs
  ESC_1.attach(PinESC_1);
  ESC_2.attach(PinESC_2);
  ESC_3.attach(PinESC_3);
  ESC_4.attach(PinESC_4);
  
  // Lecture Serial (si nécessaire)
  Serial.begin(9600);
  mySerial.begin(9600);

  //on prépare les moteurs
  prepaMoteurs();
  
  // On lance le gyroscope
  CurieIMU.begin();
  CurieIMU.setGyroRate(25);
  CurieIMU.setAccelerometerRate(25);
  filter.begin(25);
  
  // On ecrit les parametresgyro (nb g et degrees)
  CurieIMU.setAccelerometerRange(2);
  CurieIMU.setGyroRange(250);  
  
  // initialisation du taux d'echantillonage (besoin de lecture à 25 Hz donc toutes les 1000000/25 microsec)
  tpsEchantillonageAX = 1000000 / 25;
  tpsPrecedAX = micros();

  digitalWrite ( PinBleu, LOW);
}

void loop() {

    // initialisation des variables
    
  // vitesses moteurs
  //int speed1, speed2, speed3, speed4;
  
  //coordonnées gyro
  int aix, aiy, aiz;
  int gix, giy, giz;
  float ax, ay, az;
  float gx, gy, gz;
  float roulis, tangage, lacet;
  float roulisWhish, tangageWish, lacetWish, vitesseWish;
  unsigned long TpsMicro = micros();
  int recu;

  //Aquisition données de positions (sans delay)
  if (TpsMicro - tpsPrecedAX >= tpsEchantillonageAX){
    // recuperation données brutes
    CurieIMU.readMotionSensor(aix, aiy, aiz, gix, giy, giz);

    // convertion par passage dans les fonctions
    ax = convertRawAcceleration(aix);
    ay = convertRawAcceleration(aiy);
    az = convertRawAcceleration(aiz);
    gx = convertRawGyro(gix);
    gy = convertRawGyro(giy);
    gz = convertRawGyro(giz);

    // filtre de calcul d'orientation
    filter.updateIMU(gx, gy, gz, ax, ay, az);

    // décuperation des données traitées dans le filtre
    roulis = filter.getRoll();
    tangage = filter.getPitch();
    lacet = filter.getYaw();
    //Serial.print("Orientation: ");
    //Serial.print(lacet);
    //Serial.print(" ");
    //Serial.print(tangage);
    //Serial.print(" ");
    //Serial.println(roulis);

    // on incrémente le temps préced
    tpsPrecedAX += tpsEchantillonageAX;
  }



  
   int input;
   int vitessepreced;
  if(mySerial.available() > 1){    
    input = mySerial.parseInt();//read serial input and convert to integer (-32,768 to 32,767)    
    Serial.print ("Input : \n");
    Serial.println (input);

    if (input == 1){
      digitalWrite (12, HIGH);
      digitalWrite (13, LOW);
      //fonctionArret();
    }
    else if (input == 2){
      digitalWrite (12, LOW);
      digitalWrite (13, HIGH);
    }
    else if (input >= 10 && input <= 30){
      lacetWish = lacet - (input-20)/2 ;
      lacetWish = fmod (lacetWish, 360);
    }
    else if (input >= 40 && input <= 60){
      tangageWish = (input-50) ;
    }
    else if (input >= 100 && input <= 300){
      vitesseWish = map ( input, 100, 300, 300, 950);
      vitessepreced = vitesseWish;
    }
  }

 
  // détermination des vitesses necessaires
  // par rapport au throttle et à l'avancement
  int speed1 = vitesseWish - tangageWish;
  int speed2 = vitesseWish - tangageWish;
  int speed3 = vitesseWish + tangageWish;
  int speed4 = vitesseWish + tangageWish;


  
  // par rapport au virage
  if (lacetWish < lacet || (lacet - lacetWish) < 0){
    speed1 += 5;
    speed2 -= 5; 
    speed3 += 5; 
    speed4 -= 5;    
  }
  else if (lacetWish > lacet || (lacet + lacetWish) > 360){
    speed1 -= 5;
    speed2 += 5; 
    speed3 -= 5; 
    speed4 += 5;    
  }

  
  // correction pour la stabilite
  if (roulis > 0){
    speed1 += 5;
    speed4 += 5; 
    speed2 -= 5; 
    speed3 -= 5; 
  }
  else if (roulis < 0){
    speed1 -= 5;
    speed4 -= 5; 
    speed2 += 5; 
    speed3 += 5;     
  }


//                                                      C'est la partie suivante que j'aimerai éviter d'avoir à écrire


  //Ecriture vitesse     
  if (input > 99){
  vitesse(speed1, speed2, speed3, speed4);
  Serial.print ("vitesses : \n");
  Serial.println (speed1);
  Serial.println (speed2);
  Serial.println (speed3);
  Serial.println (speed4);
  }




  
  mySerial.flush();//clear the serial buffer for unwanted inputs     
  
  delay(20);//delay little for better serial communication
 
}

//Fonctions diverses 


//Armage des moteurs
void prepaMoteurs() {
  ///revoir le détail de cette séquence
  Serial.println("Arming");
  vitesse(0,0,0,0);
  delay(10000);
  
  vitesse(300, 300, 300, 300);
  delay(3000);

  vitesse(0, 0, 0, 0);
  delay(4000);  
}

//boucle d'écriture des vitesses
void vitesse(int speed1, int speed2, int speed3, int speed4){
  // speed is from 0 to 100 where 0 is off and 100 is maximum speed
  //the following maps speed values of 0-100 to angles from 0-180,
  // some speed controllers may need different values, see the ESC instructions
  int angle1 = map(speed1, 0, 1023, 0, 180);
  int angle2 = map(speed2, 0, 1023, 0, 180);
  int angle3 = map(speed3, 0, 1023, 0, 180);
  int angle4 = map(speed4, 0, 1023, 0, 180);
  ESC_1.write(angle1);
  ESC_2.write(angle2);
  ESC_3.write(angle3);
  ESC_4.write(angle4);
}

// Boucles de convertion des donnees gyroscopiques
float convertRawAcceleration(int aRaw) {
  // since we are using 2G range
  // -2g maps to a raw value of -32768
  // +2g maps to a raw value of 32767
  
  float a = (aRaw * 2.0) / 32768.0;
  return a;
}

float convertRawGyro(int gRaw) {
  // since we are using 250 degrees/seconds range
  // -250 maps to a raw value of -32768
  // +250 maps to a raw value of 32767
  
  float g = (gRaw * 250.0) / 32768.0;
  return g;
}

void fonctionArret () {
  while (mySerial.available() != 0){    
    int lecture = mySerial.parseInt();//read serial input and convert to integer (-32,768 to 32,767)    
  }
}

Voilà mon code, c'est pour un drone ::slight_smile:
Sans la condition que j'ai indiquée par le commentaire que j'ai centré, à chaque fois que le drône reçoit une valeur autre que la valeur qui contrôle la hauteur, les valeurs de vitesse prenne pour valeur des chiffres très faibles ( genre 7 ou 12 ou 5 ) alors qu'elles sont censées restée entre 300 et 950...

Désolé mon code n'est pas très digeste mais je ne sais pas faire mieux

Merci pour votre aide

J'ai donc trouver ce qui ne va pas, j'ai déclarer mes valeurs dans la boucle et pas à l'exterieur... enfin il me semble que ce soit la source de mes problèmes. Quelqu'un pourrait par contre m'expliquer pour quoi on à des résultats si différents en fonction de l'endroit ou l'on déclare ses variables ?
Merci :slight_smile:

Edit : Comment marquer le post comme résolu ?

Tu trouvera l'explication dans un tuto de C --> Visibilité des variables.
Ce n'est pas que je veux pas te répondre mais ce sera plus clair dans un tuto.

En règle générale tout ce qui touche au langage est expliqué dans les tuto généraux de C ou C++.

Le tuto conseillé par 68tjs est un "must read" si ce n'est pas déjà fait. Et sinon pour faire court si la variable est déclarée dans la boucle, à chaque passage dans la boucle elle est re-initialisée puisque tu repasse par la déclaration.