[[arduino:accueilarduino|{{ :iconemaison.jpg?nolink&30|Sommaire Arduino}}]] ===== Les entrées, sorties numériques ===== [Mise à jour le 26/4/2021] {{ :arduino:arduino.png?nolink&100|}} ==== 3. Programmation ==== === 3.5 Temporisations === * **Sources** : delay, delayMicroseconds, micros et millis sur le site arduino. == 3.5.1 Temporisation bloquante== * de **n millisecondes** avec la fonction : //void **delay**(int millisecondes)// // 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 } * de **n microsecondes** avec la fonction : //void **delayMicroseconds**(int microsecondes)// (Erreur = +/-3µs) // 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 == * **Temps écoulé**, en **millisecondes**, depuis le démarrage du programme avec la fonction : // unsigned long **millis**()// **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. * // Structure d'une temporisation non bloquante // // 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 // } * **Temps écoulé**, en **microsecondes**, depuis le démarrage du programme avec la fonction : // unsigned long **micros**()// **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). 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 == * **Source** : attachinterrupt sur le site Arduino. * **Syntaxe** attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) * **ISR** : gestionnaire d'interruption à appeler lorsque l'interruption se produit * **pin** : broche de la carte (concernée par l'interruption) * **mode** : définit le moment de déclenchement de l'interruption \\ * **Paramètres** * **LOW** déclenche l'interruption chaque fois que la broche est à l'état bas, * **CHANGE** déclenche l'interruption chaque fois que la broche change de valeur, * **RISING** déclenche l'interruption sur un front montant, * **FALLING** déclenche l'interruption sur un front descendant. * //Exemple// // 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; } {{ :arduino:uc:platformioico.png?50|VSCode & PlatformIO}} Le projet **PlatformIO** pour l'IDE **VSCode** de l'exemple ci-dessus est téléchargeable [[https://webge.fr/doc/wikis/code/Arduino/ARD_Uno_Interruption.zip|ici]] === 3.6.2 Détacher une interruption === La fonction //detachInterrupt()// désactive l'interruption donnée. * **Source** : detachInterrupt sur le site Arduino. * **Syntaxe** detachInterrupt(digitalPinToInterrupt(pin))