J'ai donc effacé toute la partie carrée à remplacer et j'ai continué mon programme qui permet d'afficher toutes les variables. J'ai fait en m'inspirant de ce que vous aviez dit et alélioré et à partie de deux programmes que je vais nommer 1 et 2
programme1
#define valMin 410 // Définir ici les seuils min
#define valMax 615 // et max de l'analogRead.
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, BLACK);
display.setCursor(53, 2);
display.print(distance, 1);
display.setTextSize(4);
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 2);
display.print(vitesse, 0);
display.display();
}
void setup () {
display.begin( SSD1306_SWITCHCAPVCC, 0x3C );
display.clearDisplay();
Affiche (distance, vitesse);
}
void loop() {
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(74, 2);
display.print("km");
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(52, 18);
display.print("km/h");
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
}
}
programme 2
/* Ce programme permet de calculer la vitesse en km/h d'un vélo ou autre à partie d'un capteur à effet hall numérique
* Il permet donc de calculer la vitesse instantanée, la distance du trajet, la vitesse max, la vitesse max totale ainsi que la distance totale.
*
* On stocke la vitesse max totale et la distance totale dans la mémoire EEPROM et on calcule la vitesse ( donc la distance, etc.. ) en mesurant le temps entre
* chaque interruptions ( donc passage de l'aimant devant le capteur == un tour de roue ) et en appliquant la formule v = d/t.
*
* Avant d'utiliser ce programme, il faut calculer le périmètre de la roue et le rentrer dans " int perimetre = (ici la valeur du périmètre en m)" Dans la ligne suivi de points d'exclamations.
* ((( Pour rappel le périmètre est égal à pi x 2 x rayon ou pi x diamètre. )))
*
* Ce programme ne permet pas l'affichage sur écran ou port série ou autres de ces valeurs. Il utilise un capteur à effet hall analogique UGN3503 qui envoie du 2.5v quand aucun champs magnétique,
* augmente quand un champs magnétique "nord" se rapproche ( quand il passe environ 3v ) et diminue quand un champs magnétique "sud" se rapproche.
*/
#include <EEPROM.h>
void setup(){
}
void loop() {
//les variables pour les calculs des variables finales
float perimetre = 2; //!!!!!!!!!!!!!!!!!EN METRES!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
static unsigned long dernierPassage;
static bool flagMesure = false;
int tempstrouve; //le temps trouvé entre deux passage de l'aimant ( le temps trouvé pour un tour de roue )
float distancebis; //la variable distancebis pour calculer la varible distance totale
//les variables finales pour l'affichage : vitesse, distance, vitesse max, vitesse max totale et distance totale
float vitesse; //la variable vitesse
float distance; //la variable distance
byte vitessemax; //la variable vitesse maximum //byte car 1 seul octet et suffisant ( à moins d'aller à plus de 255 km/h )
byte vitessemaxtotale = EEPROM.read(0); //la variable vitesse max totale pour l'EEPROM //byte car 1 seul octet ( à moins d'aller à plus de 255 km/h )
int distancetotale = EEPROM.get(1, distancetotale); //la variable distance totale pour l'EEPROM
if(analogRead(A0) <= 410 || analogRead(A0) >= 615) { //si un aimant pole nord ou un aimant pole sud passe devant le capteur
if(flagMesure)
{
unsigned long temps = millis();
tempstrouve = temps - dernierPassage;
dernierPassage = temps;
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;
distancebis = distancebis + perimetre;
}
}
else
{
flagMesure = true; // prêt pour une nouvelle mesure
}
if(vitesse > vitessemax){ //calcule la vitesse max du trajet
vitessemax = vitesse;
}
if(vitessemax > vitessemaxtotale){ //calcule la vitesse max totale
vitessemaxtotale = vitessemax;
EEPROM.update( 0, vitessemaxtotale); //on écrit la variable vitesse max totale dans l'EEPROM
}
if(distancebis >= 1.0){
distancetotale = distancetotale + distancebis; //on calcule la variable distance totale
distancebis = 0; //on remet la variable distancebis à 0 pour le calcul suivant ( dans 1 km )
EEPROM.put( 1, distancetotale); //on écrit la variable distance totale dans l'EEPROM
}
}