compteur de vitesse avec ecran oled

Bonjour, je souhaite réaliser un vitesse-mètre avec affichage de : km, km total, vitesse max, vitesse instantané avec affichage OLED et capteur à effet hall.

  • Mon afficheur OLED est de 0.96’’ 128*64 en I2C ( adresse I2C trouvé avec scanner = 0x3C ) SSD1306.

  • Mon capteur à effet hall est un 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. Mon capteur est donc analogique pas comme les “autres”( la majorité ).

Je n’ai aucun problème au niveau cablâge ( ecran 5v et gnd + sda sur sda et sci sur sci ) (effet hall supply sur 5v gnd sur gnd et output sur a0 ) par contre au niveau programmation je n’arrive pas du tout; j’ai déjà regardé les différents articles de capteur à effet hall tachymetre mais je ne comprends rien à ceux-ci.

Je ne souhaite pas forcément de codes tout faitsmais de conseils et de bouts de codes, surtout le calcul pour mesurer la vitesse.

J’ai essayé avec ce début de programme affichant le tempstrouvé sur serial pour l’instant mais ça ne fonctionne pas, je pense à un problème du DernierPassage

unsigned long temps = millis;
unsigned long DernierPassage;
unsigned long tempstrouvé;
int pinCapteur = A0;


void setup(){
  Serial.begin(9600);
}
void loop(){

  if(digitalRead(pinCapteur) <= 2*204.6 ||digitalRead(pinCapteur) >= 3*204.6){  //Si aimant pole nord //ou aimant pole sud (si moins de 2v ou plus de 3v)
    tempstrouvé = temps - DernierPassage;
    DernierPassage = temps;
 Serial.println(tempstrouvé);
delay(50);
    //et la je suis bloqué
  }

  
}

Merci d’avance à tous ceux qui prendront le temps de regarder mon post et d’y répondre ou même, qui sait, de trouver une solution.

1ere chose: il faut utiliser analogRead et pas digitalRead

il faut transformer ton signal analogique en digital
essaye ça

unsigned long temps;
unsigned long DernierPassage;
unsigned long tempstrouvé;
int pinCapteur = A0;
boolean tour = false;


