Go Down

Topic: Utiliser une valeur préalablement arrondi pour une compraison (Read 120 times) previous topic - next topic

KiKi_GPS

Bonjour,

Lors d'un codage avec mon moduleGPS Neo-6M, j'ai voulu créer un programme qui avec des comparaison, lorsqu'il atteint une certaine position allume des LED.

Malheureusement je ne peux pas allumer les LED puisque la comparaison ce fait avec un chiffre qui a des dizaine de chiffre après la virgule.

Alors ma question est, comment est-ce que je pourrais prendre ce chiffre ,donné par mon module, arrondi au centième pour pouvoir réussir la comparaison et allumer les LED ?

Voici le programme
Code: [Select]
    #include <TinyGPS++.h>
    char data;
     
    double latitude;
    double longitude;
    double alt; //altitude
    double vitesse;
    unsigned long nbre_sat;
    double latitude1;
    double longitude1;
     
    TinyGPSPlus gps;
     
    void setup() {
      //Initialize serial and wait for port to open:
      Serial1.begin(9600);
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for Leonardo only
      }
      pinMode(30,OUTPUT);
      pinMode(32,OUTPUT);
      latitude1=48.96;
      longitude1=4.36;
    }
     
    void loop() {
      while (Serial1.available()) {
        data = Serial1.read();
        //  Serial.print(data);
        gps.encode(data);
        if (gps.location.isUpdated())
        {
          latitude = gps.location.lat();
          longitude = gps.location.lng();
          alt = gps.altitude.meters();
          vitesse = gps.speed.kmph();
          nbre_sat = gps.satellites.value();
     
          Serial.println("-------- FIX GPS ------------");
          Serial.print("LATITUDE="); Serial.println(latitude,2);
          Serial.print("LONGITUDE="); Serial.println(longitude,2);
          Serial.print("ALTITUDE (m) ="); Serial.println(alt);
          Serial.print("VITESSE (km/h)="); Serial.println(vitesse);
          Serial.print("NOMBRE SATELLITES="); Serial.println(nbre_sat);
        }
      }
      if (latitude1==latitude) {
        digitalWrite(30,HIGH);
      }
      else {
        digitalWrite(30,LOW);
      }
       if (longitude1==longitude) {
        digitalWrite(32,HIGH);
      }
      else {
        digitalWrite(32,LOW);
      }
    }
   
   

Merci de vos réponse

kamill

Bonjour,

Je vois deux solutions:
Soit tu fais une comparaison en prenant compte un intervalle epsilon
Code: [Select]
     if (latitude1<=latitude+epsilon && latitude1>=latitude-epsilon) {

Ou tu compare des entiers
Code: [Select]
     if (floor(latitude1*100)==floor(latitude*100)) {

KiKi_GPS

Merci de ta réponse

Est-ce que tu peux m'expliquer brièvement le principe de ton "epsilon" ?

dbrion06

if (latitude1==latitude)
deviendrait
if (abs(latitude1 -latitude) <= EPSILON)

EPSILON valant 1e-2 pour se positionner à ca 800 m près en longitude, 1.1 km près en latitude (1 degré correspond à 111 km NS)

kamill

Epsilon c'est la valeur en dessous de laquelle tu considère que deux valeurs sont égales: par exemple 0.001

KiKi_GPS

Je ne comprends pas comment l'utiliser, il faut que je le déclare et que je lui donne une fonction ?

dbrion06

Soit vous le définissez
#define EPSILON 1e-3
soit vous en faites une constante déclarée ainsi
const float epsilon = 1e-3; // notation de Kamill, plus jolie que la mienne.

(notez en passant  que les macros sont écrites en MAJUSCULES -et sont mal vues; dans votre cas, ce n'est pas gênant- et les "variables" sont écrites en minuscules....)

KiKi_GPS

Merci beaucoup à vous deux !!!!!!!!!!!
Vous m'enlevez une épine du pieds !!!!!!!
Encore merci

dbrion06


Go Up