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 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
}
}
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++;
}
}
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.
@+
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
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);
}