[RESOLU] Programmation Capteur ultrasons SRF05

Bonjour,

Pour programmer l’Arduino pour lire la valeur renvoyée par un détecteur ultrasons, j’ai trouvé ce code sur OpenClassrooms :

// SRF05 connecté en mode un seul pin (émission/réception)

int pinSRF = 7; //pin digital pour l'envoi et la réception des signaux
int vSon=59; //valeur de temps en µs d'un aller retour du son sur 1cm


void setup() {
  Serial.begin(9600); //on initialise la communication série
}


//boucle principale

void loop() {
  int distance=mesureDistance(); //on récupère la valeur de distance grâce à la fonction créee plus bas
  Serial.println(distance); // on affiche la distance en cm
}


//fonction de mesure de distance avec SRF05

int mesureDistance() {
  unsigned long mesure = 0; // variable de mesure
  unsigned long cumul = 0; //variable pour la moyenne
  for (int t = 0; t < 10; t++) { // boucle pour effectuer 10 mesures
    pinMode (pinSRF, OUTPUT); //on prépare le pin pour envoyer le signal
    digitalWrite(pinSRF, LOW); //on commence à l'état bas
    delayMicroseconds(2); //on attend que le signal soit clair
    digitalWrite(pinSRF, HIGH);//mise à l'état haut
    delayMicroseconds(10); //pendant 10 µs
    digitalWrite(pinSRF, LOW); //mise à l'état bas
    pinMode(pinSRF, INPUT); //on prépare le pin pour recevoir un état
    mesure = pulseIn(pinSRF, HIGH); // fonction pulseIn qui attend un état haut et renvoie le temps d'attente
    cumul+=mesure; //on cumule les mesures
    delay(50); //attente obligatoire entre deux mesures

  }

  mesure=cumul/10; //on calcule la moyenne des mesures
  mesure=mesure/vSon;//on transforme en cm
  return mesure; //on renvoie la mesure au programme principal

}

J’ai une question sur ce code.

Dans ce code, on lit la valeur renvoyée par le capteur dans la boucle loop.

Mais la fonction qui permet de lire cette valeur est définie après la loop. Comment se fait-il ?

Si l’Arduino fait les étapes dans l’ordre, il faudrait mettre la définition de la fonction avant la loop, pour que dès qu’on entre dans la loop, la fonction est définie et l’Arduino saura ce qu’elle aura à faire non ?

Bonjour,

En C/C++ standard il faut effectivement définir ou déclarer les fonctions avant appel.
Mais l’IDE arduino fait cela pour toi. Il crée un fichier .cpp temporaire qui comprend les déclarations en avant.

bonjour,

ton "vrai" programme est la "loop".

dans ta loop tu appelles à chaque "tour" (loop = boucle) la fonction "mesureDistance()".

cette fonction peut être définie avant ou après dans Arduino (elle doit l'être avant en C).

Ah d'accord, donc si je comprends bien, l'Arduino va voir ce qu'il y a en dehors de la loop, même si c'est après la loop, pour rentrer après dans la loop ?

L'IDE ajoute simplement la déclaration en avant int mesureDistance(); avant la loop

Ca permet au compilateur/éditeur de lien de connaitre l'adresse de la fonction appelée.

Ah d'accord, donc en fait même si je mets cette partie de définition de la fonction en dehors et après la loop, l'IDE va automatiquement la replacer avant la loop ?

Il met simplement la déclaration de la fonction avant la loop, le corps de la fonction reste à sa place.

D'accord merci beaucoup !

La structure du fichier Cpp provisoire est la suivante :
En rouge ce qui est ajouté par l'IDE pour transformer le fichier *.ino en vrai fichier cpp

/************************************************************************************/
Zone de déclaration des variables globales

#include Arduino.h // déclaration des différentes fonctions arduino dont setup() et loop()

void main()
{
init() ; // fonction qui configure le microcontroleur "à la sauce arduino"
setup() ;
While(1)
{
loop();
}

/*******************************************/

Le vrai programme est donc setup() qui comme tu peux le voir ne s'éxécute qu'une seule fois. Setup() sert pour les initialisations personnelles et loop().

While(1) est une condition qui est toujours vérifiée donc loop() tourne en boucle (d"où son nom).
Attention dès que la fin de loop est atteinte le programme relance loop(). Donc s'il y a des initialisations au début de loop elles seront systématiquement recommencées

Note : en fait c'est souvent une boucle for (;:wink: qui se comporte de façon identique à while(1) mais l'explication est plus facile avec while.

Le code source d'Arduino.h et de init() se trouve dans le "core" de l'IDE.