Bonjour à tous. Je souhaiterai avoir de l'aide sur l'utilisation et l'exploitation d'un tableau. J'ai créé une carte électronique qui à partir d'un module gps et d'un Arduino nano calcule la distance entre deux points. Sauf que quand c'est deux points très loin, la distance calculé sera à vol d'oiseau et non la distance réelle effectuée. Pour des petites distances, ça n'est pas dérangeant mais pour les plus grandes, si.
Dans ce cas, j'ai pensé aux tableaux, créé un tableau qui constamment, toutes les deux secondes stockent la distance entre les deux points à chaque fois, et lors d'un appui "fictif" sur un bouton, on arrêterai ces calculs et on ferai juste la somme de toutes les valeurs du tableau. Ma question paraît peut-être bête mais comment m'y prendre.
Tout ce que je sais, c'est que je dois déclarer mon tableau comme-ci : int distance[] = {} mais je reste bloqué pour le reste.
Merci d'avance.
![]()
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.
Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone
je peux le traduire si vous voulez
Pas la peine, comme @UKHeliBob l'a écrit, il a déplacé le sujet dans la partie francophone.
d'accord, merci, j'vais attendre une réponse alors dans la partie francophone
Pourquoi un tableau, une fois la distance calculée on a plus besoin des données?
Il suffit de calculer la distance entre les 2 derniers points et d'accumuler la distance dans une variable
Quelque chose comme ça
- cumul = 0
- point1 = acquisition_coordonnées
- boucle
- point2 = acquisition_coordonnées
- distance calculer_distance(point1, point2)
- cumul = cumul + distance
- point1 = point2
- attendre_2sec
J'y avais pensé sauf que j'ai pas réussi à stocker deux points différents. Je regardais dans le moniteur série et à chaque fois mon point1 et mon point2 était le meme. Je l'ai mal fais je pense mais c'est mon programme test :
int pt_un = 1, pt_deux = 0, distance ;
double lat_un = 44.564763, lat_deux = 44.564787, lng_un = 4.016345, lng_deux = 4.016319;
double lat_un_radian, lat_deux_radian, lng_un_radian, lng_deux_radian, dlong, dlat, ans, R = 6371;
#define PI 3.14159265358979323846
void setup() {
Serial.begin(115200);
}
void loop() {
if (pt_un == 1) {
lat_un_radian = (lat_un * PI) / 180;
lng_un_radian = (lng_un * PI) / 180;
pt_un = 0;
pt_deux = 1;
}
if (pt_deux == 1) {
lat_deux += 0.00001;
lng_deux += 0.00001;
lat_deux_radian = (lat_deux * PI) / 180;
lng_deux_radian = (lng_deux * PI) / 180;
pt_un = 1;
pt_deux = 0;
}
dlong = lng_deux_radian - lng_un_radian;
dlat = lat_deux_radian - lat_un_radian;
ans = pow(sin(dlat / 2), 2) + cos(lat_un_radian) * cos(lat_deux_radian) * pow(sin(dlong / 2), 2);
ans = 2 * asin(sqrt(ans));
ans = 1000 * (ans * R);
distance = ans;
Serial.println(distance);
delay(1000);
}
Pas testé mais cela donne une idée du principe
int pt_un = 1, pt_deux = 0, distance ;
double lat_un = 44.564763, lat_deux = 44.564787, lng_un = 4.016345, lng_deux = 4.016319;
double lat_un_radian, lat_deux_radian, lng_un_radian, lng_deux_radian, dlong, dlat, ans, R = 6371;
#define PI 3.14159265358979323846
void setup() {
Serial.begin(115200);
lat_un_radian = (lat_un * PI) / 180;
lng_un_radian = (lng_un * PI) / 180;
distance = 0;
}
void loop() {
lat_deux += 0.00001; // acquisition nouvelles coordonnées
lng_deux += 0.00001;
lat_deux_radian = (lat_deux * PI) / 180;
lng_deux_radian = (lng_deux * PI) / 180;
dlong = lng_deux_radian - lng_un_radian; // delta entre nouvelles coordonnées et origine
dlat = lat_deux_radian - lat_un_radian;
ans = pow(sin(dlat / 2), 2) + cos(lat_un_radian) * cos(lat_deux_radian) * pow(sin(dlong / 2), 2);
ans = 2 * asin(sqrt(ans));
ans = 1000 * (ans * R); // distance entre les 2 points
distance += ans; // distances cumulées
Serial.println(distance);
lat_un_radian = lat_deux_radian; // les coordonnées courantes deviennent la nouvelle origine
lng_un_radian = lng_deux_radian;
delay(1000);
}
je vais tester ça et je te tiens au courant
alors j'ai un problème, c'est que le module gps desfois au lancement du projet, il n'a pas de coordonnées, du coup dans le setup il va stocker 0;0 alors que ça n'est pas le bon, si je déplace les lignes concernant lat_un et lng_un dans le loop tout au début, ça sera pas bon ?
Dans le setup(), il faut faire une boucle d'attente tant que le GPS n'a pas fait son fix.
Ça ne sert à rien de continuer puisqu'il n'y a pas de coordonnées sur lesquelles travailler.
dans le setup, quelque chose du type while(gps.valide) ? mais du coup je met quoi dans la boucle ?
J'ai pensé à : While(gps.location.lat()!=0 && gps.location.lng()!=0){...?
dans la boucle d'attente du GPS, tu mets .... rien !
Ou mieux : comptes le nombre de boucles pour arrêter si le GPS s'obstine à ne pas répondre.
Et ce serait plutôt
while ( gps.location.lat() == 0 && gps.location.lng() == 0) {}
c-à-d == au lieu de !=
j'ai utilisé les fonctions de sa librairie, notamment celle qui affiche la lat et la long, et dans le setup du coup j'ai mis ça :
void setup()
{
ss.begin(GPSBaud);
Serial.begin(115200);
while ((gps.location.lat() != 0) && (gps.location.lng() != 0)){
lat_un = gps.location.lat();
lng_un = gps.location.lng();
lat_un_radian = (lat_un * PI) / 180;
lng_un_radian = (lng_un * PI) / 180;
distance = 0;
}
}
mais bon ça a pas l'air de marcher comme sur des roulettes
Tant que lat == 0 ET long == 0 on ne fait rien
La lecture des coordonnées ne doit avoir lieu que si le GPS sort des valeurs donc la lecture se fait après avoir passé le while
// Attente du fix
while ((gps.location.lat() == 0) && (gps.location.lng() == 0)){}
// Coordonnées disponibles
lat_un = gps.location.lat();
lng_un = gps.location.lng();
lat_un_radian = (lat_un * PI) / 180;
lng_un_radian = (lng_un * PI) / 180;
distance = 0;
Éventuellement, si tu veux faire afficher quelque chose tu mets du code dans la boucle
Mais je pense que la librairie doit avoir une fonction qui indique si le GPS est prêt. Parce que ce n'est pas tout que le GPS délivre des points il faut en plus qu'ils soient valides.
D'accord, j'ai trouvé un site récapitulatif des méthodes de la library : TinyGPS++ | Arduiniana et y a une méthode isValid()
Alors petit update, j'ai testé avec l'attente du fix que tu as proposé, sauf que j'ai une boucle infini qui continue pas.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.