Capteur GPS, Detection

Bonjour, je travaille actuellement avec un détecteur GPS EM506, j’ai donc utilisé le code fournis qui est :

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
/*
   This sample code demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 4800;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

void setup()
{
  Serial.begin(115200);
  ss.begin(GPSBaud);

  /*Serial.println(F("FullExample.ino"));
    Serial.println(F("An extensive example of many interesting TinyGPS++ features"));
    Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
    Serial.println(F("by Mikal Hart"));
    Serial.println();
    Serial.println(F("Sats HDOP  Latitude   Longitude   Fix  Date "));
    Serial.println(F("           (deg)      (deg)       Age       "));
    Serial.println(F("--------------------------------------------"));*/
}

void loop()
{
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;



  /*printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
    printFloat(gps.hdop.hdop(), gps.hdop.isValid(), 6, 1);*/
  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  /*printStr(gps.course.isValid() ? TinyGPSPlus::cardinal(gps.course.deg()) : "*** ", 6);*/

  /*Serial.println(gps.location.lng());
    Serial.println(gps.location.lat());*/

  unsigned long distanceKmToLondon =
    (unsigned long)TinyGPSPlus::distanceBetween(
      gps.location.lat(),
      gps.location.lng(),
      LONDON_LAT,
      LONDON_LON) / 1000;
  /*printInt(distanceKmToLondon, gps.location.isValid(), 9);*/

  double courseToLondon =
    TinyGPSPlus::courseTo(
      gps.location.lat(),
      gps.location.lng(),
      LONDON_LAT,
      LONDON_LON);

  /*printFloat(courseToLondon, gps.location.isValid(), 7, 2);*/

  const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);

  /*printStr(gps.location.isValid() ? cardinalToLondon : "*** ", 6);*/

  /*printInt(gps.charsProcessed(), true, 6);
    printInt(gps.sentencesWithFix(), true, 10);
    printInt(gps.failedChecksum(), true, 9);*/
  /*Serial.println();*/

  smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10){
    Serial.println(F("No GPS data received: check wiring"));
  }

}

// This custom version of delay() ensures that the gps object
// is being "fed".
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i = flen; i < len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);

}

static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i = strlen(sz); i < len; ++i)
    sz[i] = ' ';
  if (len > 0)
    sz[len - 1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}

static void printDateTime(TinyGPSDate & d, TinyGPSTime & t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
    Serial.print(sz);
  }

  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
    Serial.print(sz);
  }

  printInt(d.age(), d.isValid(), 5);
  smartDelay(0);
}

static void printStr(const char *str, int len)
{
  int slen = strlen(str);
  for (int i = 0; i < len; ++i)
    Serial.print(i < slen ? str[i] : ' ');
  smartDelay(0);
}

Je souhaiterais y ajouter ce code :

  if ( -0.71274411774584228 < gps.location.lng(),gps.location.isValid() < -0.7124705324263232) {
    if (49.28582932492774 < gps.location.lat(),gps.location.isValid() < 49.28607872997809) {
      Serial.println("Salle 1");
      printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
      printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
      Serial.println(gps.location.lng());
      Serial.println(gps.location.lat());
      delay(1000);
    }
  }




  if (-0.7125134477705615 < gps.location.lng(),gps.location.isValid() < -0.7122076759428637) {
    if (49.285409688752225 < gps.location.lat(),gps.location.isValid() < 49.28568383861949) {
      Serial.println("Salle 2");
      printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
      printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
      Serial.println(gps.location.lng());
      Serial.println(gps.location.lat());
      delay(1000);
    }
  }





  if (-0.7118133912176745 < gps.location.lng(),gps.location.isValid() < -0.7112420806975024) {
    if (49.28477676339021 < gps.location.lat(),gps.location.isValid() < 49.28573035497204) {
      Serial.println("Salle 3");
      printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
      printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
      Serial.println(gps.location.lng());
      Serial.println(gps.location.lat());
      delay(1000);
    }
  }

Qui me permettrait donc de détecter si le capteur entre dans une zone précise, et ensuite envoie une information sur le moniteur série.

Pouvez vous m’aider/ M’indiquer un chemin svp ?
Merci de m’avoir lu !

Regardez la fonction abs (un grand classique, quand on regarde si deux float-s- ne sont pas trop différents.

Ne gravez pas dans le code la position que vous cherchez... (sinon, si vous déménagez, ça fera pas mal de décimales à modifier deux fois)

Ce sont les coordonnées de ton lycée ? (Lycée Général Techno Arcisse de Caumont, à Bayeux)

Je ne comprends pas ce qui te bloque, tu as déjà fait un programme visiblement, donc tu sais faire une fonction et l'appeler depuis la loop. Où est le problème ?

MDR

c'est une projet bac....

Que sont les derniers arguments de "distanceBetween"

Le programme en lui même ne vient pas de moi mais de mon camarade, et je crois qu’il ne sait pas vraiment comment il fonctionne (et c’est ce qu’on m’embête ne travaillant pas normalement sur une Arduino).

Mais maintenant mon but est d’utiliser ce programme pour que lorsque j’arrive dans une zone (les zones géographiques que j’ai pris forment un carré

  • en bas à gauche d’un point et en haut à droite de celui ci, comme ça si le gps rentre dans cette zone, il est donc détecté par le if en question et affiche donc ce que je souhaite.

Comme il est dit plus haut, je ne travaille pas avec Arduino normalement, je fais plus souvent du python, mais là je suis obligé car je dois envoyer une variable à une autre carte et donc détecter le lieu.

J’ai donc mis les coordonnées en dessous de
"
if (millis() > 5000 && gps.charsProcessed() < 10){
Serial.println(F(“No GPS data received: check wiring”));
} "

Et quand je lance mon moniteur série, rien de ce qui est dans les if ne s’affiche.

Et oui c’est un projet pour le bac mais bloquant depuis 2 semaines donc environ 5/6 heures, je me suis donc dis que je pourrais tester ici, c’est donc pour ça que je demande des pistes et non de me faire totalement le programme.

Merci pour vos réponses et désolé de mon retard, je pensais recevoir des emails de notification mais je n’ai rien reçu.

Bonne soirée !

Déjà, commence par créer une fonction avec les lignes de ton second code. C'est simple il suffit de les mettre entre accolades et d'ajouter avant l'accolade ouvrante une déclaration de fonction comme par exemple

void verifCoordonnees () 
{
// ton code ici
}

Ensuite tu n'as plus qu'à appeler cette fonction depuis l'endroit que tu veux (par exemple juste après les lignes que tu cites ci dessus)

verifCoordonnees ();

Et nettoie ton programme, c'est à dire enlève les lignes que tu as commentées car elles gênent pour la lecture.

Enfin, tu n'as pas besoin de tout ce qui parle de London...

Oh merci beaucoup de ton aide !

Je vais vérifier ça.

Merci !

Ça fonctionne !

Merci pour votre aide !