fusion de programmes , capteur ultra sonore et gestion de commande

bonjours je souhaite fusionné deux programme adapté à mes besoin par mes soins chacun des programme fonctionne parfaitement à par,
le premier permet de détecter via des capteurs ultra sonore un obstacle à moins de 200 mm en prenant en conte que les détections répété et non ponctuel

/* 
 * Code d'exemple pour un capteur à ultrasons HC-SR04.
 */

//asignation des variables des capteurs ultrat sonord 
const byte TRIGGERun = 52;const byte ECHOun = 53;  //broche de transmission par numéro de capteur. 
const byte TRIGGERdeux = 50; const byte ECHOdeux = 51;   
const byte TRIGGERtrois = 48; const byte ECHOtrois = 49;    
const byte TRIGGERquatre = 46; const byte ECHOquatre = 47;    
const byte TRIGGERcinq = 44; const byte ECHOcinq = 45;   
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s constante de calcule 
const float SOUND_SPEED = 340.0 / 1000; //vitesse du son 
long measureun;long measuredeux;long measuretrois;long measurequatre;long measurecinq; //doné récupéré 
float distanceun;float distancedeux;float distancetrois;float distancequatre;float distancecinq; //distance déduite
int bufer = 5;
int margesecu =200;

int danger =0;


void setup() {
   
  /* Initialise le port série */
  Serial.begin(2000000);
   
  /* Initialise les broches des capteur ultrat sonord */
  pinMode(TRIGGERun, OUTPUT);
  digitalWrite(TRIGGERun, LOW); 
  pinMode(ECHOun, INPUT);

   pinMode(TRIGGERdeux, OUTPUT);
  digitalWrite(TRIGGERdeux, LOW);
  pinMode(ECHOdeux, INPUT);

   pinMode(TRIGGERtrois, OUTPUT);
  digitalWrite(TRIGGERtrois, LOW); 
  pinMode(ECHOtrois, INPUT);

   pinMode(TRIGGERquatre, OUTPUT);
  digitalWrite(TRIGGERquatre, LOW); 
  pinMode(ECHOquatre, INPUT);

   pinMode(TRIGGERcinq, OUTPUT);
  digitalWrite(TRIGGERcinq, LOW); 
  pinMode(ECHOcinq, INPUT);
}
 
/** Fonction loop() */
void loop() {
  
//mesure des distance par les cpteurs ultrat sonord  
 digitalWrite(TRIGGERun, HIGH);
 digitalWrite(TRIGGERun, LOW);
long measureun= pulseIn(ECHOun, HIGH, MEASURE_TIMEOUT);
  float distanceun = measureun/ 2.0 * SOUND_SPEED;
 
   
    digitalWrite(TRIGGERdeux, HIGH);
  digitalWrite(TRIGGERdeux, LOW);
 long measuredeux= pulseIn(ECHOdeux, HIGH, MEASURE_TIMEOUT);
  float distancedeux = measuredeux/ 2.0 * SOUND_SPEED;
 
    digitalWrite(TRIGGERtrois, HIGH); 
  digitalWrite(TRIGGERtrois, LOW);
  long measuretrois= pulseIn(ECHOtrois, HIGH, MEASURE_TIMEOUT);
  float distancetrois = measuretrois/ 2.0 * SOUND_SPEED;
 
    
  digitalWrite(TRIGGERquatre, HIGH);
  digitalWrite(TRIGGERquatre, LOW);
   long measurequatre= pulseIn(ECHOquatre, HIGH, MEASURE_TIMEOUT);
  float distancequatre = measurequatre/ 2.0 * SOUND_SPEED;

    
 digitalWrite(TRIGGERcinq, HIGH); 
  digitalWrite(TRIGGERcinq, LOW);
  long measurecinq= pulseIn(ECHOcinq, HIGH, MEASURE_TIMEOUT);
  float distancecinq = measurecinq/ 2.0 * SOUND_SPEED;
  
  

  if((((distanceun>0)&&(distanceun<margesecu))|| ((distancedeux>0)&&(distancedeux<margesecu))||((distancetrois>0)&&(distancetrois<margesecu))||((distancequatre>0)&&(distancequatre<margesecu))||((distancecinq>0)&&(distancecinq<margesecu)))&&(bufer<=10)){
  bufer += 1; }
  else{if (bufer>0){bufer -=1;}}
  if (bufer>5){danger=1;}
  else{danger =0;}
  
  /* Affiche les résultats en mm*/
  Serial.println(distanceun);
  Serial.println(bufer);
  Serial.println(danger);
 
}

