Contrôler les pins GPIO (Entrées/Sorties)
(Mis à jour le 10/10/2022)
Les fonctions à utiliser sont les mêmes qu’avec une Arduino. On utilise donc la fonction pinMode()
pour configurer un pin en entrée ou en sortie numérique, la fonction digitalWrite()
pour imposer une tension de 0V ou 3.3V en sortie et la fonction digitalRead()
pour lire un niveau logique (soit 0V ou 3.3V) en entrée.
Note
Les numéros des pins sont ceux indiqués dans l’encart gris « GPIO » sur le pinout de la carte. Même s’il existe une correspondance entre le numéro des pins GPIO de l’ESP32 et ceux habituellement utilisés sur l’Arduino, il est préférable pour éviter de s’emmêler les pinceaux de ne pas les utiliser et d’utiliser exclusivement le numéro des pins natifs de l’ESP32. Il faut donc éviter d’utiliser A0, MOSI, SCK, SDA…
Configuration des pins en entrée ou en sortie
-
Configuration du pin GPIO2 en sortie :
pinMode(2, OUTPUT);
-
Configuration du pin GPIO15 en entrée :
pinMode(15, INPUT);
Rappel sur les résistances pullup et pulldown :
Si l’on mesure une tension d’un pin qui n’est relié ni à la masse ni à une tension non nulle, alors la valeur mesurée est aléatoire. Cela est dû au bruit électrique généré par plusieurs facteurs (le fil se comporte notamment comme une antenne). L’exemple le plus concret est lorsque l’on utilise un bouton-poussoir.
Deux méthodes permettent d’éliminer le bruit et d’avoir des mesures fiables :
-
Résistance Pullup
Ce circuit permet de n’avoir que 2 tensions possibles : 0V quand on appuie sur le bouton sinon +3.3V
Quand l’interrupteur est ouvert (bouton relâché), le +3.3V nourrit le pin de l’ESP32, la valeur mesurée du pin donnera HIGH (ou 1).
Lorsque l’interrupteur est fermé (bouton pressé), le +3.3V et le pin sont absorbés par la masse, la mesure du pin donnera LOW (ou 0).
-
Résistance Pulldown
Ce circuit permet de n’avoir que 2 tensions possibles : +3.3V quand on appuie sur le bouton sinon 0V
Si le bouton-poussoir est pressé, le courant va du +3.3V au pin de l’ESP32. Il ne prendra pas le chemin de la masse car le courant circule toujours par le chemin le moins résistif. Le pin de l’ESP32 recevra du +3.3V et indiquera HIGH (ou 1).
Si le bouton-poussoir est lâché, le circuit est ouvert. Le très faible courant résiduel sera absorbé par la masse, le pin sera donc bien en LOW (ou 0).
Tous les pins GPIO (sauf les pins GPIO36, GPIO39, GPIO34, GPIO35) ont ces 2 circuits « en miniature », en interne dans l’ESP32.
Utiliser les résistances pullup et pulldown interne de l’ESP32
-
Configuration du pin GPIO15 en entrée avec la résistance pullup interne :
pinMode(15, INPUT_PULLUP);
-
Configuration du pin GPIO15 en entrée avec la résistance pulldown interne :
pinMode(15, INPUT_PULLDOWN);
Note
Contrairement à l’Arduino, sur les ESP32 il y a des résistances pulldown internes en plus.
Imposer ou lire une tension
-
Pour imposer une tension de 3.3V en sortie du pin 2 de l’ESP32 :
pinMode(2, OUTPUT); //Il faut déclarer le pin en sortie digitalWrite(2, HIGH)
Note
La tension en sortie des pins est de 3.3V (et non pas de 5V comme sur Arduino)
-
Pour lire une tension d’un niveau logique de 0V ou 3.3V en entrée du pin 15 de l’ESP32 :
pinMode(15, INPUT); //Il faut déclarer le pin en entrée digitalRead(15);
Mini-Projet : Contrôler une LED avec un bouton
Pour montrer comment utiliser les entrées / sorties numériques de l’ESP32, nous allons faire un projet très simple qui allume la LED lorsque l’on appuie sur un bouton.
Schéma électrique
On va utiliser les résistances pullup internes pour simplifier le schéma électrique
Avertissement
Pensez à bien enfoncer le bouton-poussoir dans la breadboard
Code pour allumer la LED lorsque le bouton est pressé
Solution
const int buttonPin = 32;
const int ledPin = 23;
// Etat du bouton poussoir
int buttonState = 0;
void setup() {
Serial.begin(115200);
//Configuration du pin en entrée pullup
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
Serial.println(buttonState);
if (buttonState == LOW) {
// Allume la led
digitalWrite(ledPin, HIGH);
} else {
// Eteins la led
digitalWrite(ledPin, LOW);
}
}