Compteur gps / menu bouton poussoir

Bonjour à tous,
Je suis passionné de voiture ancienne et j'aimerai terminer un projet que je peine a réaliser. Je souhaite connaitre la vrai vitesse a laquelle je circule, car mon compteur d'origine m'indique une vitesse erronée étant donné que les roues ont un diamètre différents.
Je suis novice et je n'ai pas de notion en languageC.

Je suis parvenu a faire un montage en sélectionnant des infos trouvées sur la toile.
Ce montage est composé d'GPS ultimate Adafruit v3, d'un arduino nano, d'un écran oled 128x32, d'un bouton poussoir et d'une résistance 10kohm.
J'arrive a afficher simultanément plusieurs info comme la vitesse, la longitude, la latitude, l'heure, la date...

A présent je souhaite afficher ces données les unes à la foi. Dans un premier temps la vitesse s'affiche, j'appuis sur le bouton poussoir, la longitude s'affiche, j'appuis sur le bouton poussoir, la latitude s'affiche, j'appuis sur le bouton poussoir, l'heure s'affiche, j'appuis sur le bouton poussoir, la date s'affiche, j'appuis sur le bouton poussoir, la vitesse s'affiche etc....

J'ai lu des postes sur les menus mais qui sont plus évoluer que ce que je veux faire.

J'ai tenté des choses en vain..

voici le code

#include <SPI.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GPS.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// Set to false to display time in 12 hour format, or true to use 24 hour:
#define TIME_24_HOUR true
#define HOUR_OFFSET 2
#define DISPLAY_ADDRESS 0x70

SoftwareSerial gpsSerial(3, 2); 
Adafruit_GPS gps(&gpsSerial);

int h1,h2,m3,m4,s5,s6,d1,d2,d3,d4;

const int buttonPin = 5;
unsigned int buttonState = 0;


void setup() {
pinMode(buttonPin, INPUT);
Serial.begin(115200);
Serial.println("Clock starting!");


// Setup the display.)
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 

display.display();
delay(5000);

display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(34,4);
display.println("JEANS");
display.setCursor(43,22);
display.setTextSize(1);
display.print("edition"); 
display.display();
delay(5000);

gps.begin(9600);

// Configure GPS to onlu output minimum data (location, time, fix).
gps.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);

// Use a 1 hz, once a second, update rate.
gps.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ);

// Enable the interrupt to parse GPS data.
enableGPSInterrupt();
}

void loop() {
  // Loop function runs over and over again to implement the clock logic.
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

// Check if GPS has new data and parse it.
if (gps.newNMEAreceived()) {
gps.parse(gps.lastNMEA());
}


int hours = gps.hour + HOUR_OFFSET; 
int date = gps.month*100+gps.day;
int year = gps.year;

int speeds = gps.speed * 1.852;
if (hours < 0) {
hours = 24+hours;
}
if (hours > 23) {
hours = 24-hours;
}
int minutes = gps.minute;
int seconds = gps.seconds;

int displayValue = hours*100 + minutes;

if (!TIME_24_HOUR && hours > 11) {
displayValue -= 1200;
}

//if (buttonState == HIGH) {
display.clearDisplay();
//while (buttonState == LOW){
//delay(300);  
display.setCursor(0,2);
//display.print("speed:");
display.setTextSize(4);
display.print(speeds);
display.setCursor(79,16);
display.setTextSize(2);
display.print("km/h");
display.display();


if (buttonState == HIGH) {  
while (buttonState == LOW){
display.clearDisplay();
//delay(300);
display.setCursor(0,16);
display.print("Lon:");
display.print(gps.lon);
display.print(" ");
display.print(gps.longitude/100, 3);
display.display();
}
}
if (buttonState == HIGH) {
while (buttonState == LOW){
display.clearDisplay();
delay(300);  
display.setCursor(0,16);
display.print("Lat:");
display.print(gps.lat);
display.print(" ");
display.print(gps.latitude/100, 3);
display.display();
}
}
/*display.clearDisplay(); 
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(88,8);

h1=displayValue/1000;
displayValue-=h1*1000;
h2=displayValue/100;
displayValue-=h2*100;
m3=displayValue/10;
m4=displayValue%10;
s5=seconds/10;
s6=seconds%10;


d1=date/1000;
date-=d1*1000;
d2=date/100;
date-=d2*100;
d3=date/10;
d4=date%10;

display.print(h1);
display.print(h2);
display.print(":");
display.print(m3);
display.print(m4);
display.print(":");
display.print(s5);
display.print(s6);
display.print("    ");


display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(79,0);

display.print(d3);
display.print(d4);
display.print("/");
display.print(d1);
display.print(d2);
display.print("/");
display.print(year);

display.display();*/
 
}
SIGNAL(TIMER0_COMPA_vect) {
// Use a timer interrupt once a millisecond to check for new GPS data.
// This piggybacks on Arduino’s internal clock timer for the millis()
// function.
gps.read();
}

void enableGPSInterrupt() {
// Function to enable the timer interrupt that will parse GPS data.
// Timer0 is already used for millis() – we’ll just interrupt somewhere
// in the middle and call the „Compare A“ function above
OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);
}

Pourriez-vous m'aider à débloquer mon projet?

Merci d'avance

