affichage vitesse gps

bonjours

je suis débutant dans l'Arduino,je me suis lancé sur un petit projet gps ( qui est visiblement sur le net un grand classique) pour me reméttre à jour dans l'éléctronique car mon bac sti est un peut loin est visiblement ça a un peut beaucoup évolué, et je me suis aussi lancé sur ce projet de mini gps car il répond à un autre besoin. je fait de la course à pieds et j'ai besoin d'un produit trés petit.

j'ai fait pas mal de recherche sur le net pour trouver un code de base fonctionnel est le faire évoluer.
j'ai pas trouvé beaucoup de code fonctionelle j'ai trouvé notament un récament qui correspond à peut prés à mon besoin je les fait évolué pour ce rapprocher de mon besoin le programme fonctionne très bien mais il me manque 2 éléments:

  • je n'arrive pas trouver comment faire pour Integer la donner vitesse à mon projet
  • je souhaiterais aussi que la commande de bascule entre les infos altitude vitesse et coordonnées latitude longitude ce face par un bouton poussoir ( actuellement ça ce fait actuellement à intervalle régulier et automatiquement).

j'ai trouvé les code de librairie mais je ne comprend pas trop comment les intégrer

le montage est composé de:

un module gps néo 6mv2
d'un afficheur oled kuman 0,96
d'un arduino un de chez elegoo

voila le code du projet

/

#include <SPI.h>                      //Serial Peripheral Interface (SPI) library for synchronous serial data protocol
#include <Wire.h>                     //Wire library used for I2C communication: Arduino Pro Mini pins used = A4 (SDA) and A5 (SCL)
#include <Adafruit_GFX.h>             //Adafruit graphic display library used for the OLED display
#include <Adafruit_SSD1306.h>         //Adafruit driver for OLED

#include <SoftwareSerial.h>           //SoftwareSerial library used to allow serial communication on other digital pins (i.e. Pins 3 & 4 for the this GPS project)
#include <TinyGPS.h>                  //GPS Library used to read the data from GPS Module

#define OLED_RESET 5
#define _GPS_KM_PER_METER 0.001
Adafruit_SSD1306 display(OLED_RESET);
TinyGPS gps;                          //Create the TinyGPS object, giving it a name of your choice (here we use the name gps)
SoftwareSerial nss(3, 4);             //set sotfware serial communications to arduino ports 3 and 4 (TX = 3 and RX = 4)
const int buttonPin = 5;
unsigned int buttonState = 0;
void setup()  

{                  
   nss.begin(9600);
  
  unsigned long age, date, time, chars = 0;

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize the OLED and set the I2C address to 0x3C (for the 128x64 OLED) 
  
  display.clearDisplay();             //Clear display buffer.

  display.setTextSize(2);             //set text size to 2 (large)
  display.setTextColor(WHITE);
  display.setCursor(0,0);             //set text start position to column=0 and row=0
  display.print("  Benito");          //
  
  display.setTextSize(1);             //set text size to 1 (small)
  display.setCursor(30,18);            //set text start position to column=0 and row=18
  display.print("GPS SYSTEM");        //print "GPS SYSTEM" to display
  
  display.display();                  //update OLED with new display data
  delay(2000);                        //short delay
  display.clearDisplay();             //clear display  
}
//MAIN PROGRAMME LOOP
void loop() {

bool newdata = false;
  unsigned long start = millis();
  while(millis() - start < 1000){    // Every 1 seconds we print an update
    if (feedgps())
      newdata = true;
  }
  if (newdata)
  { 
    gpsdump(gps);
  }
}
//PRINT GPS DATA TO OLED DISPLAY
void gpsdump(TinyGPS &gps)
{  
  float flat, flon, falt;
  display.clearDisplay();
  
  display.setTextSize(1);           //set text size to 1
  display.setTextColor(WHITE);      //
  gps.f_get_position(&flat, &flon); //retrieves latitude and longditude data
  display.setCursor(0,0);          //set text start position to column=0 and row=20
  display.print("Altitude : ");     //print "Altitude" : to display
  display.println(gps.f_altitude());//print altitude data to display
  display.setCursor(100,0);        //set text start position to column=100 and row=20
  display.println(" M ");             //print "m" to display

  display.setCursor(0,10);          //set text start position to column=0 and row=40
  display.print("vitesse : ");     //print "vitesse :" to display

  display.setCursor(100,10);        //set text start position to column=100 and row=20
  display.println("KM/H");             //print "KM/H" to display

  display.display();                  //update OLED with new display data
  delay(10000);                        //short delay
  display.clearDisplay();             //clear display
  
  display.setCursor(0,10);          //set text start position to column=0 and row=40
  display.print("latitude : ");     //print "latitude :" to display
  display.println(flat,6);          //print latitude data to display up to 6 decimal places
  
  display.setCursor(0,20);          //set text start position to column=0 and row=50
  display.print("longitude: ");     //print "longitude:" to display
  display.println(flon,6);          //print longitude data to display up to 6 decimal places

   display.display(); 
   delay(10000);                        //short delay
}
//TEST FOR NEW DATA FROM THE GPS MODULE
bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))    //Each byte of NEMA data must be giving to TinyGPS by using encode(). True is returned when new data has been fully decoded and can be used
      return true;
  }
  return false;
}

