vitesse

bonjour, je veut un programme qui permet d'afficher le vitesse de rotation en tour par min sur un afficheur lcd , comme entre j'ai des impulsion grâce a un capteur de vitesse(fourche optique) et comme sortie j un afficheur , le problème : au qu'une indication sur l'afficher :cry: :disappointed_relieved: et merci d’avance

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 6, 5, 4, 2);
// Pins utilisées
const int fourchePin = A0;     //Sortie de la fourche
int nbImpulsion = 0;


volatile long comptageImpuls=0; // variable accessible dans la routine interruption externe 0
long timeRef=0; // variable pour temps de référence en millisecondes
long delai=1000;


int comptageDUneImpulsion(){
   return nbImpulsion++;
}
void setup() {
    
  lcd.begin(20, 4);
    pinMode(fourchePin, INPUT);  //en entrée
 // attachInterrupt(0, comptageDUneImpulsion, CHANGE);
timeRef=millis(); // initialisation de la référence du comptage 

}
void loop() {
  nbImpulsion = analogRead(fourchePin);
   
   if (millis()>(timeRef+delai)) { // si le delai de comptage est écoulé

  timeRef=timeRef+delai;

  lcd.setCursor(0, 0);
    lcd.print("Vitesse ="), lcd.println(comptageDUneImpulsion()); // affiche nombre tours/sec

}
 

}

Il compile ton code ? Moi je vois une erreur ...

T'as essayé les programmes exemples de la librairie LCD pour voir si ton lcd fonctionne et s'il est bien branché ?

svp je ne peut pas afficher le vitesse sur l'ecran je sais pas ou la faute :angry: et merciii pour ta reponce :slight_smile:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int tours=1;
//int comptage=0;
int comptageImpuls=0; // variable accessible dans la routine interruption externe 0
int nbImpulsion ;

const byte Entree_mesuree = 0; // Entrée analogique 0 utilisée.
void gestionINT0() {// la fonction appelée par l'interruption externe n°0

comptageImpuls++;//=comptageImpuls+1; // incrémente comptage Impulsion
tours=comptageImpuls;
if (comptageImpuls/(tours*10)==1)
{
tours++;
}
}
void setup(){
    lcd.begin(20, 4);
  attachInterrupt(0, gestionINT0, RISING);
}
void loop(){
  nbImpulsion=comptageImpuls;
  delay(1000);
  nbImpulsion=comptageImpuls-nbImpulsion;
    lcd.setCursor(0,0);
    lcd.print("Vitesse ="), lcd.print(nbImpulsion); // affiche nombre tours/sec
    lcd.setCursor(4,10);
    lcd.print("metrage ="), lcd.print(tours*0.36);
}

Tu n'as pas répondu à ma question ... alors c'est difficile de t'aider !

T'as essayé les programmes exemples de la librairie LCD pour voir si ton lcd fonctionne et s'il est bien branché ?

Etrangement ton code compile alors que tu as mis une virgule entre 2 instructions

lcd.print("Vitesse ="), lcd.print(nbImpulsion); // affiche nombre tours/sec
  lcd.setCursor(4, 10);
  lcd.print("metrage ="), lcd.print(tours * 0.36);


//en principe c'est:
lcd.print("Vitesse ="); lcd.print(nbImpulsion); // affiche nombre tours/sec
  lcd.setCursor(4, 10);
  lcd.print("metrage ="); lcd.print(tours * 0.36);

Ensuite sur le mode de calcul ... si j'ai bien deviné, tu as 10 impulsions par tour ... sauf que dans ta fonction d'interruption gestionINT0() tu fais d'abord
tours = comptageImpuls;

et après, si le test est vrai tu fais tours++; ... ce n'est pas cohérent

à mon avis tu devrait faire comme ça

void gestionINT0() {// la fonction appelée par l'interruption externe n°0
  comptageImpuls++;//=comptageImpuls+1; // incrémente comptage Impulsion
 
  if (comptageImpuls % 10 == 0) //c'est vrai toutes les 10 impulsions (comptageImpuls =0 10 ou 20 ou 30 ....)
  {
    tours++;
  }


}

merci pour votre aide ,cv le metrage sa marche mais le vitesse reste a 0 j sais pas l'erreur :roll_eyes:

ton nouveau code stp

Bonjour,
v = dx/dt
Si dx est bon alors il faut que tu regarde pourquoi tu n'as pas le dt.
dt = temps au début du calcul de dx - temps à la fin du calcul de dx.
@+
:grin:

comme quoi, tous les jours on apprend des choses !

merci pepe pour l'info

+1