bonjour,
plus simple, un bouton et un compteur
si compteur == 0 ==> vitesse
-----------------------1------- lat
etc...
si compteur > maxi des options alors compteur = 0

infobarquee:
bonjour,
plus simple, un bouton et un compteur
si compteur == 0 ==> vitesse
-----------------------1------- lat
etc...
si compteur > maxi des options alors compteur = 0

bonsoir,
merci pour cette réponse.

J'ai cherché à comprendre ce début de soirée mais a vrai dire c'est pas concluant...
Pourrais-tu m'éclairer un peu plus?

J'ai tenté ce qui suit mais le code ne compile pas

#include <SPI.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GPS.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// Set to false to display time in 12 hour format, or true to use 24 hour:
#define TIME_24_HOUR true
#define HOUR_OFFSET 2
#define DISPLAY_ADDRESS 0x70

SoftwareSerial gpsSerial(3, 2); 
Adafruit_GPS gps(&gpsSerial);

int h1,h2,m3,m4,s5,s6,d1,d2,d3,d4;

const int buttonPin = 5;
int pagenumber = 0;
int buttonState,screen;
int memoire_plus = LOW;


void setup() {
pinMode(buttonPin, INPUT);
Serial.begin(115200);
Serial.println("Clock starting!");


// Setup the display.)
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 

display.display();
delay(5000);

display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(34,4);
display.println("JEANS");
display.setCursor(43,22);
display.setTextSize(1);
display.print("edition"); 
display.display();
delay(5000);

gps.begin(9600);

// Configure GPS to onlu output minimum data (location, time, fix).
gps.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);

// Use a 1 hz, once a second, update rate.
gps.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ);

// Enable the interrupt to parse GPS data.
enableGPSInterrupt();
}

void loop() {
  // Loop function runs over and over again to implement the clock logic.
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

   //Si le bouton a un état différent que celui enregistré ET que cet état est "appuyé"
    if((buttonState != memoire_plus) && (buttonState == HIGH))
    {
        pagenumber++; //on incrémente la variable qui indique combien de LED devrons s'allumer
    }
 memoire_plus = buttonState; //on enregistre l'état du bouton pour le tour suivant
    
  //on applique des limites au nombre pour ne pas dépasser 4 ou 0
    if(pagenumber > 2)
    {
        pagenumber = 0;
    }
    if(pagenumber < 0)
    {
        pagenumber = 2;
    }
    
    //appel de la fonction affiche() que l'on aura créée
    //on lui passe en paramètre la valeur du nombre de LED à éclairer
    //screen(pagenumber); 

// Check if GPS has new data and parse it.
if (gps.newNMEAreceived()) {
gps.parse(gps.lastNMEA());
}


int hours = gps.hour + HOUR_OFFSET; 
int date = gps.month*100+gps.day;
int year = gps.year;

int speeds = gps.speed * 1.852;
if (hours < 0) {
hours = 24+hours;
}
if (hours > 23) {
hours = 24-hours;
}
int minutes = gps.minute;
int seconds = gps.seconds;

int displayValue = hours*100 + minutes;

if (!TIME_24_HOUR && hours > 11) {
displayValue -= 1200;
}

void screen(int value){
 if (value == 0) {
display.clearDisplay();  
display.setCursor(0,2);
//display.print("speed:");
display.setTextSize(4);
display.print(speeds);
display.setCursor(79,16);
display.setTextSize(2);
display.print("km/h");
display.display();
}
if (value >= 1) {  
display.clearDisplay();
display.setCursor(0,16);
display.print("Lon:");
display.print(gps.lon);
display.print(" ");
display.print(gps.longitude/100, 3);
display.display();
}
if (value >= 2) {
display.clearDisplay(); 
display.setCursor(0,16);
display.print("Lat:");
display.print(gps.lat);
display.print(" ");
display.print(gps.latitude/100, 3);
display.display();
}
}
/*display.clearDisplay(); 
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(88,8);

h1=displayValue/1000;
displayValue-=h1*1000;
h2=displayValue/100;
displayValue-=h2*100;
m3=displayValue/10;
m4=displayValue%10;
s5=seconds/10;
s6=seconds%10;


d1=date/1000;
date-=d1*1000;
d2=date/100;
date-=d2*100;
d3=date/10;
d4=date%10;

display.print(h1);
display.print(h2);
display.print(":");
display.print(m3);
display.print(m4);
display.print(":");
display.print(s5);
display.print(s6);
display.print("    ");


display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(79,0);

display.print(d3);
display.print(d4);
display.print("/");
display.print(d1);
display.print(d2);
display.print("/");
display.print(year);

display.display();*/
 
}
SIGNAL(TIMER0_COMPA_vect) {
// Use a timer interrupt once a millisecond to check for new GPS data.
// This piggybacks on Arduino’s internal clock timer for the millis()
// function.
gps.read();
}

void enableGPSInterrupt() {
// Function to enable the timer interrupt that will parse GPS data.
// Timer0 is already used for millis() – we’ll just interrupt somewhere
// in the middle and call the „Compare A“ function above
OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);
}

J'ai tenté ce qui suit mais le code ne compile pas

sans l'erreur retournée, pas envie de me taper tout le code a vérifier :slight_smile:

infobarquee:
sans l'erreur retournée, pas envie de me taper tout le code a vérifier :slight_smile:

Pourrais-je juste voir un exemple détaillé de la marche à suivre stp?