1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
#include <LiquidCrystal_I2C.h>
const byte nombreAppareils = 3;
const long vitesseFaible = 1999;
const long vitesseHaute = 2000;
unsigned long tempsPrecedent;
struct Appareil {
const byte id;
const char* message;
LiquidCrystal_I2C lcd;
const byte pinLedRouge;
const byte pinLedVerte;
const byte pinLedBleue;
void (*ISR)();
};
volatile long compteurs[nombreAppareils];
void impulsion0() {compteurs[0]++;}
void impulsion1() {compteurs[1]++;}
void impulsion2() {compteurs[2]++;}
Appareil lesAppareils[nombreAppareils] = {
// id, lcd, Sensor, GLed, RLed, Relais, ISR
{0, "V fourche 3", {0x25, 16, 2}, 18, 11, 12, 13, impulsion0},
{1, "V fourche 2", {0x26, 16, 2}, 3, 8, 9, 10, impulsion1},
{2, "V fourche 1", {0x27, 16, 2}, 2, 5, 6, 7, impulsion2},
};
void setup () {
for (auto && unAppareil : lesAppareils) {
pinMode(unAppareil.pinCapteur, INPUT );
pinMode(unAppareil.pinLedVerte, OUTPUT);
pinMode(unAppareil.pinLedRouge, OUTPUT);
pinMode(unAppareil.pinLedBleue, OUTPUT);
unAppareil.lcd.init();
unAppareil.lcd.backlight();
unAppareil.lcd.setCursor(0, 0);
unAppareil.lcd.print(unAppareil.message);
attachInterrupt(digitalPinToInterrupt(unAppareil.pinCapteur), unAppareil.ISR, RISING);
}
}
void rouge(Appareil& selection) {
digitalWrite(selection.pinLedRouge, HIGH);
digitalWrite(selection.pinLedVerte, LOW);
digitalWrite(selection.pinLedBleue, LOW);
}
void vert(Appareil& selection) {
digitalWrite(selection.pinLedRouge, LOW);
digitalWrite(selection.pinLedVerte, HIGH);
digitalWrite(selection.pinLedBleue, LOW);
}
void bleu(Appareil& selection) {
digitalWrite(selection.pinLedRouge, LOW);
digitalWrite(selection.pinLedVerte, LOW);
digitalWrite(selection.pinLedBleue, HIGH);
}
void loop () {
unsigned long maintenant = millis();
if (maintenant - tempsPrecedent >= 2000ul) { // effectuer la mise à jour de l'affichage
tempsPrecedent = maintenant;
for (auto && unAppareil : lesAppareils) {
// attention on ne peut pas toucher à une variable volatile de plusieurs octets de manière atomique
// section critique
noInterrupts();
long cntCopie = compteurs[unAppareil.id];
compteurs[unAppareil.id] = 0;
interrupts();
long rpm = cntCopie * 30;
unAppareil.lcd.setCursor(6, 1);
unAppareil.lcd.print(rpm); unAppareil.lcd.print(F(" RPM "));
/* digitalWrite(unAppareil.pinLedVerte, (rpm > vitesseFaible) ? HIGH : LOW);
digitalWrite(unAppareil.pinLedRouge, (rpm > vitesseHaute) ? HIGH : LOW);
digitalWrite(unAppareil.pinRelai, (rpm > vitesseHaute) ? HIGH : LOW);*/
if (rpm <= 0) rouge(unAppareil);
else
if (rpm < vitesseHaute) bleu(unAppareil);
else vert(unAppareil);
}
}
} |
Partager