Problème avec des valeurs trop arrondies + matrice LED qui ne marche pas

Bonjour à tous,
Je suis actuellement sur un projet de maquette de voiture miniature pour mon Lycée : le but étant de mesurer la vitesse d'une voiture sur un moteur pour ensuite afficher un panneau attention si elle va trop vite.

Aujourd'hui je suis face à un problème. Quand je simule passage de la voiture, la valeur calculée de la vitesse est enormement arrondie si bien qu'elle ne prend que les valeurs 100 , 50 ou 0 et cela me pose un problème pour la mise e,n place du projet...

Voila mon code:

 #include <LedControlMS.h>
byte max_units = 1;
LedControl lc=LedControl(8,10,9,max_units); //Brancher din sur 8, clk 10 cs sur 9



int pinButton = 2; //On déclare le bouton On sur la broche 8
int pinButton2 = 7; //On déclare le bouton Off sur la broche 9
int stateMOT = 0; //On initialise l'etat du moteur à 0
int stateButtonOff = 0; //On initialise l'etat du bouton Off à 0
int stateButtonOn = 0; //On initialise l'etat du bouton On à 0
int pwm_a = 3;  //La vitesse du moteur se controle via la broche 3
int dir_a = 12;  //La direction du moteur se controle via la broche 12
int detectV=A5;  //Fil barrage relié à 8
int LEDV=4; //led relié à 4
int detectR=A0;  //Fil barrage relié à 9
int etatdetectV=0;  //declaration de la variable etatdetectV
int etatdetectR=0;  //declaration de la variable etatdetectR
int detection=0;
unsigned long tempsDebut, tempsFin;
unsigned long delaytime=1;  
  


int distance = 100;//Declaration de la distance separant R1 et R2 en mm
int vitesse = distance /((tempsFin - tempsDebut)/1000);

byte A[] = { B00011000,B00011000,B00011000,B00011000,B00011000,B00000000,B00011000,B00011000};
byte B[] = { B00011000,B00100100,B01011010,B01011010,B10000001,B10011001,B10000001,B01111110};


void setup() {
  pinMode(pinButton, INPUT); //Déclare le bouton On comme une entrée
  pinMode(pinButton2, INPUT); //Déclare le bouton Off comme une entrée
  pinMode(pwm_a, OUTPUT);  //Declare la vitesse du moteur comme une sortie
  pinMode(dir_a, OUTPUT);  //Declare la direction du moteur comme une sortie
 pinMode(detectV,INPUT_PULLUP);  //capteur, entrée
  pinMode(LEDV,OUTPUT); //led, sortie
  pinMode(detectR,INPUT_PULLUP);  //capteur, entrée
  Serial.begin(9600);
  Serial.println("En attente de passage...");
  Serial.println("La distance initialisée entre les deux capteurs est de ");
  Serial.print(distance);
  Serial.print(" mm");

}

void Attention() {

  lc.setRow(0,0,B[0]);
 lc.setRow(0,1,B[1]);
 lc.setRow(0,2,B[2]);
 lc.setRow(0,3,B[3]);
 lc.setRow(0,4,B[4]);
 lc.setRow(0,5,B[5]);
 lc.setRow(0,6,B[6]);
 lc.setRow(0,7,B[7]);
 delay(3000);

 
}

 void set_unit(byte number_of_unit){
  lc.shutdown(number_of_unit-1,false);
  lc.setIntensity(number_of_unit-1,1);
  lc.clearDisplay(number_of_unit-1);
  
}


void loop() {

  
 

   stateButtonOn = digitalRead(pinButton); //Controle l'etat du bouton On
  if(stateButtonOn == HIGH) { //Si il est pressé
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,85); //On ne change rien
    }
    if(stateMOT == 0){ //Si le moteur est eteint
      digitalWrite(pwm_a,85); //On allume le moteur
      stateMOT = 1; //On change l'etat du moteur à Allumé
    }
     
  }
   if(stateButtonOn == LOW) { //Si il n'est pas pressé (Bouton ON)
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,85); //On ne change rien
    }
    if(stateMOT == 0){ //Si le moteur est éteint
      digitalWrite(pwm_a,0); //On ne change rien
    }
     
  }

   stateButtonOff = digitalRead(pinButton2); //Controle de l'etat du bouton Off
   if(stateButtonOff == HIGH) { //Si il est pressé
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,0); //On eteint le moteur
      stateMOT = 0;//On change l'etat du moteur à Eteint
    }
    if(stateMOT == 0){//Si le moteur est eteint 
      digitalWrite(pwm_a,0);//On ne change rien
    }
     
  }
  if(stateButtonOff == LOW) { //Si il n'est pas pressé (Bouton OFF)
    if(stateMOT == 1){//Si le moteur est allumé 
      digitalWrite(pwm_a,85);//On ne change rien
    }
    if(stateMOT == 0){//Si le moteur est éteint
      digitalWrite(pwm_a,0);//On ne change rien
    }
     
  }
  
  
  etatdetectV = digitalRead(detectV);  //On affecte à la varialble etatdetect la valeur de detectV
