Bug aléatoire, une piste ?

Bonsoir à tous !

Voila je boss sur un petit programme de gestion de serre, et je bloque sur un problème que je n’arrive pas à identifier.

Mon module après 1/2h se plante, en commençant déjà par l’écran LCD puis en freezant tout le système m’obligeant à un hard reset.

Le LCD scintille, et se met à afficher des caractères exotiques puis souvent après le module ne réponds plus.

Voila une copie de mon code merci d’être indulgent je commence et j’ai bien conscience que c’est gros bordel sans nom !

#include <DHT.h>
#include <ds18b20p.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Udp.h> 
#include <Stdio.h>
#include <LiquidCrystal.h>
#include <Ultrasonic.h>

//ASSIGNEMENT PIN/////////////////////////////////////
int LED_RESEAU = 11; //LED RESEAU
int LED_TRAVAIL = 12; //LED TRAVAIL
int TEMP1_PIN = 30; //TEMPERATURE 1 -- DIGITAL
int TEMP2_PIN = 34; //TEMPERATURE 2 -- DIGITAL
int TEMP3_PIN = 38; //TEMPERATURE EAU -- DIGITAL
int TEMP4_PIN = A2; //TEMPERATURE INTERNE 
int TEMP5_PIN = 26; //TEMPERATURE EXTERNE
int HYDRO1_PIN = 22; //HYGRO 1 -- DIGITAL
int LUM_PIN = A0; //LUMIERE -- ANALOGIQUE
int CO2_PIN = A1; //CO2

Ultrasonic ultrasonic(8,9);
LiquidCrystal lcd(7,6,10, 5, 4, 3, 2);

int rel0 = 23; // EXTRACTION
int rel1 = 25; // BRUMISATEUR
int rel2 = 27; // BRASSAGE
int rel3 = 29; // CO2
int rel4 = 31; // POMPE EAU
int rel5 = 33; // POMPE AIR
int rel6 = 35; // EXTRACTION LAMPE
int rel7 = 37; // EXTRACTION MODULE

//VARIABLES DIVERS
int cmd;
float val1;
float val2;
int isInitialised = 0;
int tentativeHttp;
byte remoteIp[4];        // holds received packet's originating IP
unsigned int remotePort; // holds received packet's originating port
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
float isJour1;

//VARIABLES CONSTANTES
float co2;
float temp1;
float temp2;
float temp3; // EAU
float temp4; // INTERNE
float temp5; // EXTERNE
float hygro1;
float nivEau;

//VARIRABLES MINI MAXI
float temp1_min = 18;
float temp1_max = 29;
float temp2_min = 18;
float temp2_max = 29;
float temp3_min = 0; // EAU
float temp3_max = 100; // EAU
float temp4_min = 0; // INTERNE
float temp4_max = 35; // INTERNE
float co2_min = 900;
float co2_max = 2000;
float hygro1_min = 40;
float hygro1_max = 80;


//VARIRABLES INTERVAL
long interval_refresh = 30000;
long currentMillis_refresh;
long previousMillis_refresh;
long timerBrassage = 900000;
long currentMillis_timerBrassage;
long previousMillis_timerBrassage;
long timerPompeEau = 900000;
long currentMillis_timerPompeEau;
long previousMillis_timerPompeEau;
long timerPompeAir = 900000;
long currentMillis_timerPompeAir;
long previousMillis_timerPompeAir;
long timerExtraction = 1800000;
long currentMillis_timerExtraction;
long previousMillis_timerExtraction;

//VARIAVLES ETATS DES RELAIS PAR DEFAUT
int etatRel0 = LOW;
int etatRel1 = LOW;
int etatRel2 = LOW;
int etatRel3 = LOW;
int etatRel4 = LOW;
int etatRel5 = LOW;
int etatRel6 = LOW;
int etatRel7 = LOW;

//VARIABLE DU MODE (AUTO ou MANUEL)
int mode = 0; // 0 = AUTO 1 = MANUEL

//CAPTEUR HUMIDITE
#define DHTTYPE DHT11
DHT dht1(HYDRO1_PIN, DHTTYPE);