le second code et la gestion spatial et la commande des moteurs pas à pas du robot il sera lié à l'autre programme par la variable danger qui bloquera le robot.
voici ce que j'ai pus obtenir en fusionnant les deux code:

//programme de detection de danger par capteur ultrat sonord 
 //résiste au décablage d'un capteur , le m'et hors service sans pertuber les autres capteur
 //résiste au valeur ponctuelle avec un buffer de donnée ( ne decte pas une mouche qui passe...) 
 
 // variable temporelle
  float tempjeu = 0.0;//temps depuis le lenssement du jeux 
  float tempprog = 0.0;// temps soustrayant les poses du aux arrets imprévus sur le parcour et les periodes de rotation.
  const float finjeu = 100000.0; // temps de fin de jeux en mili seconde arréte le robot dans tout ces déplacement et action   
  float tempboucle = 0.0; // temp entre chaque boucle pour calculer l'étape la position à chaque boucle  
  float ecartp = 0.0; // variable calcule servant de repaire au tempboucle 
//variable de condition
  int contact = 1; // varible on off coup d'envois 
  int danger = 0;// détection d'un obstacle imprévus arrêt du véicule 
//variable de calcule spatial 
  const float sud = 1500*PI;const float nord = PI*500;const float est = 0.0;const float ouest = PI*1000;// orientation primaire utile en milli radiant 
  const float vmaxrec = 0.05;// vitesse max sur sol plat en mm par milli seconde 
  const float vmaxcirc = PI/12;//vitesse max circulaire sur sol plat  en milliradant par milliseconde
  float x = 0.0; // position d'origine en x en mm 
  float y = 0.0; // position d'origine en y en mm
  float oriente ;//angle de destination à l'étape doné 
  float n = 2.0;// marge de degrée pr arivé à l'orientation voulu se calcule en faisant vmaxcirc*tempbouclemax
  float tempbouclemax = 0; //permet de calculé la magre de degrée n en fonction de la vitesse minimal du programe 
  float degresReel = PI*500; //direction de la tête du robot dans le repére x y en mradiant radiant au démarage 
//Câblage moteur 1
  int ENAun=8; int IN1un=9; int IN2un=10; int ENBun=13; int IN3un=11; int IN4un=12; 
//cablaage moteur 2
  int ENAdeux=2; int IN1deux=3; int IN2deux=4; int ENBdeux=7; int IN3deux=5; int IN4deux=6; 
// etape de 1 à 8 des moteurs pas à pas 
  int etapemoteurun = 1;int etapemoteurdeux =1;
//asignation des variables des capteurs ultrat sonord 
  const byte TRIGGERun = 52;const byte ECHOun = 53;  //broche de transmission par numéro de capteur. 
  const byte TRIGGERdeux = 50; const byte ECHOdeux = 51;   
  const byte TRIGGERtrois = 48; const byte ECHOtrois = 49;    
  const byte TRIGGERquatre = 46; const byte ECHOquatre = 47;    
  const byte TRIGGERcinq = 44; const byte ECHOcinq = 45;   
  const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s constante de calcule 
  const float SOUND_SPEED = 340.0 / 1000; //vitesse du son 
  long measureun;long measuredeux;long measuretrois;long measurequatre;long measurecinq; //doné récupéré 
  float distanceun;float distancedeux;float distancetrois;float distancequatre;float distancecinq; //distance déduite
  int bufer = 5; //le risque doit étre vérifier cinq fois pr étre valide 
  int margesecu =200; //les distance de sécurité entre le robot et les obstacle 

//tableau des trajectoire
  int etape = 0; // étape dans l'avancement du programme  
  const int B = 5; //nombre d'étape 
  float parcour [3][B]{{500.0,600.0,600.0,200.0,4000.0},// déterminé la distance en mm 
                       {nord,est,est,ouest,PI*250},//déterminer la direction tableau servant d'interface pour stocker la trajectoire et les action à réaliser en degrée
                       {0.0,0.0,0.0,0.0,0.0,}}; // temprograme équivalent à l'éatape 
