Table des matières

Sommaire Arduino

Les entrées, sorties numériques

[Mise à jour le 26/4/2021]

3. Programmation

3.5 Temporisations

3.5.1 Temporisation bloquante
*.cpp
// Le code met le programme en pause pendant une seconde avant de faire basculer l'état logique de la broche.
 
int ledPin = 13;              // LED connected to digital pin 13
 
void setup() {
  pinMode(ledPin, OUTPUT);    // sets the digital pin as output
}
 
void loop() {
  digitalWrite(ledPin, HIGH); // sets the LED on
  delay(1000);                // waits for a second
  digitalWrite(ledPin, LOW);  // sets the LED off
  delay(1000);                // waits for a second
}
*.cpp
// Le code configure la broche numéro 8 en sortie. 
// Il envoie un train d'impulsions d'une période d'environ 100 microsecondes. 
// L'approximation est due à l'exécution des autres instructions.
 
int outPin = 8;               // digital pin 8
 
void setup() {
  pinMode(outPin, OUTPUT);    // sets the digital pin as output
}
 
void loop() {
  digitalWrite(outPin, HIGH); // sets the pin on
  delayMicroseconds(50);      // pauses for 50 microseconds
  digitalWrite(outPin, LOW);  // sets the pin off
  delayMicroseconds(50);      // pauses for 50 microseconds
}
3.5.2 Temporisation non bloquante
millis() renvoie le nombre de millisecondes écoulées depuis que la carte Arduino a commencé à exécuter le programme. Ce nombre va déborder (revenir à zéro), après environ 50 jours.
*.cpp
// Répétition d'un bloc de code tous les intervalles de temps sans bloquer le programme
unsigned long previousMillis = 0;  // Mémorise le temps écoulé depuis la dernière mesure
const long interval = 1000;        // Durée non bloquante souhaitée
 
void setup() {
  // Le contenu de setup dépend de l'application
}
 
void loop() {
  // Mesure du temps écoulé depuis que le programme s'exécute
  unsigned long currentMillis = millis();
 
  // Si l'attente souhaitée est atteinte on exécute le bloc de code
  if (currentMillis - previousMillis >= interval) {
    // la mesure de temps actuelle devient la dernière mesure 
    previousMillis = currentMillis;
    //
    // Bloc de code à exécuter tous les intervalles de temps
    //
  }
  //
  // sinon d'autres actions sont possibles
  //
}
 
micros() renvoie le nombre de microsecondes depuis que la carte Arduino a commencé à exécuter le programme. Ce nombre va déborder (revenir à zéro), après environ 70 minutes. Sur les cartes Arduino 16 MHz (par exemple Duemilanove et Nano), cette fonction a une résolution de quatre microsecondes (c'est-à-dire que la valeur renvoyée est toujours un multiple de quatre).
*.cpp
unsigned long time;
 
void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.print("Time: ");
  time = micros();
 
  Serial.println(time); 
  delay(1000);          
}

3.6 Interruption

3.6.1 Attacher une interruption
*.cpp
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) 
*.cpp
// Le front montant du signal présent sur la broche 3 de la carte Arduino Uno
// déclenche l'exécution du sous-programme blink
 
const byte ledPin = 11; // O0 du shield Tinkerkit
const byte interruptPin = 3; // O5 du shield Tinkerkit
volatile byte state = LOW;
 
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}
 
void loop() {
  digitalWrite(ledPin, state);
}
 
void blink() {
  state = !state;
}

VSCode & PlatformIO

Le projet PlatformIO pour l'IDE VSCode de l'exemple ci-dessus est téléchargeable ici

3.6.2 Détacher une interruption

La fonction detachInterrupt() désactive l'interruption donnée.

*.cpp
detachInterrupt(digitalPinToInterrupt(pin))