c sa et merci d'avance
:slight_smile:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int tours=1;
//int comptage=0;
int comptageImpuls=0; // variable accessible dans la routine interruption externe 0
int nbImpulsion1=0 ;
int nbImpulsion;
const byte Entree_mesuree = 0; // Entrée analogique

void gestionINT0() {// la fonction appelée par l'interruption externe n°0
  comptageImpuls++;//=comptageImpuls+1; // incrémente comptage Impulsion
 
  if (comptageImpuls % 10 == 0) //c'est vrai toutes les 10 impulsions (comptageImpuls =0 10 ou 20 ou 30 ....)
  {
    tours++;
  }


}
void setup(){
    lcd.begin(20, 4);
  attachInterrupt(0, gestionINT0, RISING);
}
void loop()
{
  nbImpulsion1=comptageImpuls;
  delay(1000);
  nbImpulsion=comptageImpuls-nbImpulsion1;
    lcd.setCursor(0,0);
    lcd.print("Vitesse ="); lcd.print(nbImpulsion); // affiche nombre tours/sec
    lcd.setCursor(4,10);
    lcd.print("metrage ="); lcd.print(tours*0.36);
}

je ne comprends pas ce que tu veux ...

tu as des impulsions, 10 impulsions de donnent 1 tour (c'est juste ça ?) ... 1 tour de donne une distance (métrage)

tu veux la vitesse de quoi ?
vitesse de rotation = nbde tours / temps (nb de tour à réinitialiser ...)
mais aussi,
vitesse de rotation = nbImplusion1 * 0.1 .... en tours par seconde puisque que tu recales ton compteur nbImplusion1 toutes les secondes, que 10 impuls donnent 1 tour, donc tu as des tours / seconde directement (je fais *0.1 au lieu de diviser par 10, comme ça tu peut avoir une vitesse < 1 tour)

vitesse linéaire = metrage / temps ... avec metrage = 0.36*tours

tu dois pouvoir t'en sortir tout seul en exprimant correctement tes besoins

oui , c sa j'ai 10 impulsion == 1 tours
la roue est liée avec une rouleau mesureur , je veut affiche la vitesse de rotation de cette rouleau , juste je veut faire l'affichage car la rouleau est liée avec le moteur

donc la vitesse que tu veux afficher est

float vitesse = nbImplusion1 * 0.1;

svp tu peut m'envoyer tous le programme si vous voulez ! :-[

tu as de la chance, je suis dans un bon jour ...

mais il faut que tu lises des docs de ta carte ... les interruptions ont des n° qui ne correspondent pas aux numéros des pins ... sur la UNO, l'interruption 0 utilise la pin 2, la n°1 est sur la 3 ... c'est la vie

donc tu auras des soucis avec ton LCD qui utilise les broches 2 3 4 5 ... il y a du recablage dans l'air (celles du LCD)

il faut que tu testes toi même ce que tu fais ... en faisant clignoter la led intégrée, ou via les console série ... tu apprendras plus vite

#include <LiquidCrystal.h>

const byte Entree_mesuree = 2; // ATTENTION, l'interruption n°0 utilise la pin 2 ... il faut lire la doc
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //ca va coincer ici !

//int tours = 1; inutile
//int comptage=0;
//les variables que l'on modifie dans une interruption doivent être en volatile
volatile unsigned long comptageImpuls = 0; // variable accessible dans la routine interruption externe 0, et int est limité à 32000, mieux vaut passer en unsigned long
//int nbImpulsion1 = 0 ; inutile
int nbImpulsion;    //nb d'impulsions en une seconde    



void gestionINT0() {// la fonction appelée par l'interruption externe n°0
  comptageImpuls++;//=comptageImpuls+1; // incrémente comptage Impulsion

  /* inutile ca ...
  if (comptageImpuls % 10 == 0) //c'est vrai toutes les 10 impulsions (comptageImpuls =0 10 ou 20 ou 30 ....)
  {
    tours++;
  }
  */

}

void setup() {
  lcd.begin(20, 4);
  attachInterrupt(0, gestionINT0, RISING);
}

void loop()
{
  nbImpulsion = comptageImpuls; //initialisation du compteur partiel
  delay(1000);
  nbImpulsion = comptageImpuls - nbImpulsion; //calcul impulsion depuis la derniere seconde
  float vitesserotation = nbImpulsion * 0.1;        //nombre de tr dans la dernière seconde
  lcd.setCursor(0, 0);
  lcd.print("Vitesse ="); lcd.print(vitesserotation,1); // affiche nombre tours/sec au format xy.z
  lcd.setCursor(4, 10);
  lcd.print("metrage ="); lcd.print(comptageImpuls * 0.1 * 0.36); 
}

dacor , merci bien de ton aide :wink: