Lire les entrées, commander les sorties et communiquer avec le matériel
Le langage C++ organise la logique du programme. L'environnement Arduino ajoute les fonctions
nécessaires pour lire un bouton ou un capteur, mesurer une tension, commander une LED,
produire un signal PWM, gérer le temps et échanger des informations par liaison série.
Un programme Arduino comporte obligatoirement deux fonctions principales :
void setup() { // Initialisation du système } void loop() { // Fonctionnement répété du système }
setup()La fonction setup() est exécutée une seule fois :
Elle permet notamment de :
void setup() { pinMode(8, OUTPUT); Serial.begin(9600); }
loop()
Après l'exécution de setup(), la carte exécute continuellement la fonction loop().
void loop() { // Lecture des entrées // Traitement des informations // Commande des sorties }
setup() initialise le système une seule fois. loop() contient le fonctionnement principal répété.
pinMode()Avant d'utiliser une broche numérique, il faut généralement préciser son rôle.
pinMode(broche, mode);
| Mode | Utilisation |
|---|---|
OUTPUT |
La broche est en sortie et commande un élément. |
INPUT |
La broche est en entrée et reçoit un signal numérique. |
INPUT_PULLUP |
La broche est en entrée et utilise une résistance interne de rappel forçant un niveau si elle est dans le « vide ». |
const byte LED_VERTE = 8; void setup() { pinMode(LED_VERTE, OUTPUT); }
La broche 8 pourra ensuite commander une LED, un relais ou l'entrée d'un autre circuit.
const byte BP_MARCHE = 2; void setup() { pinMode(BP_MARCHE, INPUT); }
pinMode(BP_MARCHE, INPUT_PULLUP);
Avec INPUT_PULLUP, le bouton est généralement connecté entre la broche et la masse (GND).
| État du bouton | Valeur électrique lue |
|---|---|
| Bouton relâché | HIGH |
| Bouton appuyé | LOW |
INPUT_PULLUP, la logique est inversée : un bouton appuyé est lu à l'état LOW.
digitalWrite()La fonction digitalWrite() place une broche numérique dans l'un des deux états logiques possibles.
digitalWrite(broche, etat);
| État | Signification |
|---|---|
HIGH |
Niveau logique haut |
LOW |
Niveau logique bas |
const byte LED_VERTE = 8; void setup() { pinMode(LED_VERTE, OUTPUT); } void loop() { digitalWrite(LED_VERTE, HIGH); }
Si la LED est câblée entre la broche et la masse, HIGH provoque son allumage.
digitalWrite(LED_VERTE, LOW);
digitalWrite(LED_VERTE, HIGH); digitalWrite(LED_ROUGE, LOW);
digitalRead()La fonction digitalRead() lit l'état logique d'une broche numérique.
digitalRead(broche);
La fonction renvoie soit HIGH, soit LOW.
bool etatBouton; etatBouton = digitalRead(BP_MARCHE);
La valeur retournée est enregistrée dans la variable etatBouton.
if (digitalRead(BP_MARCHE) == LOW) { digitalWrite(LED_VERTE, HIGH); } else { digitalWrite(LED_VERTE, LOW); }
Avec un bouton configuré en INPUT_PULLUP, la condition est vraie lorsque le bouton est appuyé.
const byte BP_MARCHE = 2; const byte LED_VERTE = 8; void setup() { pinMode(BP_MARCHE, INPUT_PULLUP); pinMode(LED_VERTE, OUTPUT); } void loop() { if (digitalRead(BP_MARCHE) == LOW) { digitalWrite(LED_VERTE, HIGH); } else { digitalWrite(LED_VERTE, LOW); } }
analogRead()Une entrée numérique ne reconnaît que deux états : HIGH ou LOW.
Une entrée analogique permet de mesurer une tension variable, par exemple celle produite par :
analogRead(broche);
int mesure; mesure = analogRead(A0);
Sur une Arduino Uno R3, la conversion analogique fournit une valeur entière comprise entre 0 et 1023.
| Tension approximative | Valeur obtenue |
|---|---|
| 0 V | 0 |
| 2,5 V | Environ 512 |
| 5 V | Environ 1023 |
const byte CAPTEUR = A0; int mesure = 0; void setup() { } void loop() { mesure = analogRead(CAPTEUR); }
analogWrite()La fonction analogWrite() permet notamment de faire varier :
analogWrite(broche, valeur);
Sur une Arduino Uno R3, la valeur est comprise entre 0 et 255.
| Valeur | Comportement |
|---|---|
0 | Sortie toujours à l'état bas |
128 | Rapport cyclique proche de 50 % |
255 | Sortie toujours à l'état haut |
HIGH et LOW.
const byte LED = 9; void setup() { pinMode(LED, OUTPUT); } void loop() { analogWrite(LED, 50); }
analogWrite(LED, 0); // LED éteinte analogWrite(LED, 64); // Faible luminosité analogWrite(LED, 128); // Luminosité moyenne analogWrite(LED, 255); // Luminosité maximale
delay()La fonction delay() suspend l'exécution du programme pendant une durée exprimée en millisecondes.
delay(duree);
| Valeur utilisée | Durée |
|---|---|
delay(1); | 1 ms |
delay(100); | 100 ms |
delay(1000); | 1 s |
delay(2000); | 2 s |
void loop() { digitalWrite(LED_VERTE, HIGH); delay(1000); digitalWrite(LED_VERTE, LOW); delay(1000); }
delay()Pendant l'exécution de delay(), le programme reste bloqué sur cette instruction.
delay(5000);
millis()La fonction millis() renvoie le nombre de millisecondes écoulées depuis le démarrage du programme.
millis();
La valeur est généralement enregistrée dans une variable de type unsigned long.
unsigned long tempsActuel; tempsActuel = millis();
const byte LED_VERTE = 8; bool etatLed = false; unsigned long ancienTemps = 0; const unsigned long PERIODE = 1000; void setup() { pinMode(LED_VERTE, OUTPUT); } void loop() { unsigned long tempsActuel = millis(); if (tempsActuel - ancienTemps >= PERIODE) { ancienTemps = tempsActuel; etatLed = !etatLed; digitalWrite(LED_VERTE, etatLed); } }
delay(), le programme peut continuer à lire des boutons ou à effectuer
d'autres traitements entre deux changements d'état de la LED.
La communication série permet d'échanger des informations entre la carte Arduino et l'ordinateur ou tout autre module possédant un bus UART : module Bluetooth, module GSM, module GPS, etc.
Elle est notamment utile pour :
void setup() { Serial.begin(9600); }
9600 représente le débit de transmission en bits par seconde (bps).
Le moniteur série — PuTTY, Tera Term, Arduino IDE, etc. — ou le module — GPS, GSM, Bluetooth, etc. —
doit être configuré avec le même débit.
Serial.print("Temperature : ");
La prochaine information est affichée sur la même ligne.
Serial.println("Systeme actif");
La prochaine information sera affichée sur une nouvelle ligne.
int mesure = analogRead(A0); Serial.print("Mesure : "); Serial.println(mesure);
const byte CAPTEUR = A0; void setup() { Serial.begin(9600); } void loop() { int mesure = analogRead(CAPTEUR); Serial.print("Valeur analogique : "); Serial.println(mesure); delay(500); }
digitalWrite(LED_VERTE, HIGH);
Il manque généralement :
pinMode(LED_VERTE, OUTPUT);
INPUT_PULLUPIncorrect :
if (digitalRead(BP_MARCHE) == HIGH) { // Le bouton est appuyé }
Avec un bouton relié à la masse, la bonne condition est :
if (digitalRead(BP_MARCHE) == LOW) { // Le bouton est appuyé }
analogWrite() sur une broche non PWManalogWrite(8, 128);
analogRead(A0);
Sert à effectuer une mesure.
analogWrite(9, 128);
Sert à produire un signal PWM.
| Fonction | Utilisation |
|---|---|
setup() | Initialiser le système |
loop() | Répéter le fonctionnement principal |
pinMode() | Configurer une broche |
digitalWrite() | Commander une sortie numérique |
digitalRead() | Lire une entrée numérique |
analogRead() | Lire une entrée analogique |
analogWrite() | Produire un signal PWM |
delay() | Créer une temporisation bloquante |
millis() | Mesurer le temps sans bloquer |
Serial.begin() | Initialiser la communication série |
Serial.print() | Afficher sans retour à la ligne |
Serial.println() | Afficher avec retour à la ligne |
pinMode()digitalRead()digitalWrite()HIGH et LOWanalogRead() : 0 à 1023analogWrite() : 0 à 255delay() bloque le programmemillis() permet de poursuivre les autres traitementsSerial.begin()Serial.print()Serial.println()