void setup() {
  Serial.begin(9600);
  temps = millis;
}
void loop() {

  if (analogRead(pinCapteur) > 550 && tour) { //Si aimant pole nord //ou aimant pole sud (si moins de 2v ou plus de 3v)
    tour = false;
    Serial.print(F,("J'ai fait un tour en "));
    Serial.print(millis() - temps);
    Serial.println(F(" ms");
    temps = millis();
  }
  if (analogRead(pinCapteur) < 550 && !tour) { //Si aimant pole nord //ou aimant pole sud (si moins de 2v ou plus de 3v)
    tour = true;
  }

Je n’ai pas testé mais ça peux marcher (à part le premier tour!).

Millis est une fonction, doit-il écrire :
T=millis ou T=millis() ?

Merci de la correction: millis()

savoriano:
1ere chose: il faut utiliser analogRead et pas digitalRead

il faut transformer ton signal analogique en digital
essaye ça

unsigned long temps;

unsigned long DernierPassage;
unsigned long tempstrouvé;
int pinCapteur = A0;
boolean tour = false;

void setup() {
  Serial.begin(9600);
  temps = millis;
}
void loop() {

if (analogRead(pinCapteur) > 550 || tour) { //Si aimant pole nord //ou aimant pole sud (si moins de 2v ou plus de 3v)
    tour = false;
    Serial.print(F,(“J’ai fait un tour en “));
    Serial.print(millis() - temps);
    Serial.println(F(” ms”);
    temps = millis();
  }
  if (analogRead(pinCapteur) < 550 || !tour) { //Si aimant pole nord //ou aimant pole sud (si moins de 2v ou plus de 3v)
    tour = true;
  }



Je n'ai pas testé mais ça peux marcher (à part le premier tour!).

Qu’est ce que le F?
Tu dis que temps = millis mais apres tu dis millis et non temps
Et … …ça ne marche pas.

Et surtout tu dis que si …ou tour ecrire le temps et mettre tour a 0 mais apres tu dis que si tour à 0 mettre tour a 1 donc ça recommence indéfiniment:boucle sans fin.

J’ai refait le code comme ça mais il y a un problème de tempstrouvé selon les messages d’erreur, je ne comprends pas.

void setup() {
  Serial.begin(9600);

}
void loop() {

  unsigned long temps = millis();
  unsigned long tempstrouvé;
  unsigned long DernierPassage;

  if(digitalRead(A0) <= 410  ||digitalRead(A0) >= 615 ){
    tempstrouvé = temps - DernierPassage;
    DernierPassage = temps;
    Serial.println(tempstrouvé);
    delay(250);
  }
  }

Quand tu dis que le code ca ne marche pas, moi je comprends que le skecth ne fais pas que que tu veux.
Dans ce cas il faut dire que il y a des erreurs dans la compilation et normalement il faut citer les erreurs.
Maintenant que je suis sur mon ordinateur personnel j’ai pu constater (avec l’aide de l’ IDE )que il y a dans mon code des erreurs.
Si tes valeurs de tension que t’as cité dans ton premier post sont justes, je ne vois pas pourquoi mon code ne devrait pas fonctionner.

unsigned long temps;
int pinCapteur = A0;
boolean tour = false;


void setup() {
  Serial.begin(9600);
  temps = millis();
}
void loop() {

  if (analogRead(pinCapteur) > 550 && tour) { //Si aimant pole nord //ou aimant pole sud (si moins de 2v ou plus de 3v)
    tour = false;
    Serial.print(F("J'ai fait un tour en "));
    Serial.print(millis() - temps);
    Serial.println(F(" ms"));
    temps = millis();
  }
  if (analogRead(pinCapteur) < 550 && !tour) { //Si aimant pole nord //ou aimant pole sud (si moins de 2v ou plus de 3v)
    tour = true;
  }
}

le boolean tour sert pour que le deux if soient “VRAI” une seule fois par tour.

ou tour ecrire le temps et mettre tour a 0 mais apres tu dis que si tour à 0 mettre tour a 1 donc ça recommence indéfiniment:boucle sans fin.

N’oublie pas
analogRead(pinCapteur) > 550
et
analogRead(pinCapteur) < 550
550 est une valeur que j’ai choisie entre le min (2.5v si j’ai bien compris) et le max (3.0v) et correspond à (2.6v).
Admet-on que le capteur est en face du polo sud, on a une tension inférieur à 550.
le 1er if sera FALSE car analogRead(pinCapteur) > 550 est FALSE
le 2me if sera TRUE car analogRead(pinCapteur) < 550 est TRUE et aussi !tour sera TRUE
ici le tour passera TRUE
a partir de maintenant les 2 if serons FALSE jusqu’à que le capteur sera suffisamment proche du pole nord pour que la valeur de la tension soit > 500.
En ce moment la le 1er if passera a TRUE car
analogRead(pinCapteur) > 550 = TRUE
et
tour = TRUE
Il exécute les lignes

   tour = false;
    Serial.print(F("J'ai fait un tour en "));
    Serial.print(millis() - temps);
    Serial.println(F(" ms"));
    temps = millis();

maintenant tour est FALSE donc au prochain loop cette condition sera FALSE car
analogRead(pinCapteur) > 550 == TRUE
mais
tour = FALSE
tour passera à TRUE seulement quand la tension sera < 550 (proche du pole sud)

oufff!c’était dur d’expliquer tout ça!!

Relis le 1er post car quand il'n'y a aucun champs magnétique, le capteur est à 2.5v de sortie, donc j'ai testé, il envoie soit + de 3v ou soit - de 2v quand n aimant passe devant à environ 2cm ( comme je veux ).

Mais mon code ne se compile pas, il m'affiche comme message d'erreur à la ligne Serial.println(tempstrouvé) (il la fluote en rouge ) donc je pense qu'il y a un problème de tempstrouvé, je n'ai pas trouvé l'erreur.

Moi non plus je ne trouve pas l'erreur!

Postes peut-être le code et le message d'erreur ?

Le code :

void setup() {
  Serial.begin(9600);

}
void loop() {

  unsigned long temps = millis();
  unsigned long tempstrouvé;
  unsigned long DernierPassage;

  if(digitalRead(A0) <= 410  ||digitalRead(A0) >= 615 ){
    tempstrouvé = temps - DernierPassage;
    DernierPassage = temps;
    Serial.println(tempstrouvé);
    delay(250);
  }
  }

Le message d’erreur:

Arduino : 1.8.5 (Windows 7), Carte : “Arduino/Genuino Uno”

vitesse_km_effet_hall:8: error: stray ‘\303’ in program

vitesse_km_effet_hall:8: error: stray ‘\251’ in program

vitesse_km_effet_hall:12: error: stray ‘\303’ in program

vitesse_km_effet_hall:12: error: stray ‘\251’ in program

vitesse_km_effet_hall:14: error: stray ‘\303’ in program

vitesse_km_effet_hall:14: error: stray ‘\251’ in program

exit status 1
stray ‘\303’ in program

Ce rapport pourrait être plus détaillé avec
l’option “Afficher les résultats détaillés de la compilation”
activée dans Fichier → Préférences.

La photo screen en lien

C'est analogRead et pas digitalRead

Mais ce n'est pas l'erreur, tu as des caractères cachés dans les lignes 8, 12 & 14. Le plus simple est de réécrire ces lignes à la main

1ere chose: il faut utiliser analogRead et pas digitalRead

C'est analogRead et pas digitalRead

lesept:
C'est analogRead et pas digitalRead

Mais ce n'est pas l'erreur, tu as des caractères cachés dans les lignes 8, 12 & 14. Le plus simple est de réécrire ces lignes à la main

Qu'est ce que des caractères cachés ?
J'ai tout récrie à la main le code ( avec analogRead !!! ) mais toujours le même message d'erreur,

Ok : une variable ne doit pas contenir de caractère accentué, change tempstrouvé en tempstrouve partout

Désolé de t'avoir fait réécrire...

D'accord maintenant je comprends, merci beaucoup , j'ai testé, la compilation fonctionne bien mais le port série m'affiche les valeurs de millis sans même que je passe l'aimant une seule fois.