//CAPTEUR TEMPERATURE
DS18B20P ds18b20p_temp1;
DS18B20P ds18b20p_temp2;
DS18B20P ds18b20p_temp3;
DS18B20P ds18b20p_temp5;

//VARIRABLES ETHERNET ( MAC, IP LOCAL, GATEWAY, SUBNET, SERVEUR DISTANT
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 
  192,168,1,39 };
byte gateway[] = { 
  192,168,1,254 };
byte subnet[] = { 
  255,255,255,0 };
byte server[] = { 
  188,***,***,*** };
  
unsigned int localPort = 8080;      // local port to listen on

void(* resetFunc) (void) = 0;


void setup(){
  //ON DEMARRE LE PORT SERIE + LCD + MESSAGE
    lcd.begin(20,4);
    Serial.begin(9600); 
    
    lcd.setCursor(0, 0);
    
    lcd.print("- Demarrage module");
    Serial.println("- Demarrage module");
   
    delay(1000);
    lcd.setCursor(0, 1);
    lcd.print("- Ethernet 15");
    Ethernet.begin(mac, ip, gateway, subnet);
    delay(500);
    Udp.begin(localPort);
    Serial.println("Connection Ethernet...");
     for (int i=0;i<=15;i++){
      
       lcd.setCursor(11, 1);
       lcd.print(15-i);
       lcd.print(" ");
       delay(1000); 
       
    }
    //ON OUVRE LA CONNECTION ETHERNET
    
    
    
    lcd.setCursor(0, 2);
    lcd.print("- Relais ON");

    //ON ASSIGNE LES PINS ET ETATS
    pinMode(LED_RESEAU, OUTPUT); 
    digitalWrite(LED_RESEAU, HIGH);   
    pinMode(LED_TRAVAIL, OUTPUT); 
    digitalWrite(LED_TRAVAIL, HIGH);  
    pinMode(rel0, OUTPUT);  
    digitalWrite(rel0, etatRel0);  //RELAIS n°1
    pinMode(rel1, OUTPUT);  
    digitalWrite(rel1, etatRel1);  //RELAIS n°2
    pinMode(rel2, OUTPUT);  
    digitalWrite(rel2, etatRel2);  //RELAIS n°3
    pinMode(rel3, OUTPUT);  
    digitalWrite(rel3, etatRel3);  //RELAIS n°4
    pinMode(rel4, OUTPUT);  
    digitalWrite(rel4, etatRel4);  //RELAIS n°5
    pinMode(rel5, OUTPUT);  
    digitalWrite(rel5, etatRel5);  //RELAIS n°6
    pinMode(rel6, OUTPUT);  
    digitalWrite(rel6, etatRel6);  //RELAIS n°7
    pinMode(rel7, OUTPUT);  
    digitalWrite(rel7, etatRel7);  //RELAIS n°8
    delay(1000);
    lcd.setCursor(0, 3);
    lcd.print("- Capteurs ON");
    
    //ON DEMARRE LES CAPTEURS D HUMIDITE
    dht1.begin(); //HYGRO 1
  
    //ON DEMARRE LES CAPTEURS DE TEMPERATURE
    ds18b20p_temp1.begin( TEMP1_PIN ); // TEMP 1
    ds18b20p_temp2.begin( TEMP2_PIN ); // TEMP 2
    ds18b20p_temp3.begin( TEMP3_PIN ); // TEMP EAU
  
    ds18b20p_temp5.begin( TEMP5_PIN ); // TEMP EXTERNE
    
    delay(1000);
    
    if(sendCMD("cmd=init") == true){
      isInitialised = 1;
      
    }else{
     tentativeHttp = 1; 
     lcd.setCursor(11, 1);
       lcd.print("ERREUR");
    }
    delay(1500);
}
//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();

}
void showLCD(){
 
 int t1 = temp1; 
 int t2 = temp2;
 int t3 = temp3;
 int t4 = temp4;
 int t5 = temp5;
 int h1 = hygro1;
 int nE = nivEau;
 int c2 = co2;
 
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("TEMP1:");
 lcd.print(t1);
 lcd.print(" "); 
 lcd.print("HYGRO1:");
 lcd.print(h1);
 lcd.print(" "); 
 lcd.setCursor(0, 1);
  lcd.print("TEMP2:");
 lcd.print(t2);
 lcd.print(" "); 
 lcd.print("Co2:");
 lcd.print(c2);
 lcd.print(" "); 
 lcd.setCursor(0, 2);
  lcd.print("INTER:");
 lcd.print(t4);
 lcd.print(" ");
 lcd.print("EAU:");
 lcd.print(t3);
 lcd.print(" "); 

 lcd.setCursor(0, 3);
 lcd.print("NIVEAU EAU:");
 lcd.print(nE);
 
}
float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

