Problème d'afficage

Bonjour a vous. Dans le cadre de mes études (terminal) j'ai un projet a effectuer qui est d'afficher la vitesse d'un karting et le niveau de sa batterie.

j'ai réussit a afficher les deux et a ralentir le delay d'apparition du niveau de batterie pour que cette dernière sois lisible.

Il me rester un problème a résoudre qui était de faire revenir le compteur à zéro (tjrs pas résolut sa ^^) mais depuis que j'ai fais des test pour résoudre ce problème la vitesse ne s'affiche vraiment plus.

J'utilise un capteur a effet hall pour capteur de vitesse et même en l'activant avec un aimants la valeur de la vitesse ne s'affiche pas.

Pour les personnes voulant m'aider (je vous remercie a l'avance) j'ai mis le programme complet en attach.

Cordialement camarde

ProjetVit1.ino (1.9 KB)

bonjour,
mets un serial.begin(9600= dans setup
et des serial.print des variables pour voir ce qu'il en ressort exactement

hello
tu as bien compris que millis() est un compteur qui démarre avec le prg et que ce compteur s'incrémente de milliseconde en millisecondes jusqu'à 49jours. ( en gros)

ce qui veut dire que passées les 10 premières secondes, tu entres dans le if à chaque tour de boucle

donc rpmcount est sans cesse remis à zéro

if (millis() > 10000)
    {
      rpmcount=0;
      rpm=0;
      }

et que dire du else du if précédent

else if (rpmcount > 20)

bonjour,
mets un serial.begin(9600= dans setup
et des serial.print des variables pour voir ce qu'il en ressort exactement

Bonjour. Je ne comprend pas vraiment l'utilité d'utilisé des sérial car je compte afficher cela sur l'écrant lcd. Et le programme me dit que le sérial n'est pas déclaré, j'ai déjà le serial.begin(9600).

dfgh, oui le rpmcount est bien remis a zéro toutes les dix secondes. Ainsi le décompte repart de 0. et le else du if précédent est la pour dire que au bout de 6.6 secondes (environs. Car 3 aimants) alors le programme exécute les calculs de vitesses. Cela est une partie du programme qui est fonctionnel et que j'ai tester. Je suis moins sur du second if cela est vrais, mais je sais qu'il est possible d'inséret un if dans un if. j'utilise donc cette méthode pour pouvoir metre mon compteur a zéro si les aimants ne passe plus devant le capteur. je ne suis pas sur que cela fonctionne mais je ne vois pas vraiment l'erreur que j'ai commis.
Et surtout je ne vois pas pourquoi la vitesse ne s'afficherais plus. Elle devrais au moins afficher 0. Et lorsque je retire la partie de:

if (millis() > 10000)
{
timeold=0;
rpmcount=0;
rpm=0;
}

Il n'y a tous de même pas la valeur qui s'affiche.

non, millis()>10000 est forcément vrai 10 secondes après que le programme à démarré

donc tu mets sous tension et 10 secondes après ta condition est vraie. et tu remets ta variable de comptage des interruptions à 0 toutes les 10 micro secondes
( je te mets 10µ sans savoir exactement, mais c'est pour te dire que c'est très très très rapide.)

ta ligne devrait etre:

if (rpmcount == 1) {timeold=millis();}//si la roue à commencé à tourner
    if ((millis()-timeold) > 10000)//si la roue tourne depuis + de 10 secondes
    {
      rpmcount=0;                  //remise à zéro de la variable de comptage des interruptions
      rpm=0;                       //remise à zéro de la vitesse calculée
      }

Oui je vois ou était mon erreur. Merci a toi. Mais je viens de faire le test et il n'y a quand même rien qui s'affiche. Tu a régler un de mes deux problèmes mais pas le plus important ^^ Il n'y a rien qui s'affiche (en terme de valeur) Il y a bien vitesse: Km/H qui s'affiche mais pas la valeur qui est normalement entre les deux.
J'ai vérifier les codes avec un autre élève qui a sensiblement le même projet que moi et lui son affichage qui est le même fonctionne.

si tu mets serial.print au lieu de Serial.print, ca marchera pas.
le but de Serial.print(valeur) est de voir si la valeur est bien prise en compte et affichée dans la console serial.
si elle s'affiche et pas sur le lcd==> voir où est le problème dans le code
si elle s'affiche pas en Serial===>idem
ca s'appelle du debuggage
après tu vire les serial print pour alléger le code

Merci pour cette information elle est très utile. Du coup j'ai pus vérifier que le rpm et le VitF (valeur flottante) fonctionne bien, mais le VitC (valeur en chaîne) ne fonctionne pas. Cela doit être la transformation de flottant en chaîne qui dysfonctionne mais cela n'est arriver que a partir du moment ou j'ai fait des tests pour faire revenir la valeur de la vitesse a 0.

j'ai joué avec ton code. il semble bien que cette instruction perturbe le compilo

#include <LiquidCrystal.h>

LiquidCrystal lcd(8,9,4,5,6,7);

volatile uint8_t rpmcount;
 
uint16_t rpm;//revolutions per minute
uint16_t nmbaimants=3;//nombres aimants
uint16_t Vitesse;

uint32_t timeold;
uint32_t rotating_time;
int retour_capteur = 2;
int info_tension = A1;

float VitF,BatV;
//char VitC[4],LvlBat[4];
int BatP;
int BatC;
int t;
char VitC[4],LvlBat[4];
void setup()
{
        Serial.begin(115200);
        pinMode(retour_capteur, INPUT); // retour capteur effet hall.
        pinMode(info_tension, INPUT); // tension batterie.
        
	attachInterrupt(0, rpm_fun, RISING); // Interrupt triggers on rising edge; 
	lcd.begin(16,2);
        delay(10);
        lcd.print("LCD OK") ; // affiche la chaine texte - message de test
        delay(2000); // pause de 2 secondes
        lcd.clear(); // // efface ecran et met le curseur en haut a gauche
        delay(10);
       
}
 
void loop()
{        
    if (rpmcount == 1) {timeold = millis();}//si la roue à commencé à tourner
    if ((millis()-timeold) > 10000)//si la roue tourne depuis + de 10 secondes
    {
      Serial.print("rpmcount ");Serial.println(rpmcount);
      rpmcount = 0;                  //remise à zéro de la variable de comptage des interruptions
      rpm = 0;                       //remise à zéro de la vitesse calculée
      
    }
    else if (rpmcount > 20)    //sinon si + de 20 interruptions 
    { 
    rotating_time = millis() - timeold; // calcul du temps de rotation
    rpm = (60000/(rotating_time/(rpmcount-1)))/nmbaimants;//1 min = 60000ms (rpmcount - 1) is the number of revolutions
    VitF=0.003768*rpm*12.75; //vitesse Km/h
    rpmcount = 0;      
    }
  
  
  
          //dtostrf(VitF,4,1,VitC);
          lcd.setCursor(0, 0) ; // positionne le curseur a l'endroit voulu (colonne, ligne) (1ère=0 !) 
          lcd.print("Vitesse:") ; // affiche la chaine texte
          //lcd.print(VitC);
          lcd.print(VitF);Serial.print("vitF=============== ");Serial.print(VitF);
          lcd.print("Km/H");  
          lcd.setCursor(0, 1);
          lcd.print("Bat:");    
          
          t++;Serial.print("     t = ");Serial.println(t);
      if (t < 500){;}
            
      else if (t > 500)
     {
          BatC = analogRead(A1); Serial.print("Batc======================== ");Serial.println(BatC);
          BatV = (BatC*0.029325);
          BatP = (BatV/25.2)*100;        
          //dtostrf(BatV,4,1,LvlBat);             
          //lcd.print(LvlBat);
          lcd.print(BatV);
          lcd.print("V");
          lcd.setCursor (11, 1);lcd.print("    ");
          lcd.setCursor (11, 1);lcd.print(BatP);
          lcd.print("%");
          t=0;
     }         
}
 
void rpm_fun()
{
	rpmcount++;
}