Arduino_capteur

Bonjour a tous,
s’il vous plait j’ai un problème avec mon programme du capteur ultra son A02YYUW, quand je rajoute un delay(1000), le capteur ne fonctionne plus ( donc en gros il fonctionne juste pour delay(100)) et moi Jai besoin de mettre un delay de 3mn minimum.
merci de m’aider

https://wiki.dfrobot.com/A02YYUW%20Waterproof%20Ultrasonic%20Sensor%20SKU:%20SEN0311#target_1

/*
  *@File  : DFRobot_Distance_A02.ino 
  *@Brief : This example use A02YYUW ultrasonic sensor to measure distance
  *         With initialization completed, We can get distance value 
  *@Copyright [DFRobot](https://www.dfrobot.com),2016         
  *           GUN Lesser General Pulic License
  *@version V1.0           
  *@data  2019-8-28
*/

#include <SoftwareSerial.h>

SoftwareSerial mySerial(11,10); // RX, TX
unsigned char data[4]={};
float distance;

void setup()
{
 Serial.begin(57600);
 mySerial.begin(9600); 
}

void loop()
{
    do{
     for(int i=0;i<4;i++)
     {
       data[i]=mySerial.read();
     }
  }while(mySerial.read()==0xff);

  mySerial.flush();

  if(data[0]==0xff)
    {
      int sum;
      sum=(data[0]+data[1]+data[2])&0x00FF;
      if(sum==data[3])
      {
        distance=(data[1]<<8)+data[2];
        if(distance>30)
          {
           Serial.print("distance=");
           Serial.print(distance/10);
           Serial.println("cm");
          }else 
             {
               Serial.println("Below the lower limit");
             }
      }else Serial.println("ERROR");
     }
     delay(100);
}

Bonjour
Je vais essayer d’utiliser un traducteur.
La fonction delay() bloque l’exécution du sketch pendant le temps indiqué.
Pour une exécution libre de blocages une fonction timer sur l’exemple IDE base BLINKWITHOUTDELAY est nécessaire.

Thank you so much for your answer. But I bought the sensor and I used the same program but when I increased the delay from 100ms to 1 minute the sensor does not work. I wanted to print the distance every one minute. It gives 0 value for the distance. does it have any link with the SoftwareSerial library. Please help me in finding the error ? Thank you.

Dans le sous-forum “Français” la langue est le français.
Merci d’échanger en français ou de poursuivre dans la partie anglophone.

Merci beaucoup pour votre réponse. Mais j’ai acheté le capteur et j’ai utilisé le même programme mais lorsque j’ai augmenté le delay de 100 ms à 1 minute, le capteur ne fonctionne pas. Je voulais afficher la distance toutes les minutes. Il donne 0 valeur pour la distance. a-t-il un lien avec la bibliothèque SoftwareSerial. Veuillez m’aider à trouver l’erreur? Merci.

C’est pas que le capteur ne fonctionne pas, c’est que comme le capteur envoie en permanence des informations le buffer de réception de Serial est saturé.
Le capteur a 2 modes de fonctionnement en fonction de l’état de la ligne RX:

  1. RX à 1 ou flottant: émission de données filtrées toutes les 100 à 300ms
  2. RX à 0: émission des données brutes toutes les 100ms

On voit donc que l’émission est permanente et qu’à priori il n’y a pas moyen d’interrompre le flux de données.
Donc il faut lire le port série pour éviter de saturer le buffer de réception même si tu ne veux pas exploiter les informations.

Ceci mis à part, la liaison série est mal exploitée. Il ne faut pas faire de Serial.read() sans s’être assuré qu’il y a des données à lire. Il faut utiliser Serial.available() avant de faire un Serial.read().

Merci beaucoup pour votre reponse. J’ai essayer de verifier la saturation du buffer a l’aide du fonction “overflow”. Et ca montre que le SoftwareSerial est sature. J’ai ajouter le Serial.available() comme vous avez dit.

Maintenant je n’arrive pas a eviter cette saturation. S’il vous plait dites moi quelle fonction ou commande puis je ajouter dans le programme pour avoir les mesures de distance.

Voici le programme :

#include <SoftwareSerial.h>

SoftwareSerial mySerial(11,10); // RX, TX
unsigned char data[4]={};
float distance;

void setup()
{
Serial.begin(57600);
mySerial.begin(9600);
}

void loop()
{

if (mySerial.overflow()) {
Serial.println(“SoftwareSerial overflow!”);
}

mySerial.flush();

if( mySerial.available() > 0) {

do{
 for(int i=0;i<4;i++)
 {
   data[i]=mySerial.read();
 }

}while(mySerial.read()==0xff);
}

if(data[0]==0xff)
{
int sum;
sum=(data[0]+data[1]+data[2])&0x00FF;
if(sum==data[3])
{
distance=(data[1]<<8)+data[2];
Serial.print(“distance=”);
Serial.print(distance/10);
Serial.println(“cm”);
} }

   while(Serial.available()>0) Serial.read(); 
   
delay(10000);

}

Il faut faire des lectures même si tu n’exploites pas les informations.

daccord mercii