etatdetectR = digitalRead(detectR); //On affecte à la varialble etatdetect la valeur de detectR

  
if (etatdetectV == LOW)  //si le détection
{


tempsDebut=millis();
Serial.println(" Top depart");
delay(500);
    }
    else      //sinon
{

}

if (etatdetectR == LOW) //si le détection
{
detection=HIGH;   

tempsFin = millis();
Serial.println(" Top final");

    }
    else      //sinon
{

}
if (detection ==HIGH)
  {

}
      Serial.println("La temps est de: ");
      Serial.print(tempsFin - tempsDebut);
  Serial.print("La vitesse est de:  ");

  
  Serial.print(distance /((tempsFin - tempsDebut)/1000));
  Serial.println(" mm/s");
  delay(1000);

  
  detection=LOW;

  }




}

Il me faut aussi la consigne d'afficher le signe sur la matrice que je pensais introduirte avec cette fonction :

     if (((tempsFin - tempsDebut)/1000)>50){
   Attention();
   for(byte i=1;i<6;i++)
{
  set_unit(i);

  
}

Mais le signe ne s'affiche malheureusement jamais.
Merci de votre aide.

J'ai pas tout lu, mais ça c'est déjà un problème:

Armczbt:

int distance = 100;//Declaration de la distance separant R1 et R2 en mm

int vitesse = distance /((tempsFin - tempsDebut)/1000);

Les grandeurs distance et vitesse ne sont pas des entiers, il faut les déclarer comme des float.
Et puis dans le calcul de la vitesse, il y a une division entière qui va générer des arrondis, tu devrais écrire:

 float dt = ( tempsFin - tempsDebut) / 1000. ;
float vitesse = distance/dt;

en ne manquant pas le point après 1000.

Bonjour merci de cette réponse

si je remplace ce que tu m'as proposée le moniteur renvoie ces valeurs :

0.00 pour le temps en ms

et inf pour la vitesse en mm /s

Merci

Bonjour merci de cette réponse

si je remplace ce que tu m'as proposée le moniteur renvoie ces valeurs :

0.00 pour le temps en ms

et inf pour la vitesse en mm /s

Merci

Re j"'ai réussi à résoudre le problème... J'ai donc ce code maintenant:

 #include <LedControlMS.h>
byte max_units = 1;
LedControl lc=LedControl(8,10,9,max_units); //Brancher din sur 8, clk 10 cs sur 9



int pinButton = 2; //On déclare le bouton On sur la broche 8
int pinButton2 = 7; //On déclare le bouton Off sur la broche 9
int stateMOT = 0; //On initialise l'etat du moteur à 0
int stateButtonOff = 0; //On initialise l'etat du bouton Off à 0
int stateButtonOn = 0; //On initialise l'etat du bouton On à 0
int pwm_a = 3;  //La vitesse du moteur se controle via la broche 3
int dir_a = 12;  //La direction du moteur se controle via la broche 12
int detectV=A5;  //Fil barrage relié à 8
int LEDV=4; //led relié à 4
int detectR=A0;  //Fil barrage relié à 9
int etatdetectV=0;  //declaration de la variable etatdetectV
int etatdetectR=0;  //declaration de la variable etatdetectR
int detection=0;
unsigned long tempsDebut, tempsFin;
unsigned long delaytime=1;  
  


int distance = 100;//Declaration de la distance separant R1 et R2 en mm


byte A[] = { B00011000,B00011000,B00011000,B00011000,B00011000,B00000000,B00011000,B00011000};
byte B[] = { B00011000,B00100100,B01011010,B01011010,B10000001,B10011001,B10000001,B01111110};


void setup() {
  pinMode(pinButton, INPUT); //Déclare le bouton On comme une entrée
  pinMode(pinButton2, INPUT); //Déclare le bouton Off comme une entrée
  pinMode(pwm_a, OUTPUT);  //Declare la vitesse du moteur comme une sortie
  pinMode(dir_a, OUTPUT);  //Declare la direction du moteur comme une sortie
 pinMode(detectV,INPUT_PULLUP);  //capteur, entrée
  pinMode(LEDV,OUTPUT); //led, sortie
  pinMode(detectR,INPUT_PULLUP);  //capteur, entrée
  Serial.begin(9600);
  Serial.println("En attente de passage...");
  Serial.println("La distance initialisée entre les deux capteurs est de ");
  Serial.print(distance);
  Serial.print(" mm");

}

void Attention() {

  lc.setRow(0,0,B[0]);
 lc.setRow(0,1,B[1]);
 lc.setRow(0,2,B[2]);
 lc.setRow(0,3,B[3]);
 lc.setRow(0,4,B[4]);
 lc.setRow(0,5,B[5]);
 lc.setRow(0,6,B[6]);
 lc.setRow(0,7,B[7]);
 delay(3000);

 
}

 void set_unit(byte number_of_unit){
  lc.shutdown(number_of_unit-1,false);
  lc.setIntensity(number_of_unit-1,1);
  lc.clearDisplay(number_of_unit-1);
  
}


void loop() {

  
 

   stateButtonOn = digitalRead(pinButton); //Controle l'etat du bouton On
  if(stateButtonOn == HIGH) { //Si il est pressé
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,85); //On ne change rien
    }
    if(stateMOT == 0){ //Si le moteur est eteint
      digitalWrite(pwm_a,85); //On allume le moteur
      stateMOT = 1; //On change l'etat du moteur à Allumé
    }
     
  }
   if(stateButtonOn == LOW) { //Si il n'est pas pressé (Bouton ON)
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,85); //On ne change rien
    }
    if(stateMOT == 0){ //Si le moteur est éteint
      digitalWrite(pwm_a,0); //On ne change rien
    }
     
  }

   stateButtonOff = digitalRead(pinButton2); //Controle de l'etat du bouton Off
   if(stateButtonOff == HIGH) { //Si il est pressé
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,0); //On eteint le moteur
      stateMOT = 0;//On change l'etat du moteur à Eteint
    }
    if(stateMOT == 0){//Si le moteur est eteint 
      digitalWrite(pwm_a,0);//On ne change rien
    }
     
  }
  if(stateButtonOff == LOW) { //Si il n'est pas pressé (Bouton OFF)
    if(stateMOT == 1){//Si le moteur est allumé 
      digitalWrite(pwm_a,85);//On ne change rien
    }
    if(stateMOT == 0){//Si le moteur est éteint
      digitalWrite(pwm_a,0);//On ne change rien
    }
     
  }
  
  
  etatdetectV = digitalRead(detectV);  //On affecte à la varialble etatdetect la valeur de detectV
