M7 : modes Wi-Fi, requête HTTP. M8 : échanges navigateur/serveur, HTTP vs WebSocket. M9 : modèle GATT, session BLE. Diagrammes de séquence plus lisibles (étiquettes sur fond blanc, boîtes à la largeur du nom). Gabarit : figures pleine largeur par défaut. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
162 lines
5.3 KiB
Plaintext
162 lines
5.3 KiB
Plaintext
---
|
|
title: "Module 7 — Wi-Fi : station, point d'accès et client HTTP"
|
|
---
|
|
|
|
## Objectifs du module
|
|
|
|
- Comprendre les deux modes de fonctionnement Wi-Fi de l'ESP32-S3 : station (STA) et point d'accès (AP).
|
|
- Connecter la carte à un réseau Wi-Fi existant.
|
|
- Créer son propre point d'accès Wi-Fi depuis la carte.
|
|
- Réaliser une requête HTTP GET vers une API externe et exploiter la réponse JSON.
|
|
|
|
## 1. Les modes Wi-Fi de l'ESP32-S3
|
|
|
|
| Mode | Rôle | Usage typique |
|
|
|-------------------------|----------------------------------------|----------------------------------------|
|
|
| `WIFI_STA` (Station) | La carte se connecte à un routeur/box existant | Envoyer des données sur Internet, rejoindre le réseau local |
|
|
| `WIFI_AP` (Point d'accès) | La carte crée son propre réseau Wi-Fi | Configuration sans routeur, projet autonome |
|
|
| `WIFI_AP_STA` | Les deux simultanément | Portail de configuration puis bascule en client |
|
|
|
|
{#fig-m07-modes-wifi}
|
|
|
|
## 2. Mode station : se connecter à un réseau existant
|
|
|
|
```cpp
|
|
#include <WiFi.h>
|
|
|
|
const char* ssid = "NomDuReseau";
|
|
const char* motDePasse = "MotDePasse";
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
WiFi.mode(WIFI_STA);
|
|
WiFi.begin(ssid, motDePasse);
|
|
|
|
Serial.print("Connexion en cours");
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
delay(500);
|
|
Serial.print(".");
|
|
}
|
|
|
|
Serial.println();
|
|
Serial.print("Connecte ! Adresse IP: ");
|
|
Serial.println(WiFi.localIP());
|
|
}
|
|
|
|
void loop() {
|
|
}
|
|
```
|
|
|
|
::: {.callout-important title="Sécurité : ne jamais versionner ses identifiants"}
|
|
Évitez d'écrire en clair vos identifiants Wi-Fi dans un fichier destiné à être partagé ou publié (dépôt Git). Une bonne pratique consiste à les isoler dans un fichier séparé non partagé (ex : secrets.h), ou à les saisir via le moniteur série au premier démarrage.
|
|
:::
|
|
|
|
## 3. Mode point d'accès : créer son propre réseau
|
|
|
|
```cpp
|
|
#include <WiFi.h>
|
|
|
|
const char* ssidAP = "ESP32-Formation";
|
|
const char* motDePasseAP = "formation123"; // 8 caracteres minimum
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
WiFi.mode(WIFI_AP);
|
|
WiFi.softAP(ssidAP, motDePasseAP);
|
|
|
|
Serial.print("Point d'acces cree. IP: ");
|
|
Serial.println(WiFi.softAPIP()); // generalement 192.168.4.1
|
|
}
|
|
|
|
void loop() {
|
|
}
|
|
```
|
|
|
|
## 4. Client HTTP : interroger une API externe
|
|
|
|
Une fois connectée en mode station, la carte peut effectuer des requêtes HTTP vers des services web, par exemple pour récupérer la météo actuelle.
|
|
|
|
{#fig-m07-requete-http}
|
|
|
|
### 4.1 Bibliothèque nécessaire
|
|
|
|
HTTPClient est incluse nativement dans le core Arduino-ESP32. Pour analyser une réponse JSON, installez la bibliothèque « ArduinoJson » (Benoit Blanchon) depuis le gestionnaire de bibliothèques.
|
|
|
|
### 4.2 Requête GET simple
|
|
|
|
```cpp
|
|
#include <WiFi.h>
|
|
#include <HTTPClient.h>
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
WiFi.begin("NomDuReseau", "MotDePasse");
|
|
while (WiFi.status() != WL_CONNECTED) { delay(500); }
|
|
|
|
HTTPClient http;
|
|
http.begin("https://api.exemple.com/donnees");
|
|
int codeReponse = http.GET();
|
|
|
|
if (codeReponse == 200) {
|
|
String reponse = http.getString();
|
|
Serial.println(reponse);
|
|
} else {
|
|
Serial.printf("Erreur HTTP: %d\n", codeReponse);
|
|
}
|
|
http.end();
|
|
}
|
|
|
|
void loop() {
|
|
}
|
|
```
|
|
|
|
## 5. Exercice : afficher la météo en temps réel
|
|
|
|
Combinez cette section avec le Module 5 (écran OLED) : interrogez une API météo publique (par exemple Open-Meteo, qui ne nécessite pas de clé d'API) et affichez la température actuelle sur l'écran OLED, avec rafraîchissement toutes les 10 minutes.
|
|
|
|
```cpp
|
|
#include <WiFi.h>
|
|
#include <HTTPClient.h>
|
|
#include <ArduinoJson.h>
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
WiFi.begin("NomDuReseau", "MotDePasse");
|
|
while (WiFi.status() != WL_CONNECTED) { delay(500); }
|
|
|
|
HTTPClient http;
|
|
// Exemple : latitude/longitude de Paris
|
|
http.begin("https://api.open-meteo.com/v1/forecast?latitude=48.85&longitude=2.35¤t_weather=true");
|
|
int code = http.GET();
|
|
|
|
if (code == 200) {
|
|
String payload = http.getString();
|
|
JsonDocument doc;
|
|
deserializeJson(doc, payload);
|
|
float temp = doc["current_weather"]["temperature"];
|
|
Serial.printf("Temperature actuelle: %.1f C\n", temp);
|
|
}
|
|
http.end();
|
|
}
|
|
|
|
void loop() {
|
|
}
|
|
```
|
|
|
|
::: {.callout-important title="Rappel important : ADC2 et Wi-Fi"}
|
|
Comme vu au Module 3, dès que le Wi-Fi est actif, évitez toute lecture analogique sur les broches de l'ADC2 : privilégiez systématiquement l'ADC1 dans vos projets connectés.
|
|
:::
|
|
|
|
## 6. Indicateur visuel de connexion avec la LED NeoPixel
|
|
|
|
Ajoutez un indicateur d'état de connexion sur la LED NeoPixel intégrée : orange clignotant pendant la tentative de connexion, vert fixe une fois connecté, rouge fixe en cas d'échec après un délai (par exemple 10 secondes de tentative).
|
|
|
|
## Checklist de fin de module
|
|
|
|
- [ ] Je sais connecter la carte à un réseau Wi-Fi existant (mode STA).
|
|
- [ ] Je sais créer un point d'accès Wi-Fi autonome (mode AP).
|
|
- [ ] Je sais effectuer une requête HTTP GET et lire le code de réponse.
|
|
- [ ] Je sais extraire une valeur d'une réponse JSON avec ArduinoJson.
|
|
- [ ] J'ai réalisé l'affichage météo en temps réel sur l'écran OLED.
|
|
- [ ] J'ai ajouté l'indicateur de connexion sur la LED NeoPixel.
|