Bug aléatoire, une piste ?

//FONTION RECEVANT LES COMMANDES DE LA PART DU SERVEUR DISTANT SOUS FORME idACTION;val1,val2
int receiveCMD(char reply[] = "OK"){

  delay(50);
  // if there's data available, read a packet
  int packetSize = Udp.available(); // note that this includes the UDP header
  if(packetSize)
  {
    packetSize = packetSize - 8;      // subtract the 8 byte header
    //Serial.println(packetSize);       // Taille du paquet
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);

    // read the packet into packetBufffer and get the senders IP addr and port number
    Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);


    Udp.sendPacket( reply, remoteIp, remotePort); // Envoi d'une réponse


    char *p = packetBuffer;
    char *str;
    int cpt = 0;

    while ((str = strtok_r(p, ";", &p)) != NULL){

      cpt = cpt+1;
      if(cpt == 1){
        cmd = atoi(str);
        // Serial.println(cmd);
      }
      else if(cpt == 2){
        val1 = atof(str);
        //  Serial.println(val1);
      }
      else if(cpt == 3){
        val2 = atof(str);
        // Serial.println(val2);
      }

    }

 

    //ON EXECUTE LA COMMANDE
    switch(cmd){

    case 1:



      actualisation();
      break; 

    case 2:
      if(val1 == 1){

        mode = 1;
      }
      else if(val1 == 0){

        mode = 0;
      }
      break; 

    case 3:

      if(val1 == 1 && mode == 1){
        digitalWrite(rel6, HIGH);
        etatRel6 = HIGH;
      }
      else if(val1 == 0 && mode == 1){
        digitalWrite(rel6, LOW);
        etatRel6 = LOW;

      }
      break; 

    case 4:

      if(val1 == 1 && mode == 1){
        digitalWrite(rel0, HIGH);
        etatRel0 = HIGH;
      }
      else if(val1 == 0 && mode == 1){
        digitalWrite(rel0, LOW);
        etatRel0 = LOW;
      }
      break; 

    case 5:
 
      if(val1 == 1 && mode == 1){
        digitalWrite(rel3, HIGH);
        etatRel3 = HIGH;
      }
      else if(val1 == 0 && mode == 1){
        digitalWrite(rel3, LOW);
        etatRel3 = LOW;
      }
      break; 

    case 6:

      if(val1 == 1 && mode == 1){
        digitalWrite(rel2, HIGH);
        etatRel2 = HIGH;
      }
      else if(val1 == 0 && mode == 1){
        digitalWrite(rel2, LOW);
        etatRel2 = LOW;
      }
      break; 

    case 7:

      temp1_min = val1;
      temp1_max = val2;
      break; 

    case 8:

      temp2_min = val1;
      temp2_max = val2;
      break; 

    case 9:

      hygro1_min = val1;
      hygro1_max = val2;
      break; 

    case 10:
    
    
      break; 

    case 11:

      co2_min = val1;
      co2_max = val2;
      break; 

    case 12:

      if(val1 == 1 && mode == 1){
        digitalWrite(rel1, HIGH);
        etatRel1 = HIGH;
      }
      else if(val1 == 0 && mode == 1){
        digitalWrite(rel1, LOW);
        etatRel1 = LOW;
      }
      break; 
    case 13:

      interval_refresh = val1;
      previousMillis_refresh = 0;
      break; 
    case 14:

      if(val1 == 1 && mode == 1){
        digitalWrite(rel4, HIGH);
        etatRel4 = HIGH;
      }
      else if(val1 == 0 && mode == 1){
        digitalWrite(rel4, LOW);
        etatRel4 = LOW;
      }
      break; 
    case 15:

      if(val1 == 1 && mode == 1){
        digitalWrite(rel5, HIGH);
        etatRel5 = HIGH;
      }
      else if(val1 == 0 && mode == 1){
        digitalWrite(rel5, LOW);
        etatRel5 = LOW;
      }
      break; 
    case 19:

      timerBrassage = val1;
      break;
    case 20:

      timerPompeEau = val1;
      break;
    case 21:

      timerPompeAir = val1;
      break;
    case 22:

      temp3_min=val1;
      temp3_max=val2;
      break;
    case 23:

      temp4_min=val1;
      temp4_max=val2;
      break;
    case 24:


      break;
    case 25:

      isInitialised=val1;
      break;

    }


    return true;


  }

}

