Arrêt de transmission d'un module laser

Bonsoir,

je me sers d’un module laser VL6180X pour mesurer un niveau d’eau, ce dernier est connecté à une Nano en I2C. L’allumage de leds en fonction du niveau est géré par cette nano.

J’alimente en 5V la nano par un relais piloté par une Mega qui gère l’ensemble des autres capteurs et d’autres fonctions. Ce relais alimente la nano à 7H le matin et la coupe à 23H.

A chaque redémarrage le matin, l’indication de niveau ne fonctionne pas. Je dois faire un reset de la nano pour que ça fonctionne.

Voici le code de la Nano

#include <VL6180X.h>
#include <Wire.h>
VL6180X sensor;

  // Variables et broches pour l'indication de niveau d'eau
    long sondeNiveau;
    long sonde;
    int s; int e;
    unsigned long previousMillis = 0; unsigned long previousMillis3 = 0;
    unsigned long previousMillis4 = 0; 
    const int interval8 = 150;  const int interval11 = 2000;
    const int alimLaser = 2;
    const int nHH = 7;
    const int nH = 6; 
    const int nN = 5; 
    const int nB = 4; 
    const int nBB = 3; 
    int etatLed2 = LOW; int etatLed3 = LOW;
    int etatNiveau;
    
  //  Lecture du niveau d'eau
  
   void lectureSondeNiveau()
       {
         sondeNiveau = (sensor.readRangeSingleMillimeters());
         sonde += sondeNiveau; 
         s += 1;
         previousMillis = millis();
       }

    void clignoLednHH()
      {
        digitalWrite(nBB, LOW); digitalWrite(nB, LOW);
        digitalWrite(nN, LOW); digitalWrite(nH,LOW);
        if(millis() - previousMillis3 > interval8)
          {
             previousMillis3 = millis();  
                if (etatLed2 == LOW)
                  {
                    etatLed2 = HIGH;
                  }
                else
                  {
                    etatLed2 = LOW;
                  }         
             digitalWrite(nHH, etatLed2);
          }      
      }

    void clignoLednBB()
      {
        digitalWrite(nB, LOW); digitalWrite(nN, LOW);
        digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
        if(millis() - previousMillis4 > interval8)
          {
            previousMillis4 = millis();  
              if (etatLed3 == LOW)
                {
                  etatLed3 = HIGH;
                }
              else
                {
                  etatLed3 = LOW;
                }
            digitalWrite(nBB, etatLed3);
          }      
      }
          
void setup()

  {
    pinMode(alimLaser, OUTPUT);
    pinMode(nHH, OUTPUT); pinMode(nH, OUTPUT);
    pinMode(nN, OUTPUT); pinMode(nB, OUTPUT); pinMode(nBB, OUTPUT);
    Wire.begin();
    digitalWrite(alimLaser, HIGH);
    sensor.init();
    sensor.configureDefault();
    sensor.setTimeout(500);
    Serial.begin(9600);
  }

void loop()

  {  
     {   
      if (millis() - previousMillis > interval11)
        {
          lectureSondeNiveau();
        }
     }
                
      if (s == 10)
        {
          sonde = sonde / 10; Serial.print("Moyenne : ");Serial.println(sonde);
          
            if (sonde < 31) 
              {
                etatNiveau = 1;
              }
            else if (sonde >= 31 && sonde <= 32) 
              {
                etatNiveau = 2;
              }
            else if (sonde > 32  && sonde <= 33) 
              {
                etatNiveau = 3;
              }
            else if (sonde > 33 && sonde <= 35) 
              {
                etatNiveau = 4;
              }
            else if (sonde > 35 && sonde <=36) 
              {
                etatNiveau = 5;
              }
            else if (sonde >36 && sonde <= 37) 
              {
                etatNiveau = 6;
              }
            else
              {
                etatNiveau = 7;
              }  
          sonde = 0; s = 0;
          }
      
        switch (etatNiveau)
            {
              case 1:
                clignoLednHH();
                break;
              case 2:
                digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, HIGH); digitalWrite(nH,HIGH); digitalWrite(nHH, HIGH);
                break;
              case 3: 
                digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, HIGH); digitalWrite(nH,HIGH); digitalWrite(nHH, LOW);
                break;                 
              case 4: 
                digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, HIGH); digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
                break;               
              case 5:
                digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, LOW); digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
                break;             
              case 6: 
                digitalWrite(nBB, HIGH); digitalWrite(nB, LOW); digitalWrite(nN, LOW); digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
                break;
              case 7:
                clignoLednBB();
                break;
            }
          }

