Académique Documents
Professionnel Documents
Culture Documents
a) Principe
Dans les parties précédentes , la lecture d'un changement d'état se faisait en comparant
régulièrement l'état du bouton à un moment avec son état précédent. Cette méthode
fonctionne bien, mais pose un problème : l'appui ne peut pas être détecté s'il est trop
court. Autre situation, si l'utilisateur fait un appui très long, mais que vous êtes déjà dans
un traitement très long , le temps de réponse à l'appui ne sera pas du tout optimal. Pour
pallier ce genre de problème, les constructeurs de microcontrôleurs ont mis en place des
systèmes qui permettent de détecter des évènements et d’exécuter des fonctions dès la
détection de ces derniers. Par exemple, lorsqu'un pilote d'avion de chasse demande au
siège de s'éjecter, le siège doit réagir au moment de l'appui, pas une minute plus tard
(trop tard).
une interruption du programme est générée lors d'un événement attendu. Ceci
dans le but d'effectuer une tâche, puis de reprendre l'exécution du programme.
Arduino propose aussi ce genre de gestion d’évènements. On les retrouvera sur certaines
broches, sur des timers, des liaisons de communication, etc.
b) Mise en place
Nous allons illustrer ce mécanisme avec ce qui nous concerne ici, les boutons. Dans le cas
d'une carte Arduino UNO, on trouve deux broches pour gérer des interruptions externes
(qui ne sont pas dues au programme lui-même), la 2 et la 3. Pour déclencher une
interruption, plusieurs cas de figure sont possibles :
Autrement dit, s'il y a un changement d'un type énuméré au-dessus, alors le programme
1/10
sera interrompu pour effectuer une action.
Comme d'habitude, nous allons commencer par faire des réglages dans la fonction
setup(). La fonction importante à utiliser est attachInterrupt(interrupt, function, mode) .
Elle accepte trois paramètres :
Si l'on veut appeler une fonction nommée Reagir() lorsque l'utilisateur appuie sur un
bouton branché sur la broche 2 on fera :
attachInterrupt(0, Reagir, FALLING);
Ensuite, il vous suffit de coder votre fonction Reagir() un peu plus loin.
Attention, cette fonction ne peut pas prendre d'argument et ne retournera aucun résultat.
Mise en garde
Tout d'abord, les interruptions ne sont pas une solution miracle. En effet, gardez
bien en tête que leur utilisation répond à un besoin justifié. Elles mettent tout votre
programme en pause, et une mauvaise programmation peut entraîner une altération de
l'état de vos variables. De plus, les fonctions delay() et millis() n'auront pas un
comportement correct. En effet, pendant ce temps le programme principal est
complètement stoppé, donc les fonctions gérant le temps ne fonctionneront plus, elles
seront aussi en pause et laisseront la priorité à la fonction d'interruption.
La fonction delay() est donc désactivée et la valeur retournée par millis() ne changera
pas. Justifiez donc votre choix avant d'utiliser les interruptions.
2) Afficheur 7 segments
2/10
Ces 7 led sont toutes reliées soit par leur anode, soit par leur cathode. Voici les 2 schémas de
principe
L'électrode libre peut être reliée à des broches d'Arduino par une résistance mais généralement on
utilise un circuit spécialisé (décodeur) qui sélectionne les led en fonction du chiffre souhaité.
3. Capteur DHT22
Le capteur DHT22 est une des sondes les plus classiques lorsque l’on souhaite mesurer une
température avec un minimum de fiabilité. Évitez d’utiliser la DHT11 qui ne vaut pas le coup même
si elle est moins chère. Elle est moins précise, et ne prend pas les températures négative. A éviter
donc !
DHT22 a elle les spécifications suivantes :
•Entre 3 et 5V en entrée
3/10
Montage
La sonde possède 4 pattes, mais la 3 ème ne nous sert pas. On relie donc les pattes de la manière
suivante :
1.Vers l’alimentation 3,3 Volts
2.Vers un pin de donnée
3.On laisse vide
4.Vers un pin GRD
il faut mettre une résistance de 4700 Ohm à la broche 2 et la relier ensuite à l’alimentation. Voila,
montage terminé, c’est on ne peut plus simple.
Le code
Il faut installer la bibliothèque dans votre IDE arduino, en utilisant le fichier zip fourni par
l'enseignant et modifier l'exemple fourni avec la bibliothèque , pour préciser le numéro de pin sur
lequel est connecté le capteur. Voici le programme exemple contenu dans la bibliotheque dht
#include "DHT.h"
#define DHTPIN 2 // what pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");
dht.begin();
void loop() {
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow
sensor)
float h = dht.readHumidity();
4/10
float t = dht.readTemperature();
// check if returns are valid, if they are NaN (not a number) then
something went wrong!
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
}
1. Sorties/Entrees numériques
On appelle numériques des bornes de la plaquette qui fonctionnent en "tout ou rien", c'est à dire 0
ou 5 volts.
en entrée : il faut leur fournir
- soit une tension comprise entre 2,5 et 5 volts et elle est alors reconnue comme niveau 1
- soit moins de 0,8 volt et elle est alors reconnu comme niveau 0
sinon le résultat est incertain
en sortie : pas de problème, Arduino fournit 0 ou 5 volts.
Application : faire un montage en 2 étapes
- d'abord une Led qui clignote
- ensuite on ajoutera une autre qui s'allume quand on appuie sur un bouton.
5/10
Rappel: repérages d'une led, La cathode (borne moins) d'une diode est la plus courte.
exemple de leds
Arduino est sécurisé : chaque sortie est limitée à 20 mA. Ce n'est pas une raison pour faire n'importe
quoi. Nous ne brancherons pas les leds directement sur les broches mais par l'intermédiaire d'une
résistance.
Nous mettons l'anode d'une led sur la borne digitale 2. la cathode est reliée à la masse par une
résistance.
Programme blink
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // éclaire la LED
delay(1000); // attend 1 seconde
digitalWrite(13, LOW); // éteint la LED
delay(1000); // attend 1 seconde
6/10
voici le programme
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // éclaire la LED
delay(1000); // attend 1 seconde
digitalWrite(13, LOW); // éteint la LED
delay(1000); // attend 1 seconde
// 2ème partie du programme (led 3 et bouton)
etatBouton = digitalRead(4);
// Serial.print(etatBouton); // pendant les essais
digitalWrite(3, etatBouton);
}
2) Entrées analogiques
Nous connaissons les entrées digitales qui valent soit 0 (0 volt) soit 1 (5 volts). Nous allons voir
l'autre type d'entrées, celles qui varient progressivent entre 0 et 5 volts. La tension présente sur une
broche analogique est lue par Arduino avec une précision sur 10 bits. Puisque 2 à la puissance 10
vaut 1024, on lit un nombre entre 0 et 1023.
Montage
On relie le curseur d'un potentiomètre à la borne analogique A0 d'Arduino. Les 2 autres broches du
potentiomètre sont reliées au +5 et à la masse.
Lorsqu'on varie la position du curseur, la chutte de tension entre la borne c et la masse varie, c'est
cette tension qui doit être lue par arduino et affichée dans le moniteur série
Programme
on écrit un programme arduino qui affiche sur le moniteur série la valeur lue sur l'entree analogique
A0 et la tension correspondante à cette valeur.
// le potentiomètre, branché sur la broche analogique 0, il n'est pas
//nécssaire de la configurer en entree
const int entreeAna = 0;
int valeurLue;
//on convertit cette valeur en une tension
float tension;
7/10
void setup(){
Serial.begin(9600);
void loop() {
//on convertit en nombre binaire la tension lue en sortie du
potentiomètre
valeurLue = analogRead(entreeAna);
//on traduit la valeur brute en tension
tension = valeurLue * 5.0 / 1023;
//on affiche la valeur lue sur la liaison série
Serial.print("valeurLue = "); Serial.println(valeurLue);
//on affiche la tension calculée
Serial.print("Tension = "); Serial.print(tension,2);
Serial.println(" V");
//on saute une ligne entre deux affichages
Serial.println();
//on attend une demiseconde pour que l'affichage ne soit pas rapide
delay(500);
Rq:
Pour convertir une valeur lue sur une entree analogique en une tension, on peut utiliser la fonction
arduino map
int valeurLue=analogRead(A0); //lit la valeur de l'entree analogique A0
int tension = map(valeurLue, 0, 1023, 0, 5000); //conversion de la valeur
lue en tension en mV
8/10
3) Sorties Analogiques ou PWM
On veut une sortie analogique, c'est-à-dire pouvant prendre des valeurs intermédiaires entre 0 et
5V.
Arduino ne délivre que 0 ou +5, mais peut aussi envoyer des créneaux 0V/5V dont on peut choisir
le rapport cyclique
exemple : si le niveau est haut 80% du temps, on aura une moyenne de 4 volts.
Le programme écrit sur une sortie PWM une valeur comprise entre 0 et 255 (rappel : 255 est le plus
grand nombre qu'on peut écrire dans un octet).
Ce nombre va être transformé par le compilateur Arduino en un rapport cyclique de 0% à 100% . La
commande est analogWrite( pin, valeur)
Le montage
On met une LED sur la sortie PWM n°2, avec cathode reliée à la masse par une résistance. Le
programme va faire varier progressivement le rapport cyclique de la sortie 2. On verra encore mieux
si on ajoute un voltmètre entre la sortie 2 et la masse.
On fera varier de 0 à 255 la valeur envoyée à la LED, en s'arrêtant 20 ms sur chaque valeur. Et on
variera ensuite en sens inverse
Le code
/* variations de l'intensité d'éclairage d'une led */
int sortie;
void setup() {
pinMode(2, OUTPUT);
9/10
}
void loop() {
for ( sortie = 0 ; sortie < 256 ; sortie++) {
analogWrite(2, sortie);
delay(20);
}
delay (500);
for ( sortie = 255 ; sortie >= 0 ; sortie) {
analogWrite(2, sortie);
delay(20);
}
delay (500);
}
10/10