//BOUCLE SANS FIN
void loop(){

  if(isInitialised == 0 && tentativeHttp <= 5){
   sendCMD("cmd=init");
   tentativeHttp++; 

  }else if(isInitialised == 0 && tentativeHttp >= 6){
   resetFunc();
  }
  
  //RELEVES CAPTEURS + TRANSMISSION + ACTIONS CORRECTRICES
  unsigned long currentMillis_refresh = millis();
  if(currentMillis_refresh - previousMillis_refresh > interval_refresh) {

    previousMillis_refresh = currentMillis_refresh;   

    getDataSensor(); //ON RECUPERE LA VALEUR DES DIFFERENTS CAPTEURS

    if(mode == 0){
      actionsCorrectives(); //EN MODE AUTO SEULEMENT, LE MODULE VA ESSAYER DE CORRIGER LES VALEURS
    }

    actualisation(); //ENVOI DONNEES SERVEUR DISTANT


  }

  //Extraction d'air
  unsigned long currentMillis_timerExtraction = millis();
  if(((currentMillis_timerExtraction - previousMillis_timerExtraction > timerExtraction || previousMillis_timerExtraction == 0) && mode == 0) || (timerExtraction == 0 && mode == 0)) {

    if(etatRel0 == LOW){
     
      if(co2 <= co2_min || (temp1 <= temp1_min || temp2 <= temp2_min)){
        digitalWrite(rel0, LOW);
        etatRel0 = LOW;
      

      }else {
        digitalWrite(rel0, HIGH);
        etatRel0 = HIGH;
        digitalWrite(rel3, LOW);
        etatRel3 = LOW;
      }

    }else if(etatRel0 == HIGH){
      
      if(co2 >= co2_max || (temp1 >= temp1_max || temp2 >= temp2_max)){
        digitalWrite(rel0, HIGH);
        etatRel0 = HIGH;
      }else {
        digitalWrite(rel0, LOW);
        etatRel0 = LOW;
      }
      
    }
  
    previousMillis_timerExtraction = currentMillis_timerExtraction; 
    
  }


  //Brassage d'air
  unsigned long currentMillis_timerBrassage = millis();
  if(((currentMillis_timerBrassage - previousMillis_timerBrassage > timerBrassage || previousMillis_timerBrassage == 0) && mode == 0) || (timerBrassage == 0 && mode == 0)) {

    previousMillis_timerBrassage = currentMillis_timerBrassage; 

    if(etatRel2 == LOW){
      digitalWrite(rel2, HIGH);
      etatRel2 = HIGH;

    }
    else if(etatRel2 == HIGH){

      digitalWrite(rel2, LOW);
      etatRel2 = LOW;
    }

  }

  //Pompe Eau
  unsigned long currentMillis_timerPompeEau = millis();
  if(((currentMillis_timerPompeEau - previousMillis_timerPompeEau > timerPompeEau || previousMillis_timerPompeEau == 0) && mode == 0) || (timerPompeEau == 0 && mode == 0)) {

    previousMillis_timerPompeEau = currentMillis_timerPompeEau; 

    if(etatRel4 == LOW && temp3 <= temp3_max){ // N'allume la pompe que si la température de l'eau est correct.

      digitalWrite(rel4, HIGH);
      etatRel4 = HIGH;
    }
    else if(etatRel4 == HIGH){

      digitalWrite(rel4, LOW);
      etatRel4 = LOW;
    }

  }

  //Pompe Air
  unsigned long currentMillis_timerPompeAir = millis();
  if(((currentMillis_timerPompeAir - previousMillis_timerPompeAir > timerPompeAir || previousMillis_timerPompeAir == 0) && mode == 0) || (timerPompeAir == 0 && mode == 0)) {

    previousMillis_timerPompeAir = currentMillis_timerPompeAir; 

    if(etatRel5 == LOW){

      digitalWrite(rel5, HIGH);
      etatRel5 = HIGH;
    }
    else if(etatRel5 == HIGH){

      digitalWrite(rel5, LOW);
      etatRel5 = LOW;
    }

  }

  receiveCMD();


}



String intToChar(float fl){
  char tampon[32];
  long fl1 = (fl - (long)fl) * 100;                     
  sprintf(tampon,"%0ld.%0ld", (long)fl, fl1);
  return tampon;
}

String floatToChar(float a){
  char charBuf[32];
  dtostrf(a, 2, 2, charBuf);
  return charBuf;
}

int actualisation(){

  sendCMD("cmd=update&val="+floatToChar(temp1)+","+floatToChar(temp2)+","+floatToChar(temp3)+","+floatToChar(temp4)+","+floatToChar(temp5)+","+floatToChar(co2)+","+floatToChar(hygro1)+","+floatToChar(nivEau)+","+intToChar(etatRel6)+","+intToChar(etatRel0)+","+intToChar(etatRel1)+","+intToChar(etatRel3)+","+intToChar(etatRel2)+","+intToChar(etatRel4)+","+intToChar(etatRel5)+","+intToChar(mode)+","+intToChar(isJour1)+"");

  
}
int sendCMD(String val){
  
  Client client(server, 80);
  if (client.connect()) {
  

    // Make a HTTP request:
    client.print("GET /receive.php?");
    client.print(val);
    client.println(" HTTP/1.0");
    client.println("HOST: www.****.fr");
    client.println();
    tentativeHttp = 0;
    isInitialised = 1;
    client.stop();
    return true;
  }else {
    tentativeHttp =tentativeHttp+1;

    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("Probleme HTTP !");
    delay(1000);
    isInitialised = 0;
  client.stop();
    return false;
  }
 
}

float getAnalogTemp(int sensorPin) 
{
  float sensorVal =  analogRead(sensorPin);
  return map((int)(sensorVal*1000),
  438000,573000,26000,37000)/1000;
}

void getDataSensor(){


  isJour();
  
  temp1 = ds18b20p_temp1.read();

  temp2 = ds18b20p_temp2.read();

  temp3 = ds18b20p_temp3.read();

  temp4 = getAnalogTemp(TEMP4_PIN);
  
  temp5 = ds18b20p_temp5.read();

  hygro1 = dht1.readHumidity();
  
  nivEau = ultrasonic.Ranging(CM);
  
  int raw = analogRead(CO2_PIN);
  float val = fmap(raw, 0, 1023, 0.0, 5.0);
  co2 = val*5000/2.5;
  
  showLCD();

}