//ON REGARDE SI LA LAMPE EST ALLUME
boolean isJour(){
  
  if(analogRead(LUM_PIN) > 100){
    isJour1 = 1;
    return true;
  }
  isJour1 = 0;
  return false;  
  
}

void actionsCorrectives(){

  //NIVEAU EAU
  if(nivEau >= 12 && etatRel4 == HIGH){

    sendCMD("cmd=alerte&val=errormsg,Niveau%20eau%20trop%20bas.
Extinction%20pompe%20à%20eau.");
    lcd.clear();
    delay(50);
    lcd.setCursor(0,1);
    lcd.print("     NIVEAU EAU ");
    lcd.setCursor(0,2);
    lcd.print("     TROP BAS ! ");
    digitalWrite(rel4, LOW);
    etatRel4 = LOW;
  }
  
  //TEMP 1
  if(temp1 <= temp1_min || temp2 <= temp2_min){
 

    sendCMD("cmd=alerte&val=warning,Température%20trop%20basse
Extinction%20extraction");
    lcd.clear();
    delay(50);
    lcd.setCursor(0,1);
    lcd.print("    TEMPERATURE ");
    lcd.setCursor(0,2);
    lcd.print("    TROP BASSE ! ");
    digitalWrite(rel0, LOW);
    etatRel0 = LOW;
  }
  else if(temp1 >= temp1_max || temp2 >= temp2_max){

    sendCMD("cmd=alerte&val=warning,Température%20trop%20haute
Allumage%20extraction
Extinction%20Co2");

     lcd.clear();
    delay(50);
    lcd.setCursor(0,1);
    lcd.print("    TEMPERATURE ");
    lcd.setCursor(0,2);
    lcd.print("    TROP HAUTE ! ");
    digitalWrite(rel0, HIGH);
    etatRel0 = HIGH;
    digitalWrite(rel3, LOW);
    etatRel3 = LOW;
  }

 
  //HYGROMETRIE
  if(hygro1 <= hygro1_min){

    sendCMD("cmd=alerte&val=warning,Taux%20hygrometrie%20trop%20bas
Allumage%20brumisateur");

     lcd.clear();
    delay(50);
    lcd.setCursor(0,1);
    lcd.print("    HYGROMETRIE ");
    lcd.setCursor(0,2);
    lcd.print("    TROP BASSE ! ");
    digitalWrite(rel1, HIGH);
    etatRel1 = HIGH;

  }
  else if(hygro1 >= hygro1_max){

     sendCMD("cmd=alerte&val=warning,Taux%20hygrometrie%20trop%20haut
Allumage%20extraction");

     lcd.clear();
    delay(50);
    lcd.setCursor(0,1);
    lcd.print("    HYGROMETRIE ");
    lcd.setCursor(0,2);
    lcd.print("    TROP HAUTE ! ");
    digitalWrite(rel0, HIGH);
    etatRel0 = HIGH;

    digitalWrite(rel3, LOW);
    etatRel3 = LOW;
    digitalWrite(rel1, LOW);
    etatRel1 = LOW;

  }



  //CO2
  if(co2 <= co2_min && isJour() && (etatRel0==LOW || (etatRel0==HIGH &&(temp1 <= temp1_max && temp2 <= temp2_max)) )){

    sendCMD("cmd=alerte&val=warning,Taux%20Co2%20trop%20bas
Extinction%20extraction
Allumage%20Electrovanne");

     lcd.clear();
    delay(50);
    lcd.setCursor(0,1);
    lcd.print("    TAUX Co2 ");
    lcd.setCursor(0,2);
    lcd.print("    TROP BAS ! ");
    digitalWrite(rel3, HIGH);
    etatRel3 = HIGH;
    digitalWrite(rel0, LOW);
    etatRel0 = LOW;

  }
  
  else if(co2 >= co2_max && isJour()){

     sendCMD("cmd=alerte&val=warning,Taux%20Co2%20trop%20haut
Extinction%20Electrovanne");

     lcd.clear();
    delay(50);
    lcd.setCursor(0,1);
    lcd.print("    TAUX Co2");
    lcd.setCursor(0,2);
    lcd.print("    TROP HAUT ! ");
    digitalWrite(rel0, HIGH);
    etatRel0 = HIGH;
    digitalWrite(rel3, LOW);
    etatRel3 = LOW;

  }else if(!isJour()){
    digitalWrite(rel3, LOW);
    etatRel3 = LOW;
  }

  //TEMP INTERNE
  if(temp4 >= temp4_max){

    //ALERTE CIRCUIT CHAUD
     sendCMD("cmd=alerte&val=errormsg,Temperature%20interne%20elevee
Allumage%20extraction%20module.");
      lcd.clear();
    delay(50);
    lcd.setCursor(0,1);
    lcd.print("    TEMP INTERNE ");
    lcd.setCursor(0,2);
    lcd.print("    TROP HAUTE ! ");
    
  }

  if(temp3 >= temp3_max){
    Serial.println("TEMP EAU ELEVE");
    sendCMD("cmd=alerte&val=warning,Temperature%20Eau%20trop%20haute
Extinction%20pompe%20eau");

     lcd.clear();
    delay(50);
    lcd.setCursor(0,1);
    lcd.print("     TEMP EAU ");
    lcd.setCursor(0,2);
    lcd.print("    TROP HAUTE ! ");
    digitalWrite(rel4, LOW);
    etatRel4 = LOW;

  }
  
  delay(1000);
  showLCD();
}

Bonjour,

Pour le bug "aléatoire" à mon avis tu as trop de chose en RAM (chaine de caractères + variables + librairie). Utilise http://www.arduino.cc/playground/Code/AvailableMemory pour voir ce qu'il te reste de RAM disponible. A mon avis tu va être surpris par le résultat.

Quelques conseils d'optimisation : - les variables du style t1, t2, t3 ... -> tableau t3 - les chaines de char constantes "blabla" -> F("blabla") - les lignes de code redondante (ex: la série de pinMode()) -> boucles (for, while, ...) - les valeurs constantes -> const + nom en majuscule - adapter les types de variables, int (-32767, +32767) pour stocker un n° de broche (0, 13) c'est un peu beaucoup, byte (0, 255) suffit - les fonctions appelaient depuis un seul endroit dans le code -> inline - ...

Oui j'ai oublié de le préciser mais entre temps j'ai fait le test et j'ai 5800 en résultat donc je pense que c'est ok ?! mon programme a tourné 1h comme ça avant que je l'arrête.

Et en toute logique l'espace de RAM utilisé ne devrait pas augmenter avec le temps...

Merci en tout cas de t'être penché sur mon problème !

elriri: Oui j'ai oublié de le préciser mais entre temps j'ai fait le test et j'ai 5800 en résultat donc je pense que c'est ok ?! mon programme a tourné 1h comme ça avant que je l'arrête.

5.8Ko de ram ? C'est beaucoup ! Tu utilise une mega2560 je suppose ? Si oui alors effectivement le problème est ailleurs.

elriri: Et en toute logique l'espace de RAM utilisé ne devrait pas augmenter avec le temps...

Sauf si tu as un appel de fonction récursif ou des variables / tableaux de grande taille déclaraient en local ;)

Oui j'utilise une MEGA, j'ai relancé le module avec quelques delay() en plus à certains endroits et une 1/2 modifs on verra si ça rebug...