Je ne mets pas le code complet de la Mega mais seule la partie commande du relais en rapport avec l’alimentation de la Nano.

 // allumage-Extinction du lcd et de la nano
  {
    if (hProg >= 700 &&  hProg <= 2300)
      {
        lcd.backlight();
        lcd.display();
        digitalWrite(alimNano, LOW);
      }
    else
      {
        lcd.noBacklight();
        lcd.noDisplay();
        digitalWrite(alimNano, HIGH);
      }
  }

Le problème ne vient donc pas de là.

J’ai mis le schéma de l’installation aussi.

J’ai beau chercher, je ne vois pas ce qui coince.

Quelqu’un aurait une idée?

Merci

EGT59:
Bonsoir,

je me sers d’un module laser VL6180X pour mesurer un niveau d’eau, ce dernier est connecté à une Nano en I2C. L’allumage de leds en fonction du niveau est géré par cette nano.

J’alimente en 5V la nano par un relais piloté par une Mega qui gère l’ensemble des autres capteurs et d’autres fonctions. Ce relais alimente la nano à 7H le matin et la coupe à 23H.

A chaque redémarrage le matin, l’indication de niveau ne fonctionne pas. Je dois faire un reset de la nano pour que ça fonctionne.

Voici le code de la Nano

#include <VL6180X.h>

#include <Wire.h>
VL6180X sensor;

// Variables et broches pour l’indication de niveau d’eau
   long sondeNiveau;
   long sonde;
   int s; int e;
   unsigned long previousMillis = 0; unsigned long previousMillis3 = 0;
   unsigned long previousMillis4 = 0;
   const int interval8 = 150;  const int interval11 = 2000;
   const int alimLaser = 2;
   const int nHH = 7;
   const int nH = 6;
   const int nN = 5;
   const int nB = 4;
   const int nBB = 3;
   int etatLed2 = LOW; int etatLed3 = LOW;
   int etatNiveau;
   
 //  Lecture du niveau d’eau
 
  void lectureSondeNiveau()
      {
        sondeNiveau = (sensor.readRangeSingleMillimeters());
        sonde += sondeNiveau;
        s += 1;
        previousMillis = millis();
      }

void clignoLednHH()
     {
       digitalWrite(nBB, LOW); digitalWrite(nB, LOW);
       digitalWrite(nN, LOW); digitalWrite(nH,LOW);
       if(millis() - previousMillis3 > interval8)
         {
            previousMillis3 = millis();  
               if (etatLed2 == LOW)
                 {
                   etatLed2 = HIGH;
                 }
               else
                 {
                   etatLed2 = LOW;
                 }        
            digitalWrite(nHH, etatLed2);
         }      
     }

void clignoLednBB()
     {
       digitalWrite(nB, LOW); digitalWrite(nN, LOW);
       digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
       if(millis() - previousMillis4 > interval8)
         {
           previousMillis4 = millis();  
             if (etatLed3 == LOW)
               {
                 etatLed3 = HIGH;
               }
             else
               {
                 etatLed3 = LOW;
               }
           digitalWrite(nBB, etatLed3);
         }      
     }
         
void setup()

{
   pinMode(alimLaser, OUTPUT);
   pinMode(nHH, OUTPUT); pinMode(nH, OUTPUT);
   pinMode(nN, OUTPUT); pinMode(nB, OUTPUT); pinMode(nBB, OUTPUT);
   Wire.begin();
   digitalWrite(alimLaser, HIGH);
   sensor.init();
   sensor.configureDefault();
   sensor.setTimeout(500);
   Serial.begin(9600);
 }

void loop()

