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
| #define interruptPin 2 // Pin de l'interrupt
volatile boolean mesureEnCours = false; // Volatile pour les variables traitées en interrupt
volatile boolean mesureNouvelle = false;
volatile unsigned long tempoDepart = millis();
volatile unsigned long topSyncMilliSec = millis();
int led = 13;
const unsigned int topSyncMinimum=800;
void setup()
{
Serial.begin(115200);
pinMode(interruptPin, INPUT_PULLUP);
pinMode(led, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite(led,LOW);
/*
comme on veut mesurer une impulsion négative (10001)
il y a 2 transitions à détecter
il faut mettre CHANGE comme déclenchement
*/
attachInterrupt(digitalPinToInterrupt(interruptPin), impulsionInterruption, CHANGE);
}
void loop()
{
if (mesureNouvelle == true)
{
Serial.print("\nImpulsion LOW ");
Serial.print(topSyncMilliSec);
Serial.println(" milliSec.");
topSyncAction();
mesureNouvelle = false;
}
}
void impulsionInterruption()
{
if (digitalRead(interruptPin) == LOW && !mesureEnCours) // Si transition HIGHlow et pas de mesure en cours
{
tempoDepart= millis();
mesureEnCours = true; // Mesure en cours
}
if (digitalRead(interruptPin) == HIGH && mesureEnCours) // Si transition lowHIGH et une mesure en cours
{
topSyncMilliSec = millis()-tempoDepart;
mesureEnCours = false; // Plus de mesure en cours
mesureNouvelle = true;
}
}
void topSyncAction()
{
if (topSyncMilliSec >= topSyncMinimum)
{ // si plus de 800 ms sans interrupt, led allumée 50 ms
Serial.println("Top sync.");
digitalWrite(led,HIGH);
delay(50); // calibrage niveau haut
digitalWrite (led,LOW);
}
else
{
Serial.print("Parasite ");
Serial.print(topSyncMilliSec);
Serial.println(" milliSec.");
digitalWrite(led,LOW);
}
} |
Partager