//led de test sans moniteur
  int pinledtest =36;                
  void setup() {
  Serial.begin(2000000);
//configurer led
  pinMode(pinledtest,OUTPUT);
//configurer les sortit moteur 
  pinMode(ENAun,OUTPUT);pinMode(ENBun,OUTPUT);pinMode(IN1un,OUTPUT);pinMode(IN2un,OUTPUT);pinMode(IN3un,OUTPUT);pinMode(IN4un,OUTPUT);//Les 6 pins configurées en sorties
  pinMode(ENAdeux,OUTPUT);  pinMode(ENBdeux,OUTPUT);pinMode(IN1deux,OUTPUT);pinMode(IN2deux,OUTPUT);pinMode(IN3deux,OUTPUT);pinMode(IN4deux,OUTPUT);//Les 6 pins configurées en sorties
//Enable A et B, utiliser les 2 ponts en H
  digitalWrite(ENAun,HIGH);digitalWrite(ENBun,HIGH);digitalWrite(ENAdeux,HIGH);digitalWrite(ENBdeux,HIGH);
// Initialise les broches des capteur ultrat sonord 
  pinMode(TRIGGERun, OUTPUT);digitalWrite(TRIGGERun, LOW); pinMode(ECHOun, INPUT);
  pinMode(TRIGGERdeux, OUTPUT);digitalWrite(TRIGGERdeux, LOW);pinMode(ECHOdeux, INPUT);
  pinMode(TRIGGERtrois, OUTPUT);digitalWrite(TRIGGERtrois, LOW); pinMode(ECHOtrois, INPUT);
  pinMode(TRIGGERquatre, OUTPUT);digitalWrite(TRIGGERquatre, LOW); pinMode(ECHOquatre, INPUT);
  pinMode(TRIGGERcinq, OUTPUT);digitalWrite(TRIGGERcinq, LOW); pinMode(ECHOcinq, INPUT);
//remplire la derniére ligne du tableau  
  oriente = parcour [1][0];
  parcour [2][0]= parcour [0][0] / vmaxrec;
  for (int i = 0 ; i <= B-1 ; i++){
    parcour [2][i+1] = parcour [2][i] + (parcour [0][i+1] / vmaxrec);}
}
  
