compteur de vitesse

Alors voila un code, que je pense un peu plus optimisé

/*
   Compteur de vitesse
   Lesept 08/2019
*/
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>

#define OLED_RESET 4
Adafruit_SSD1306 display( OLED_RESET );

// Définir ici les seuils min et max du analogRead
#define valMin 410
#define valMax 615
// Définir ici les coordonnées pour l'effacement du texte
// x : abscisse min, y : ordonnée min, w : largeur, h : hauteur du rectangle
// Voiri :https://learn.adafruit.com/adafruit-gfx-graphics-library/graphics-primitives 
#define xDist 40
#define yDist 20
#define wDist 40
#define hDist 20
#define xVit  00
#define yVit  20
#define wVit  40
#define hVit  20

const int valMoy = (valMin + valMax) / 2;
const int seuil = (valMax - valMin) / 2;
const int perimetre = 2;  //entrer le périmètre de la roue en m, le périmètre est égal à   pi*diamètre     ou      pi*2* rayon                       !!!!! EN METRE !!!!!
bool flagMesure = false;
unsigned long tempstrouve = 0;
unsigned long dernierPassage = 0;
float vitesse = 0;
float distance = 0;

void Affiche (float distance, float vitesse) {
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.fillRect (xDist,yDist,wDist,hDist,BLACK);
  display.setCursor(40, 2);  //essai donc placement on s'en fout
  display.print(distance, 1);

  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.setCursor(0, 2);  //essai donc placement on s'en fout
  display.fillRect (xVit,yVit,wVit,hVit,BLACK);
  display.print(vitesse, 0);
  
  display.display();
}

void setup () {
  display.begin( SSD1306_SWITCHCAPVCC, 0x3C );
  display.clearDisplay();
  Affiche (distance, vitesse);
}

void loop() {
  int diff = abs(analogRead(A0) - valMoy);
  if (diff >= seuil) { //si un aimant pole nord ou un aimant pole sud passe devant le capteur
    if (flagMesure) {
      tempstrouve = millis() - dernierPassage;
      dernierPassage = millis();
      vitesse = (perimetre / (tempstrouve / 1000.0)) * 3.6; //donne la vitesse en km/h grace à v = d/t
      flagMesure = false;     // pour attente cycle suivant
      distance = distance + (perimetre / 1000.0);
      Affiche (distance, vitesse);
    }
  }
  else
  {
    flagMesure = true;  // prêt pour une nouvelle mesure
  }
}

Au lieu d'effacer l'écran entier à chaque fois, je trace un rectangle aux endroits ou tu affiches la distance et la vitesse. Ces endroits sont définis par

#define xDist 40
#define yDist 20
#define wDist 40
#define hDist 20
#define xVit  00
#define yVit  20
#define wVit  40
#define hVit  20

Mais il faut que tu trouves les bonnes valeurs sur ton écran.

Pour le capteur, j'ai modifié le test afin de ne plus avoir de OU. Le principe c'est de calculer la distance de la valeur mesurée à la moyenne. Par exemple, si un passage correspond à une valeur mesurée inférieure à 400 ou supérieure à 600 (c'est plus facile à voir avec des nombres entiers), on peut faire

if (valeur <=400 || valeur >= 600)

mais on peut aussi se dire que la distance de la valeur à 500 doit être supérieure à 100, ce qui donne

diff = abs(valeur - 500);
if (diff >= 100)

500 est la valeur moyenne de 400 et 600, et 100 et la moitié de la distance entre 400 et 600.

Si vraiment c'est encore trop lent (mais il faudrait le tester sur une vraie roue,en vraie grandeur) on peut afficher les valeurs moins souvent, par exemple toutes les secondes. On pourra voir ça plus tard...