etatdetectR = digitalRead(detectR); //On affecte à la varialble etatdetect la valeur de detectR

  
if (etatdetectV == LOW)  //si le détection
{

tempsDebut=millis();
Serial.println(" Top depart");
delay(500);
    }
    else      //sinon
{

}

if (etatdetectR == LOW) //si le détection
{
detection=HIGH;   

tempsFin = millis();
Serial.println(" Top final");

    }
    else      //sinon
{

}
if (detection ==HIGH)
  {
     if (((tempsFin - tempsDebut)/1000)>50){
   Attention();
   for(byte i=1;i<6;i++)
{
  set_unit(i);

  
}
}

float dt = (float)( (float)tempsFin - (float)tempsDebut) / 1000. ;
float vitesse = (float)distance/(float)dt;

      Serial.println("La temps est de: ");
      Serial.print((float)dt);
  Serial.print("La vitesse est de:  ");

  
  Serial.print((float)vitesse);
  Serial.println(" mm/s");
  delay(1000);

  
  detection=LOW;

  }




}

Est ce que quelq'un pourrait maintenant me venir en aide pour ce qui est de la matrice? J'aimerai afficher mon byte si la vitesse est supérieure à 50mm/s par exemple.
Merci de vos réponses

Armczbt:
Re j"'ai réussi à résoudre le problème...
..
Est ce que quelq'un pourrait maintenant me venir en aide pour ce qui est de la matrice? J'aimerai afficher mon byte si la vitesse est supérieure à 50mm/s par exemple.

Bonjour - montrez nous vos essais avec LedControl