merci part avance des conseils est aides pour ce projet

Avez vous joué avec les programmes de démonstration de Adafruit_SSD1306 et tinyGPS (permettent de comprendre, sur des exemples simples, comment les périphèriques sont gérés sur des exemples simples, et, du moins dans le cas d'adafruit, sont bien écrits...)
Quelques remarques:
delay(10000); n'est pas un delai court; c'est un delai de 10 secondes (est ce hustifié?).
Pour pouvoir lire plus facilement,une construction du type

void gpsdump(TinyGPS &gps)
{

peur etre réecrite en (nombre limité de lignes)

void gpsdump(TinyGPS &gps) {

Pour la vitesse, avec TinyGPS :

float fkmph = gps.f_speed_kmph(); // speed in km/hr

Pour info, l'auteur a fait une version plus récente de sa bibliothèque appelée TinyGPS++

Pour le bouton, il faut d'abord déclarer le bouton, le plus simple est de le mettre en INPUT_PULLUP. Tu le branches entre une entrée digitale (disons D5)et le GND, puis dans le setup

pinMode (5, INPUT_PULLUP);

Lorsque le bouton sera appuyé, il renverra un LOW.

Ensuite, il faut modifier la loop pour prendre en compte un appui sur le bouton. Je te propose ça :

#include <SPI.h>                      //Serial Peripheral Interface (SPI) library for synchronous serial data protocol
#include <Wire.h>                     //Wire library used for I2C communication: Arduino Pro Mini pins used = A4 (SDA) and A5 (SCL)
#include <Adafruit_GFX.h>             //Adafruit graphic display library used for the OLED display
#include <Adafruit_SSD1306.h>         //Adafruit driver for OLED

#include <SoftwareSerial.h>           //SoftwareSerial library used to allow serial communication on other digital pins (i.e. Pins 3 & 4 for the this GPS project)
#include <TinyGPS.h>                  //GPS Library used to read the data from GPS Module

#define OLED_RESET 5
#define _GPS_KM_PER_METER 0.001
Adafruit_SSD1306 display(OLED_RESET);
TinyGPS gps;                          //Create the TinyGPS object, giving it a name of your choice (here we use the name gps)
SoftwareSerial nss(3, 4);             //set sotfware serial communications to arduino ports 3 and 4 (TX = 3 and RX = 4)
const int buttonPin = 5;
unsigned long start = 0;

void setup() {
  nss.begin(9600);
  pinMode(buttonPin,INPUT_PULLUP);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize the OLED and set the I2C address to 0x3C (for the 128x64 OLED)
  display.clearDisplay();             //Clear display buffer.
  display.setTextSize(2);             //set text size to 2 (large)
  display.setTextColor(WHITE);
  display.setCursor(0, 0);            //set text start position to column=0 and row=0
  display.print("  Benito");          //
  display.setTextSize(1);             //set text size to 1 (small)
  display.setCursor(30, 18);           //set text start position to column=0 and row=18
  display.print("GPS SYSTEM");        //print "GPS SYSTEM" to display
  display.display();                  //update OLED with new display data
  delay(2000);                        //short delay
  display.clearDisplay();             //clear display

  unsigned long start = millis();
}

//MAIN PROGRAMME LOOP
void loop() {
  if (millis() - start > 1000ul) {  // read GPS every second
    start = millis();
    while (!feedgps()); // wait for GPS update
  }
  unsigned int buttonState = digitalRead(buttonPin);
  if (!buttonState) {  // display when button is pushed
    delay(20);
    gpsdump(gps);
  }
}

J'ai un peu modifié ta gestion du temps. Pas vérifié...
Je te laisse mettre la vitesse...

C'est vrai que le delay(10000) va gêner pour détecter un appui du bouton. Pendant le delay, l'Arduino ne fait rien du tout et donc ne vérifie pas l'appui. Il faut peut-être passer par une interruption.

Ou alors, l'utilisateur sait qu'il ne faut pas appuyer sur le bouton pendant les 20 secondes d'affichage, ce qui n'est pas aberrant puisque l'appui sur le bouton sert à lancer l'affichage...

". Il faut peut-être passer par une interruption."

ou tester millis() (ce qu'il a l'air de savoir faire: ça fait deux styles de programmation, l'un avec des delais bloquants -ce n'est pas génant dans setup; ailleurs, ça géne considérablement toute evolution de code pour rajouter des fonctionnalités-, l'autre avec des delais pas bloquants ....

bonsoir déjà je vous remercie pour vos réponse rapide

pour les différentes questions

Le temps delay(10000); est effectivement un peut long je vais surement ajusté cella.

Pour les librairies gps j'ai exploré et un peut expérimenté tiny gps et adafruit mais j'ai pas encore compris toute les subtilité de fonctionnement je vais voir avec ma littérature technique ci je trouve des informations complémentaire

pour la tiny gps ++ j'ai pas encore regardé les exemples proposé

ce soir je vais regarder toute vos proposition de code est surement les tester