void loop() {
// detecter le coup denvois
  if (contact == 1){ 
//prise des valeurs de distance par les capteurs ultrat sonord//
    digitalWrite(TRIGGERun, HIGH);digitalWrite(TRIGGERun, LOW);long measureun= pulseIn(ECHOun, HIGH, MEASURE_TIMEOUT);float distanceun = measureun/ 2.0 * SOUND_SPEED;
    digitalWrite(TRIGGERdeux, HIGH);digitalWrite(TRIGGERdeux, LOW);long measuredeux= pulseIn(ECHOdeux, HIGH, MEASURE_TIMEOUT);float distancedeux = measuredeux/ 2.0 * SOUND_SPEED; 
    digitalWrite(TRIGGERtrois, HIGH);digitalWrite(TRIGGERtrois, LOW);long measuretrois= pulseIn(ECHOtrois, HIGH, MEASURE_TIMEOUT);float distancetrois = measuretrois/ 2.0 * SOUND_SPEED;
    digitalWrite(TRIGGERquatre, HIGH);digitalWrite(TRIGGERquatre, LOW);long measurequatre= pulseIn(ECHOquatre, HIGH, MEASURE_TIMEOUT);float distancequatre = measurequatre/ 2.0 * SOUND_SPEED;
    digitalWrite(TRIGGERcinq, HIGH);digitalWrite(TRIGGERcinq, LOW);long measurecinq= pulseIn(ECHOcinq, HIGH, MEASURE_TIMEOUT);float distancecinq = measurecinq/ 2.0 * SOUND_SPEED; 
 // detecter un obstacle imprévut celon margesecu et avec un bufer ignorant les detection ponctuel
  if((((distanceun>0)&&(distanceun<margesecu))|| ((distancedeux>0)&&(distancedeux<margesecu))||((distancetrois>0)&&(distancetrois<margesecu))||((distancequatre>0)&&(distancequatre<margesecu))||((distancecinq>0)&&(distancecinq<margesecu)))&&(bufer<=10)){
  bufer += 1; }
  else{if (bufer>0){bufer -=1;}}
  if (bufer>5){danger=1;}
  else{danger =0;}
  
 //lecture détape //
    if ( tempprog >= parcour [2][etape]){etape = etape + 1;}// faire evoluer la trajectoire 
    oriente = parcour [1][etape];//lire l'orientation visé 
    if (danger == 0){
 //gestion spatial//
    //determiné la marge de précision de rotation en fonction de la vitesse du programe
      if ((tempboucle>tempbouclemax)&&(tempprog>1)){tempbouclemax = tempboucle;
      n = tempbouclemax*vmaxcirc/2;}
    //gestion d'avancé rectiligne
      if(((cos(oriente/1000)<cos(n/1000))&&(abs(oriente-degresReel)<=n))||((oriente-n<=0)&&((degresReel<=oriente+n)||(degresReel>=oriente-n+2000*PI)))||((oriente+n>=2000*PI)&&((degresReel<=oriente+n-2000*PI)||(degresReel>=oriente-n)))){ //si degresReel  convient  à l'orientation demandé avec une marge n (prenant en conte les écart n entre N et 2PI- n)
                          /* x = x + cos(degresReel / 1000) * tempboucle * vmaxrec ;//calculé x y théorique en m m, possiblement remplacé par un accélérométre dans la boucle principal 
                          y = y + sin(degresReel / 1000) * tempboucle * vmaxrec ;*/
                          if(millis()%20<=tempbouclemax){
                          etapemoteurun += 1;
                          etapemoteurdeux -= 1;
                          aplicationmoteur();}
                          }

la suite arive

//gestion de rotation
    else{ //si degresReel ne convient pas à l'orientation demandé avec une marge n (prenant en conte les écart n entre N et 2PI- n
                        if (((degresReel<oriente)&&(oriente-degresReel<1000*PI)&&(oriente-degresReel>0))||((degresReel>oriente)&&(oriente-degresReel<-1000*PI)&&(oriente-degresReel>-2000*PI))){
                        degresReel = degresReel + vmaxcirc * tempboucle;//calculer degresReel possiblement remplacé par un giroscope dans la cboucle principal et tourné dans le sens trigo
                        if(millis()%20<=tempbouclemax){
                        etapemoteurun += 1;
                        etapemoteurdeux += 1;
                        aplicationmoteur();}
                        }
                        else{degresReel = degresReel - vmaxcirc * tempboucle;//calculer degresReel possiblement remplacé par un giroscope dans la cboucle principal et tourné dans le sens horaire 
                        if(millis()%20<=tempbouclemax){
                        etapemoteurun -= 1;
                        etapemoteurdeux -= 1;
                        aplicationmoteur();}
                        }
      }
                        }
          
}
while (degresReel < 0){ degresReel += PI*2000;} //rendre positif degresReel
while (degresReel >= PI*2000){degresReel -= PI*2000;} // le réduire sous PI*2000 

//gestion temporelle//
    if (tempjeu > finjeu){danger = 1;}//si le temp de jeux et dépassé arrété tout
    if (contact == 1){ tempjeu = tempjeu + tempboucle;
        if ((danger == 0)&&(((cos(oriente/1000)<cos(n/1000))&&(abs(oriente-degresReel)<=n))||((oriente-n<=0)&&((degresReel<=oriente+n)||(degresReel>=oriente-n+2000*PI)))||((oriente+n>=2000*PI)&&((degresReel<=oriente+n-2000*PI)||(degresReel>=oriente-n))))){ 
          tempprog = tempprog + tempboucle;}}
tempboucle = millis() - ecartp;
ecartp = millis();
Serial.println (distanceun);
Serial.println(bufer);
Serial.println(danger);
Serial.println (tempboucle);
Serial.println ("   ");
}
void aplicationmoteur (){//agire sur les moteur en fonction des etape de pas de ceux ci 
if (etapemoteurun == 9){etapemoteurun = 1;} 
if (etapemoteurdeux == 9){etapemoteurdeux = 1;} 
if (etapemoteurun == 0){etapemoteurun = 8;} 
if (etapemoteurdeux == 0){etapemoteurdeux = 8;} 
 if( etapemoteurun == 1){digitalWrite(IN1un,LOW); digitalWrite(IN2un,HIGH); digitalWrite(IN3un,HIGH);digitalWrite(IN4un,LOW);}//0110  A-B
 if( etapemoteurun == 2){digitalWrite(IN1un,LOW); digitalWrite(IN2un,HIGH);digitalWrite(IN3un,LOW);digitalWrite(IN4un,LOW);}//1010  AB
 if( etapemoteurun == 3){digitalWrite(IN1un,LOW); digitalWrite(IN2un,HIGH);digitalWrite(IN3un,LOW);digitalWrite(IN4un,HIGH);}//0101  A-B-
 if( etapemoteurun == 4){digitalWrite(IN1un,LOW); digitalWrite(IN2un,LOW);digitalWrite(IN3un,LOW);digitalWrite(IN4un,HIGH);}//1010  AB
 if( etapemoteurun == 5){digitalWrite(IN1un,HIGH); digitalWrite(IN2un,LOW);digitalWrite(IN3un,LOW);digitalWrite(IN4un,HIGH);}//1001  AB-
 if( etapemoteurun == 6){digitalWrite(IN1un,HIGH);digitalWrite(IN2un,LOW);digitalWrite(IN3un,LOW);digitalWrite(IN4un,LOW);}//1010  AB
 if( etapemoteurun == 7){digitalWrite(IN1un,HIGH);digitalWrite(IN2un,LOW);digitalWrite(IN3un,HIGH);digitalWrite(IN4un,LOW);}//1010  AB
 if( etapemoteurun == 8){digitalWrite(IN1un,LOW);digitalWrite(IN2un,LOW);digitalWrite(IN3un,HIGH);digitalWrite(IN4un,LOW);} //1010  AB



 if( etapemoteurdeux == 1){digitalWrite(IN1deux,LOW);digitalWrite(IN2deux,HIGH);digitalWrite(IN3deux,HIGH);digitalWrite(IN4deux,LOW);}//0110  A-B
 if( etapemoteurdeux == 2){digitalWrite(IN1deux,LOW);digitalWrite(IN2deux,HIGH); digitalWrite(IN3deux,LOW);digitalWrite(IN4deux,LOW);}//1010  AB
 if( etapemoteurdeux == 3){digitalWrite(IN1deux,LOW);digitalWrite(IN2deux,HIGH);digitalWrite(IN3deux,LOW);digitalWrite(IN4deux,HIGH);}//0101  A-B-
 if( etapemoteurdeux == 4){digitalWrite(IN1deux,LOW);  digitalWrite(IN2deux,LOW);digitalWrite(IN3deux,LOW);digitalWrite(IN4deux,HIGH);}//1010  AB
if( etapemoteurdeux == 5){
 digitalWrite(IN1deux,HIGH); 
 digitalWrite(IN2deux,LOW);
 digitalWrite(IN3deux,LOW);
 digitalWrite(IN4deux,HIGH);}//1001  AB-
 if( etapemoteurdeux == 6){
 digitalWrite(IN1deux,HIGH);  
 digitalWrite(IN2deux,LOW);
 digitalWrite(IN3deux,LOW);
 digitalWrite(IN4deux,LOW);}//1010  AB
if( etapemoteurdeux == 7){
 digitalWrite(IN1deux,HIGH);  /
 digitalWrite(IN2deux,LOW);
 digitalWrite(IN3deux,HIGH);
 digitalWrite(IN4deux,LOW);}/1010  AB
if( etapemoteurdeux == 8){
 digitalWrite(IN1deux,LOW);  
 digitalWrite(IN2deux,LOW);
 digitalWrite(IN3deux,HIGH);
 digitalWrite(IN4deux,LOW);}//1010  AB
}

voila , je précise également que je travaille sur carte méga.

Et la question est ?

D'une manière très générale un programme avec l'IDE Arduino comprend à miminima une fonction setup() qui ne s'éxécute qu'une fois et une fonction loop() qui tourne en boucle.
Chacune de ces deux fonctions peut appeler d'autres fonctions écrites par l'auteur du programme.

Il faut réunir dans la fonction setup() tout ce qui ne s’exécute qu'une fois, en gros c'est pour les initialisations, et mettre le programme proprement dit dans la fonction loop().

Lors de la réunion de deux programmes il faut veiller à éliminer les incompatibilités comme l'utilisation des mêmes E/S (ça c'est vu) ou la redéfinition du débit de l'interface série avec une ligne Serial.begin(9600) et une autre Serial.begin(115200) (cela c'est aussi vu).
Veiller aussi à la double utilisation des timers, etc etc.

Le sujet a été abordé de nombreuses fois, pour consulter les réponses déjà données utilise le moteur de recherche du forum (icône "loupe" en haut à droite)

Information : le compilateur reçoit un vrai fichier C/C++, il ne reçoit pas le fichier *.ino que tu écris.
C'est l'IDE qui transforme le fichier *.ino en un vrai fichier *cpp.