Lionel's Tetalab & Co WIP

23/09/2009

Compteur RPM à affichage LCD (la revanche)

Filed under: Arduino, RPM Meter — Tags: , , , , , — lionel @ 10:17

Fabrice, mon ami d’en face, a suggéré une épuration du code a base de ruse de renard.

C’est plus clean, y’a plus de calcul de modulo dans le loop, c’est mieux. Je mets a jour. J’ai commenté le code, ça devrait se lire.

A noter qu’on pourrait cabler le LCD différement pour libèrer la sortie digitale 1 et ainsi écrire la valeur en même temps sur le port série. J’ai essayé, ça marche…

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

// include the library code:
#include <LiquidCrystal.h>

// initialize the lcd 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;

 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);
      // Shift display 1 character to the left 
  lcd.scrollDisplayLeft();
      // initial values
   rpmcount = 0;
   rpm = 0;

 }
 void loop()
 {
   if (rpmcount >= 20) {
     //Update RPM every 20 counts, increase this for better RPM resolution,
     //decrease for faster update
     //detach interrupt during calculation
        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
    //To keep the rpm value 4 digits long, I add 10000 to the rpm value and hide 
    //the first digit using lcd.scrollDisplayLeft() in setup()
    //Nice trick from sack ;)  thx !
     rpm = 10000 + 15*1000/(millis() - timeold)*rpmcount;
     timeold = millis();
     rpmcount = 0;
      //print rpm value on LCD
// Serial.println((rpm-10000),DEC);
       lcd.setCursor(0,1);
       lcd.print(rpm);
       lcd.setCursor(6,1);
       lcd.print("RPM");
      //detach interrupt during calculation
      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);
 }

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress