Compteur RPM à affichage LCD

Posted on Sep 21 -

Yopa !

Aujourd’hui et pour ne pas oublier, présentation du compte tours avec affichage LCD.

Alors ça compte les tours/minutes d’un ventilateur de PC équipé d’un capteur a effet hall.

Le but ultime étant de de régler le ralenti de ma voiture en collant un aimant sur la poulie, utiliser un capteur a effet hall et lire la vitesse de rotation en tour/min .

Synoptique de cablage (merci fritzing…), ouvrir l’image pour zoom.

Le code :

Note Importante : Je suis une grosse quiche en codage, j’ai donc compilé des exemples un peu partout sur le net, genre là ou là, merci d’être indulgent.

Si vous voyez des trucs débiles, ou si vous avez des ruses pour faire mieux, je prends… Enfin là tel quel, c’est tombé en marche

/*
* Effet hall Tachometer LCD display
*
* Uses hall effect sensor to implement a tachometer.
* A status LED is connected to pin 12.
* Pin 2 (interrupt 0) is connected across the hall effect sensor.
*
* 
*/

// include the library code:
#include 

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 1);

int statusPin = 8;             // Status LED connected to digital pin 8

volatile byte rpmcount;
volatile int status;

unsigned int rpm;
unsigned long timeold;
unsigned int unite;
unsigned int dizaine;
unsigned int centaine;
unsigned int millier;
unsigned int dmillier;

void setup()
{
//Serial.begin(9600);
attachInterrupt(0, rpm_fun, RISING);
  //Use statusPin to flash along with interrupts
pinMode(statusPin, OUTPUT);
    // set up the LCD’s number of rows and columns: 
lcd.begin(16, 2);
 // Print a message to the LCD.
lcd.print(“RPM”);
rpmcount = 0;
rpm = 0;
timeold = 0;
unite = 0;
dizaine = 0;
centaine = 0;
millier = 0;
dmillier = 0;
}
void loop()
{
if (rpmcount <= 20) {
 //Update RPM every 20 counts, increase this for better RPM resolution,
 //decrease for faster update
    detachInterrupt(0);
      //Note that this would be 60*1000/(millis() - timeold)*rpmcount if the interrupt
//happened once per revolution instead of twice. Other multiples could be used
//for multi-bladed propellers or fans
 rpm = 15*1000/(millis() - timeold)*rpmcount;
 timeold = millis();
 rpmcount = 0;
 unite = rpm%10;
 dizaine = (rpm%100)/10;
 centaine = (rpm%1000)/100;
 millier = (rpm%10000)/1000;
 dmillier = rpm/10000;
 //Serial.println(rpm,DEC);
  lcd.setCursor(1, 1);
  lcd.print(dmillier);
  lcd.setCursor(2, 1);
  lcd.print(millier);
  lcd.setCursor(3, 1);
  lcd.print(centaine);
  lcd.setCursor(4, 1);
  lcd.print(dizaine);
  lcd.setCursor(5, 1);
  lcd.print(unite);
    attachInterrupt(0, rpm_fun, RISING);
}
}
void rpm_fun()
{
rpmcount++;
//Each rotation, this interrupt function is run twice

//Toggle status LED 
if (status == LOW) {
 status = HIGH;
} else {
 status = LOW;
}
digitalWrite(statusPin, status);
}

(ça tourne vraiment, c’est une photo là…)

J’ai ajouté une mesure de fréquence au multimètre pour vérifier la valeur affichée (sur la led de status qui m’indique quand le capteur est activé) :

Sachant qu’il y a deux pulses par tour, 45 Hz affiché donne 22,5 tr/s soit 22,5×60=1350 tours/min… cool, j’affiche 1300

Other Posts