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 sackthx ! 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); }