{  
    {  
     if (millis() - previousMillis > interval11)
       {
         lectureSondeNiveau();
       }
    }
               
     if (s == 10)
       {
         sonde = sonde / 10; Serial.print("Moyenne : ");Serial.println(sonde);
         
           if (sonde < 31)
             {
               etatNiveau = 1;
             }
           else if (sonde >= 31 && sonde <= 32)
             {
               etatNiveau = 2;
             }
           else if (sonde > 32  && sonde <= 33)
             {
               etatNiveau = 3;
             }
           else if (sonde > 33 && sonde <= 35)
             {
               etatNiveau = 4;
             }
           else if (sonde > 35 && sonde <=36)
             {
               etatNiveau = 5;
             }
           else if (sonde >36 && sonde <= 37)
             {
               etatNiveau = 6;
             }
           else
             {
               etatNiveau = 7;
             }  
         sonde = 0; s = 0;
         }
     
       switch (etatNiveau)
           {
             case 1:
               clignoLednHH();
               break;
             case 2:
               digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, HIGH); digitalWrite(nH,HIGH); digitalWrite(nHH, HIGH);
               break;
             case 3:
               digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, HIGH); digitalWrite(nH,HIGH); digitalWrite(nHH, LOW);
               break;                
             case 4:
               digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, HIGH); digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
               break;              
             case 5:
               digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, LOW); digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
               break;            
             case 6:
               digitalWrite(nBB, HIGH); digitalWrite(nB, LOW); digitalWrite(nN, LOW); digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
               break;
             case 7:
               clignoLednBB();
               break;
           }
         }




Je ne mets pas le code complet de la Mega mais seule la partie commande du relais en rapport avec l'alimentation de la Nano.


// allumage-Extinction du lcd et de la nano
 {
   if (hProg >= 700 &&  hProg <= 2300)
     {
       lcd.backlight();
       lcd.display();
       digitalWrite(alimNano, LOW);
     }
   else
     {
       lcd.noBacklight();
       lcd.noDisplay();
       digitalWrite(alimNano, HIGH);
     }
 }




Le problème ne vient donc pas de là.

J'ai mis le schéma de l'installation aussi.

J'ai beau cherchez, je ne vois pas ce qui coince.

Quelqu'un aurait une idée?

Merci

Bonsoir
Reflexion rapide
Si un reset à la “mano du nano” suffit" à regler le problème le" matin"
Il y a peut etre un “problème de tempo cachée”
ça donne quoi avec un delai relativement long en entrée et sortie de setup ?
et avec delai intermediaire entre les instructions ?

il semble il y avoir une notion de timeout concernant le sensor , tu sais à quoi cela correspond ? :grin:

bonsoir,

merci pour la réponse. Je vais mettre un delay(1000) à la fin du setup demain et je testerais çà demain.

EGT59: bonsoir,

merci pour la réponse. Je vais mettre un delay(1000) à la fin du setup demain et je testerais çà demain.

J'avais édité ma réponse entre temps regarde aussi à quoi correspond la notion de time out du sensor 8)

Re

J'ai regardé dans la st du 6180 mais je ne trouve rien pour le time out.

Dans le .h il y a bien un set, un get et occured pour le time out mais je ne sais pas à quoi ça correspond.

J'avais fait des essais au début sans ce set time out dans le setup et ça fonctionnait. Par sécurité, je l'ai laissé car il est dans les exemples, ne sachant pas. :confused:

Bonjour,

J'ai ajouté quelques delay(xxx) entre les instructions pour le 6180 dans le setup comme l'a proposé Artouste et ça fonctionne.

void setup()
  {
    pinMode(alimLaser, OUTPUT);
    pinMode(nHH, OUTPUT); pinMode(nH, OUTPUT);
    pinMode(nN, OUTPUT); pinMode(nB, OUTPUT); pinMode(nBB, OUTPUT);
    Wire.begin();
    digitalWrite(alimLaser, HIGH);delay(500);
    sensor.init();delay(200);
    sensor.configureDefault();delay(200);
    sensor.setTimeout(500);delay(500);
    Serial.begin(9600);
  }

Pour le fameux setTimeout, j'ai relu la ST mais je ne vois rien.

En tous cas merci pour le dépannage. :) :)