ESP32 ne se connecte pas au WiFi : WiFi.status() et solutions
Ton ESP32 ne se connecte pas au WiFi ? Codes WiFi.status() et reason, 2,4 GHz, mot de passe, brownout, setTxPower, reconnexion, IP fixe et eduroam expliqués.
Ton ESP32 ne se connecte pas au WiFi et le moniteur série n'affiche que des points à l'infini ? La cause n'est presque jamais une carte défectueuse. Les suspects habituels sont : un réseau en 5 GHz, une petite faute de frappe dans le nom du réseau ou le mot de passe, une alimentation trop faible dont la tension s'effondre dès que le WiFi démarre, les réglages de sécurité et de canal de la box, ou un réseau d'entreprise au lycée ou au travail. Bonne nouvelle : l'ESP32 te dit déjà ce qui ne va pas. Il suffit de savoir lire la valeur de WiFi.status() et le code reason (cause) qu'il renvoie quand la connexion tombe.
Dans ce guide, tu verras d'abord les étapes que suit l'ESP32 pour rejoindre un réseau et le code d'état qu'il renvoie à chacune d'elles. Viennent ensuite un sketch de diagnostic qui affiche les codes d'état et de cause, un scanner qui liste les réseaux autour de toi, l'obligation du 2,4 GHz et les box bibandes, le brownout et la solution setTxPower, un sketch de reconnexion qui se rétablit tout seul, l'IP fixe, la connexion WPA2-Enterprise pour les réseaux d'école et le test avec le partage de connexion du téléphone, qui t'indique en quelques minutes si le problème vient de la box ou de la carte. Les sketchs fonctionnent avec les versions 2.x et 3.x du core ESP32 pour l'Arduino IDE, et tu trouveras à la fin un script de test pour le Raspberry Pi Pico W et MicroPython.

Comment l'ESP32 se connecte-t-il à un réseau WiFi ?
Quand tu appelles WiFi.begin(), l'ESP32 enchaîne quatre étapes en arrière-plan. D'abord, il parcourt les canaux à la recherche d'un réseau portant le nom (SSID) que tu lui as donné. S'il le trouve, il s'authentifie puis s'associe auprès de la box. Sur les réseaux WPA2 vient ensuite la poignée de main en 4 étapes (4-way handshake), où l'on découvre si le mot de passe est bon. Enfin, il demande une adresse IP au serveur DHCP de la box. WiFi.status() ne renvoie WL_CONNECTED qu'une fois cette dernière étape terminée. Si tu sais à quelle étape il bloque, tu connais en grande partie la cause :
| Étape | Que se passe-t-il ? | État et cause en cas de blocage |
|---|---|---|
| 1. Scan | L'ESP32 cherche le nom du réseau sur les canaux 2,4 GHz | WL_NO_SSID_AVAIL (1), reason 201 |
| 2. Authentification et association | La box accepte ou refuse l'ESP32 | WL_CONNECT_FAILED (4) ou WL_DISCONNECTED (6), reason 202 ou 203 |
| 3. Poignée de main en 4 étapes | Les clés dérivées du mot de passe sont comparées | WL_DISCONNECTED (6) avec reason 15 ; WL_CONNECTION_LOST (5) avec reason 204 |
| 4. DHCP | La box attribue une adresse IP à l'ESP32 | Reste bloqué sur WL_IDLE_STATUS (0) |
| Après la connexion | La box envoie régulièrement des trames beacon | Si elles s'arrêtent : WL_CONNECTION_LOST (5), reason 200 |
Ce que signifient les codes WiFi.status()
WiFi.status() renvoie une valeur de type wl_status_t. Si tu l'affiches directement dans le moniteur série, tu ne vois qu'un nombre. Le tableau ci-dessous donne la signification de chaque nombre dans le core Arduino de l'ESP32. Attention : les valeurs 0 à 6 portent les mêmes noms que dans l'ancienne bibliothèque WiFi d'Arduino, mais sur l'ESP32 elles apparaissent dans des situations un peu différentes. Juste après WiFi.begin(), par exemple, l'état vaut 6 et non 0 ; il passe à 0 quand la carte s'est associée à la box et attend une IP, puis à 3 quand elle l'a obtenue.
| Code | Constante | Signification | À vérifier d'abord |
|---|---|---|---|
| 0 | WL_IDLE_STATUS | Associé à la box, mais pas encore d'adresse IP | Normal pendant quelques secondes ; si ça dure, le DHCP |
| 1 | WL_NO_SSID_AVAIL | Aucun réseau de ce nom n'a été trouvé | Nom du réseau, bande 2,4 GHz, distance |
| 2 | WL_SCAN_COMPLETED | Un scan des réseaux est terminé | Sans rapport avec la connexion |
| 3 | WL_CONNECTED | Connecté avec une adresse IP | Tout va bien |
| 4 | WL_CONNECT_FAILED | La box a refusé la connexion | Mot de passe, mode de sécurité, filtrage MAC |
| 5 | WL_CONNECTION_LOST | Une connexion établie a été perdue | Force du signal, alimentation, antenne |
| 6 | WL_DISCONNECTED | Non connecté ; tentative en cours ou échouée | Le code reason |
| 254 | WL_STOPPED | La station WiFi est arrêtée (core 3.x) | Appeler WiFi.mode(WIFI_STA) |
| 255 | WL_NO_SHIELD | Le WiFi n'a pas encore été démarré (core 2.x) | Appeler WiFi.mode() ou WiFi.begin() |
Sketch de diagnostic : afficher l'état et le code reason dans le moniteur série
Le sketch ci-dessous essaie de se connecter pendant 20 secondes, affiche le code d'état avec son nom à chaque changement et montre le code reason fourni par ESP-IDF à chaque coupure. S'il se connecte, il affiche l'adresse IP, la passerelle, la force du signal (RSSI) et le canal ; dans tous les cas, il indique aussi l'adresse MAC de la carte. Remplace le nom du réseau et le mot de passe par les tiens, téléverse le sketch et ouvre le moniteur série à 115200 bauds. Si le sketch ne se téléverse même pas, lis d'abord le guide sur les erreurs de téléversement.
1#include <WiFi.h>
2
3const char* WIFI_ADI = "EvAgi_2G"; // Wi-Fi adı, büyük-küçük harfe duyarlı / network name, case-sensitive
4const char* WIFI_SIFRE = "sifre1234"; // Wi-Fi şifresi / Wi-Fi password
5
6// Durum kodunu adına çevir / turn the status code into its name
7const char* durumAdi(wl_status_t durum) {
8 switch (durum) {
9 case WL_IDLE_STATUS: return "WL_IDLE_STATUS";
10 case WL_NO_SSID_AVAIL: return "WL_NO_SSID_AVAIL";
11 case WL_SCAN_COMPLETED: return "WL_SCAN_COMPLETED";
12 case WL_CONNECTED: return "WL_CONNECTED";
13 case WL_CONNECT_FAILED: return "WL_CONNECT_FAILED";
14 case WL_CONNECTION_LOST: return "WL_CONNECTION_LOST";
15 case WL_DISCONNECTED: return "WL_DISCONNECTED";
16 default: return "WL_NO_SHIELD / WL_STOPPED";
17 }
18}
19
20// Bağlantı her koptuğunda sebep kodunu yaz / print the reason code on every disconnect
21void koptugunda(arduino_event_id_t olay, arduino_event_info_t bilgi) {
22 Serial.printf("Koptu / Disconnected, reason: %d\n", (int)bilgi.wifi_sta_disconnected.reason);
23}
24
25void setup() {
26 Serial.begin(115200);
27 delay(1000);
28 WiFi.onEvent(koptugunda, ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
29 WiFi.mode(WIFI_STA); // istasyon modu / station mode
30 WiFi.begin(WIFI_ADI, WIFI_SIFRE); // begin() yalnızca bir kez / call begin() only once
31
32 wl_status_t onceki = WL_NO_SHIELD;
33 unsigned long baslangic = millis();
34 while (WiFi.status() != WL_CONNECTED && millis() - baslangic < 20000) {
35 wl_status_t simdi = WiFi.status();
36 if (simdi != onceki) { // yalnızca değişince yaz / print only when it changes
37 Serial.printf("Durum / Status: %d %s\n", (int)simdi, durumAdi(simdi));
38 onceki = simdi;
39 }
40 delay(500);
41 }
42
43 if (WiFi.status() == WL_CONNECTED) {
44 Serial.print("Bagli / Connected, IP: ");
45 Serial.println(WiFi.localIP());
46 Serial.print("Ag gecidi / Gateway: ");
47 Serial.println(WiFi.gatewayIP());
48 Serial.printf("RSSI: %d dBm, kanal / channel: %d\n", (int)WiFi.RSSI(), (int)WiFi.channel());
49 } else {
50 wl_status_t son = WiFi.status();
51 Serial.printf("Baglanamadi / Failed, son durum / last status: %d %s\n", (int)son, durumAdi(son));
52 }
53 Serial.print("MAC: ");
54 Serial.println(WiFi.macAddress()); // MAC filtresi için / for MAC filtering
55}
56
57void loop() {}Il est normal de voir d'abord Durum / Status: 6 WL_DISCONNECTED. Si la connexion réussit, l'état passe brièvement à 0, puis à 3. S'il reste à 1, le réseau n'a jamais été trouvé ; si des lignes comme Koptu / Disconnected, reason: 15 s'enchaînent, le mot de passe est très probablement faux. Pour encore plus de détails, règle Outils > Core Debug Level sur Warn ou Info dans l'Arduino IDE : le core écrit alors aussi le nom de la cause à chaque coupure, par exemple Reason: 201 - NO_AP_FOUND. Voici les codes reason que tu rencontreras le plus souvent :
| Reason | Nom | Qu'est-ce que ça veut dire ? | Solution |
|---|---|---|---|
| 2 | AUTH_EXPIRE | L'authentification a expiré | Signal faible ou box surchargée ; rapproche-toi, redémarre la box |
| 5 | ASSOC_TOOMANY | La box a atteint son nombre maximal d'appareils | Déconnecte les appareils inutilisés ou augmente la limite |
| 8 | ASSOC_LEAVE | L'ESP32 a quitté le réseau de lui-même | Ton code appelle WiFi.disconnect() ; c'est normal |
| 15 | 4WAY_HANDSHAKE_TIMEOUT | La poignée de main du mot de passe n'a pas abouti | Le plus souvent un mauvais mot de passe ; vérifie-le ainsi que le mode de sécurité |
| 200 | BEACON_TIMEOUT | Les trames beacon de la box n'arrivent plus | Signal faible ou chute de tension ; antenne, alimentation, setTxPower |
| 201 | NO_AP_FOUND | Aucun réseau de ce nom n'a été trouvé | Orthographe du SSID, réseau 5 GHz, distance, réseau masqué, canaux 12 et 13 |
| 202 | AUTH_FAIL | L'authentification a été refusée | Mot de passe ou mode de sécurité incompatible, comme Enterprise |
| 203 | ASSOC_FAIL | La box a refusé l'association | Filtrage MAC ou mode sans fil comme 802.11ax uniquement |
| 204 | HANDSHAKE_TIMEOUT | La poignée de main a expiré | Mauvais mot de passe ou signal très faible |
| 210, 211 | NO_AP_FOUND_W_COMPATIBLE_SECURITY, NO_AP_FOUND_IN_AUTHMODE_THRESHOLD | Réseau trouvé, mais son mode de sécurité est incompatible ou sous le minimum autorisé (core 3.x) | Passe la box en WPA2-Personnel (AES) ou abaisse le minimum avec WiFi.setMinSecurity() |
Le 2,4 GHz obligatoire : l'ESP32 ne voit pas les réseaux 5 GHz
L'ESP32 classique, l'ESP32-S2, l'ESP32-S3, l'ESP32-C3 et l'ESP32-C6 ne fonctionnent que sur la bande 2,4 GHz. Ils ne voient jamais au scan un réseau qui émet en 5 GHz, et le résultat est toujours WL_NO_SSID_AVAIL. La plupart des box émettent sur les deux bandes. Si ta box utilise un nom différent pour chaque bande (par exemple MonWiFi et MonWiFi_5G), donne toujours à l'ESP32 le nom du réseau 2,4 GHz. Si les deux bandes portent le même nom (Smart Connect, band steering ou systèmes mesh), l'ESP32 rejoint généralement sans souci la partie 2,4 GHz, puisqu'il ne voit de toute façon pas le signal 5 GHz. Les ennuis commencent quand la bande 2,4 GHz est désactivée ou quand la box essaie de pousser les appareils vers le 5 GHz : l'ESP32 se connecte, décroche quelques secondes plus tard, et le cycle recommence. Dans ce cas, sépare les bandes dans l'interface de la box ou crée un réseau invité qui n'émet qu'en 2,4 GHz.
| Carte | Bande WiFi | Remarque |
|---|---|---|
| ESP32 (WROOM-32, DevKit), ESP32-S2, ESP32-S3 | 2,4 GHz uniquement | 802.11 b/g/n |
| ESP32-C3 | 2,4 GHz uniquement | Les cartes Super Mini bon marché peuvent nécessiter une puissance d'émission réduite |
| ESP32-C6 | 2,4 GHz uniquement | Compatible Wi-Fi 6 (802.11ax), mais toujours en 2,4 GHz seulement |
| ESP32-C5 | 2,4 GHz et 5 GHz | La première puce bibande d'Espressif |
| ESP8266 (NodeMCU, Wemos D1 mini, ESP-01) | 2,4 GHz uniquement | 802.11 b/g/n |
| Raspberry Pi Pico W et Pico 2 W | 2,4 GHz uniquement | Puce sans fil CYW43439 |
| Arduino Uno R4 WiFi | 2,4 GHz uniquement | C'est l'ESP32-S3 de la carte qui gère le WiFi |
Si la bande est la bonne et que le réseau reste introuvable, vérifie les réglages de canal et de mode de la box. Avec le réglage régional par défaut de l'ESP32, les canaux 1 à 11 sont scannés activement, tandis que les canaux 12 et 13 ne sont écoutés que passivement. Les réseaux visibles sur ces canaux sont en général quand même trouvés, mais l'ESP32 ne trouvera pas un réseau masqué (diffusion du SSID désactivée) sur le canal 12 ou 13. Le plus sûr est de passer le canal d'automatique à une valeur fixe : 1, 6 ou 11. L'ESP32 classique, le S2, le S3 et le C3 ne peuvent pas rejoindre une box réglée sur 802.11ax (Wi-Fi 6) uniquement ; passe le mode en b/g/n ou en mixte b/g/n/ax. Côté sécurité, les options les plus compatibles sont WPA2-Personnel (AES) ou le mode mixte WPA2/WPA3. Par défaut, le core Arduino refuse tout ce qui est plus faible que le WPA2 (WEP et ancien WPA-TKIP) ; si tu dois vraiment rejoindre un très vieux réseau, ajoute WiFi.setMinSecurity(WIFI_AUTH_WEP) avant begin(). Avant de modifier quoi que ce soit, regarde avec ce scanner ce que l'ESP32 voit réellement :
1#include <WiFi.h>
2
3// Güvenlik türünü yazıya çevir / turn the security type into text
4const char* guvenlikAdi(wifi_auth_mode_t tur) {
5 switch (tur) {
6 case WIFI_AUTH_OPEN: return "Acik / Open";
7 case WIFI_AUTH_WEP: return "WEP";
8 case WIFI_AUTH_WPA_PSK: return "WPA";
9 case WIFI_AUTH_WPA2_PSK: return "WPA2";
10 case WIFI_AUTH_WPA_WPA2_PSK: return "WPA/WPA2";
11 case WIFI_AUTH_WPA3_PSK: return "WPA3";
12 case WIFI_AUTH_WPA2_WPA3_PSK: return "WPA2/WPA3";
13 default: return "Diger / Other (Enterprise)";
14 }
15}
16
17void setup() {
18 Serial.begin(115200);
19 WiFi.mode(WIFI_STA);
20 WiFi.disconnect(); // temiz tarama için bağlantıyı kes / disconnect for a clean scan
21 delay(100);
22}
23
24void loop() {
25 Serial.println("Taraniyor / Scanning...");
26 int adet = WiFi.scanNetworks(); // engelleyen tarama, 2-4 sn / blocking scan, 2-4 s
27 if (adet <= 0) {
28 Serial.println("Ag bulunamadi / No networks found");
29 }
30 for (int i = 0; i < adet; i++) {
31 Serial.printf("%2d | %-32s | %4d dBm | kanal/ch %2d | %s\n",
32 i + 1, WiFi.SSID(i).c_str(), (int)WiFi.RSSI(i),
33 (int)WiFi.channel(i), guvenlikAdi(WiFi.encryptionType(i)));
34 }
35 WiFi.scanDelete(); // sonuçları bellekten sil / free the results
36 Serial.println();
37 delay(10000); // 10 sn sonra yeniden tara / scan again in 10 s
38}Si le nom de ton réseau n'apparaît pas du tout dans la liste, le problème se situe avant ton code : le réseau est en 5 GHz, masqué, ou l'ESP32 est trop loin. Si le nom apparaît, regarde son RSSI : de -30 à -60 dBm c'est excellent, de -60 à -70 dBm c'est bon ; entre -70 et -80 dBm la connexion se fait mais peut tomber, et en dessous de -80 dBm n'espère pas une connexion fiable. Si tu vois le même nom plusieurs fois, ta box ou ton système mesh possède plusieurs points d'accès. Avec le scan rapide par défaut, l'ESP32 rejoint la première correspondance trouvée ; si tu veux qu'il choisisse le signal le plus fort, ajoute WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN) avant begin(). Copier le nom exactement tel qu'il apparaît dans le scan et le coller dans ton sketch élimine définitivement les fautes de frappe.
Erreurs de nom de réseau (SSID) et de mot de passe
Si le sketch de diagnostic renvoie reason 201 ou 15, le problème se trouve généralement dans deux lignes de ton code. Un SSID peut faire jusqu'à 32 octets, un mot de passe WPA2 entre 8 et 63 caractères, et les deux sont sensibles à la casse. Voici les erreurs les plus souvent négligées :
- Majuscules et minuscules : Tu ne peux pas rejoindre un réseau affiché MonWiFi dans la box en tapant monwifi. La même règle vaut pour le mot de passe.
- Espaces invisibles : Un espace à la fin du nom du réseau ou du mot de passe, ou un caractère caché récupéré en le copiant quelque part, empêche la correspondance.
- Accents : Des lettres comme é, è ou ç dans le nom du réseau peuvent être enregistrées par la box dans un autre encodage. Renommer le réseau avec uniquement des lettres sans accent et des chiffres est la solution la plus sûre.
- Apostrophe typographique : Sur iPhone, le nom du partage de connexion est le nom du téléphone, qui contient souvent une apostrophe courbe ’ au lieu de l'apostrophe droite ' du clavier ; le nom saisi dans ton code ne correspond donc pas.
- Antislash et guillemets : Si le mot de passe contient \ ou ", écris-les \\ et \" dans la chaîne C++ ; sinon le compilateur modifie le mot de passe ou le sketch ne compile pas.
- Réseau ouvert : Pour un réseau sans mot de passe, n'indique pas de mot de passe du tout ; WiFi.begin(nom) suffit. Si tu fournis un mot de passe pour un réseau ouvert, le core cherche du WPA2 et ne trouve pas le réseau.
- Réseau masqué : Tu peux rejoindre un réseau dont la diffusion du SSID est désactivée en tapant son nom exact, mais il n'apparaît pas dans les scans ; en cas de souci, réactive la diffusion le temps des tests.
Alimentation et brownout : pourquoi la carte redémarre-t-elle quand le WiFi s'active ?
Un module ESP32 consomme en moyenne environ 80 mA, mais quand l'émetteur WiFi travaille, le courant grimpe brièvement à des pics de 250 à 400 mA. Les plus gros pics surviennent en général pendant la calibration radio au démarrage et lors de la première connexion. C'est pourquoi Espressif recommande une alimentation capable de fournir au moins 500 mA. Si l'alimentation ne suit pas ces pics, la ligne 3,3 V s'effondre un instant, le détecteur de brownout de la puce se déclenche et la carte redémarre avec le message Brownout detector was triggered dans le moniteur série. Le symptôme est bien connu : le code tourne normalement jusqu'à la ligne WiFi, la carte se réinitialise sur WiFi.begin(), et tout tourne en boucle sans fin. Nous détaillons cette erreur dans l'article sur les erreurs Brownout et Guru Meditation de l'ESP32.

| Source d'alimentation | Convient ? | Pourquoi ? |
|---|---|---|
| Port USB à l'arrière de l'ordinateur, câble court et épais | En général oui | Un port USB 2.0 fournit 500 mA ; un câble court limite la chute de tension |
| USB en façade, hub USB ou câble long et fin | Peut poser problème | La résistance du câble et des contacts fait chuter la tension lors des pics de courant |
| Chargeur de téléphone 5 V d'au moins 1 A | Oui | Laisse une bonne marge pour les pics de courant |
| Broche 3.3V de l'Arduino Uno | Non | Cette broche ne fournit qu'environ 50 mA |
| Batterie Li-ion 3,7 V branchée directement sur la broche 5V de la carte | Non | À cause de la chute de tension de l'AMS1117, la sortie descend sous 3 V |
| Batterie Li-ion avec élévateur 5 V ou régulateur 3,3 V à faible chute | Oui | Fournit un 3,3 V stable même quand la batterie se vide |
| Sortie 3,3 V d'un module d'alimentation MB102 pour breadboard | La plupart du temps | Alimente-le avec un adaptateur assez puissant et ajoute un condensateur |
La solution setTxPower : réduire la puissance d'émission
Sur certaines cartes, même avec une bonne alimentation, l'ESP32 voit le réseau mais n'arrive pas à s'y connecter, ou la connexion tombe sans cesse. Surtout sur les cartes ESP32-C3 Super Mini bon marché et sur certains clones d'ESP32, le circuit d'antenne et le régulateur peinent à pleine puissance d'émission. Par défaut, l'ESP32 émet à environ 19,5 à 20 dBm. Réduire cette puissance avec WiFi.setTxPower() diminue les pics de courant et répare souvent la connexion instantanément sur ces cartes. Appelle la fonction juste après WiFi.begin() ; si tu l'appelles avant le démarrage du WiFi, c'est-à-dire avant WiFi.mode() ou begin(), elle n'a aucun effet.
| Constante | Puissance | Quand l'utiliser ? |
|---|---|---|
| WIFI_POWER_19_5dBm | 19,5 dBm | Proche de la valeur par défaut ; portée maximale |
| WIFI_POWER_15dBm | 15 dBm | Premier essai en cas de petits problèmes |
| WIFI_POWER_11dBm | 11 dBm | Suffit souvent si la box est dans la même pièce |
| WIFI_POWER_8_5dBm | 8,5 dBm | La valeur la plus souvent conseillée pour l'ESP32-C3 Super Mini |
| WIFI_POWER_5dBm | 5 dBm | Pour des tests juste à côté de la box |
Chaque baisse de 3 dB divise par deux la puissance d'émission, donc la portée diminue aussi. Commence par 15 dBm ; si le problème persiste, descends à 11 puis à 8,5 dBm. Si la connexion se rétablit en baissant la puissance, la vraie cause est souvent l'alimentation ou la conception de l'antenne ; à terme, ajoute donc aussi une meilleure alimentation et un condensateur. Tu peux lire le réglage actuel de la carte avec WiFi.getTxPower() ; la valeur est exprimée par pas de 0,25 dBm, donc 78 correspond à 19,5 dBm.
Sketch de reconnexion automatique
L'ESP32 perd la connexion quand la box redémarre, quand le courant revient après une coupure ou quand le signal faiblit un moment. Dans le core ESP32, WiFi.setAutoReconnect(true) est activé par défaut et, après la plupart des coupures, la carte se reconnecte toute seule. Pour certaines causes, comme 202 AUTH_FAIL, le core abandonne toutefois après un seul essai et la carte reste hors ligne jusqu'à ce que tu la réinitialises. Dans un projet qui doit tourner pendant des mois, ajoute donc ta propre vérification. Le sketch ci-dessous se passe de delay() : avec millis(), il vérifie la connexion toutes les 15 secondes, se reconnecte si elle est tombée et redémarre la carte s'il ne parvient pas à se connecter pendant 5 minutes :
1#include <WiFi.h>
2
3const char* WIFI_ADI = "EvAgi_2G"; // Wi-Fi adı / network name
4const char* WIFI_SIFRE = "sifre1234"; // Wi-Fi şifresi / Wi-Fi password
5
6const unsigned long KONTROL_ARALIGI = 15000; // 15 sn'de bir kontrol / check every 15 s
7const int EN_FAZLA_DENEME = 20; // 20 x 15 sn = 5 dk / 20 x 15 s = 5 min
8unsigned long sonKontrol = 0;
9int basarisizSayac = 0; // üst üste başarısız kontrol / consecutive failed checks
10
11void wifiBaslat() {
12 WiFi.mode(WIFI_STA);
13 WiFi.setAutoReconnect(true); // çekirdeğin kendi yeniden bağlanması / core auto-reconnect
14 WiFi.begin(WIFI_ADI, WIFI_SIFRE);
15 WiFi.setTxPower(WIFI_POWER_15dBm); // gerekirse 8_5dBm'e kadar düşür / lower to 8_5dBm if needed
16 WiFi.setSleep(false); // modem uykusunu kapat / disable modem sleep
17}
18
19void setup() {
20 Serial.begin(115200);
21 wifiBaslat();
22}
23
24void loop() {
25 if (millis() - sonKontrol >= KONTROL_ARALIGI) {
26 sonKontrol = millis();
27 if (WiFi.status() == WL_CONNECTED) {
28 basarisizSayac = 0;
29 Serial.printf("Bagli / Connected, IP: %s, RSSI: %d dBm\n",
30 WiFi.localIP().toString().c_str(), (int)WiFi.RSSI());
31 } else {
32 basarisizSayac++;
33 Serial.printf("Bagli degil / Not connected (%d/%d), yeniden baglaniyor / reconnecting\n",
34 basarisizSayac, EN_FAZLA_DENEME);
35 WiFi.disconnect();
36 WiFi.reconnect();
37 if (basarisizSayac >= EN_FAZLA_DENEME) {
38 Serial.println("Yeniden baslatiliyor / Restarting");
39 delay(100);
40 ESP.restart(); // son çare: kartı yeniden başlat / last resort: restart the board
41 }
42 }
43 }
44
45 // Projenin kodu buraya; uzun delay() kullanma / your project code here; avoid long delay()
46}La ligne WiFi.setSleep(false) désactive le modem sleep, pendant lequel l'ESP32 coupe brièvement sa radio à intervalles réguliers lorsqu'il est connecté. Cela réduit les coupures avec certaines box et la latence du serveur web ; en contrepartie, la carte consomme quelques dizaines de mA de plus. Dans un projet sur batterie, tu peux supprimer cette ligne et calculer l'autonomie avec le calculateur d'autonomie de batterie. Garde la ligne setTxPower uniquement si tu rencontres les problèmes de la section précédente. Quand tu ajoutes le code de ton projet dans loop(), évite les longs delay(), car la vérification de la connexion ne s'exécute que tant que loop() tourne. Si tu préfères saisir les identifiants WiFi depuis ton téléphone plutôt que de les inscrire en dur dans le code, jette un œil à la bibliothèque WiFiManager.
Configurer une IP fixe sur l'ESP32
Normalement, la box attribue à l'ESP32 par DHCP une adresse qui peut changer à chaque fois. Si tu construis un serveur web que tu ouvriras toujours à la même adresse depuis ton téléphone, ou si le DHCP de la box fait des siennes (l'état reste bloqué à 0), une IP fixe te simplifie la vie. Respecte trois règles : WiFi.config() doit être appelé avant WiFi.begin() ; l'adresse choisie doit appartenir au réseau de la box tout en étant hors de sa plage DHCP (si la box distribue 192.168.1.2 à 100, prends par exemple 192.168.1.200) ; et la passerelle est l'adresse de la box elle-même. Pour connaître l'adresse de ta box, lance une fois le sketch de diagnostic en DHCP ; il affiche aussi la passerelle.
1#include <WiFi.h>
2
3const char* WIFI_ADI = "EvAgi_2G"; // Wi-Fi adı / network name
4const char* WIFI_SIFRE = "sifre1234"; // Wi-Fi şifresi / Wi-Fi password
5
6IPAddress sabitIP(192, 168, 1, 200); // DHCP havuzunun dışında bir adres / an address outside the DHCP pool
7IPAddress agGecidi(192, 168, 1, 1); // modemin adresi / router address
8IPAddress altAgMaskesi(255, 255, 255, 0); // alt ağ maskesi / subnet mask
9IPAddress dns1(1, 1, 1, 1); // birinci DNS / primary DNS
10IPAddress dns2(8, 8, 8, 8); // ikinci DNS / secondary DNS
11
12void setup() {
13 Serial.begin(115200);
14 WiFi.mode(WIFI_STA);
15 // config() mutlaka begin()'den önce / config() must come before begin()
16 if (!WiFi.config(sabitIP, agGecidi, altAgMaskesi, dns1, dns2)) {
17 Serial.println("Statik IP ayarlanamadi / Static IP config failed");
18 }
19 WiFi.begin(WIFI_ADI, WIFI_SIFRE);
20
21 unsigned long baslangic = millis();
22 while (WiFi.status() != WL_CONNECTED && millis() - baslangic < 15000) {
23 delay(500);
24 Serial.print('.');
25 }
26 Serial.println();
27 Serial.print("IP: ");
28 Serial.println(WiFi.localIP()); // 192.168.1.200 olmalı / should be 192.168.1.200
29}
30
31void loop() {}Réseaux d'école et d'entreprise : connexion WPA2-Enterprise (eduroam)
eduroam dans les universités, les réseaux d'entreprise et certains réseaux scolaires utilisent le WPA2-Enterprise (802.1X), qui attribue à chaque utilisateur son propre identifiant et son propre mot de passe au lieu d'un mot de passe partagé. Un WiFi.begin(nom, motdepasse) classique échoue toujours sur ces réseaux, et dans le scanner leur type de sécurité apparaît comme Diger / Other (Enterprise). Les versions 2.x et 3.x du core Arduino de l'ESP32 proposent une variante de begin() toute prête pour le PEAP, la méthode la plus répandue :
1#include <WiFi.h>
2
3const char* AG_ADI = "eduroam"; // kurum ağının adı / enterprise network name
4const char* EAP_KIMLIK = "[email protected]"; // kimlik, çoğu zaman kullanıcı adıyla aynı / identity, usually same as username
5const char* EAP_KULLANICI = "[email protected]"; // kullanıcı adı / username
6const char* EAP_SIFRE = "kurum_sifren"; // kurum şifresi / enterprise password
7
8void setup() {
9 Serial.begin(115200);
10 WiFi.disconnect(true); // önceki bağlantıyı kapat / close any previous connection
11 WiFi.mode(WIFI_STA);
12 // PEAP (MSCHAPv2) ile bağlan, CA doğrulaması yok / connect with PEAP (MSCHAPv2), no CA check
13 WiFi.begin(AG_ADI, WPA2_AUTH_PEAP, EAP_KIMLIK, EAP_KULLANICI, EAP_SIFRE);
14
15 unsigned long baslangic = millis();
16 while (WiFi.status() != WL_CONNECTED && millis() - baslangic < 30000) {
17 delay(500);
18 Serial.print('.');
19 }
20 Serial.println();
21 if (WiFi.status() == WL_CONNECTED) {
22 Serial.print("Bagli / Connected, IP: ");
23 Serial.println(WiFi.localIP());
24 } else {
25 Serial.printf("Baglanamadi / Failed, durum / status: %d\n", (int)WiFi.status());
26 }
27}
28
29void loop() {}Dans la plupart des établissements, l'identité (identity) est la même que l'identifiant ; certains demandent une identité externe anonyme comme [email protected]. Ce sketch ne vérifie pas le certificat du serveur (CA) : la connexion fonctionne, mais un faux point d'accès pourrait intercepter ton mot de passe. Avant d'inscrire ton mot de passe personnel dans un ESP32, demande donc conseil au service informatique et, si possible, un compte ou un réseau réservé aux appareils. Si ton établissement exige un certificat, tu peux passer le fichier CA en sixième paramètre de begin(). Les réseaux qui ouvrent une page de connexion dans le navigateur (portail captif), comme dans les hôtels, les résidences étudiantes et les cafés, posent un autre problème, car l'ESP32 ne peut pas remplir cette page. Certains établissements exigent aussi d'enregistrer à l'avance l'adresse MAC des appareils ; transmets au service informatique l'adresse MAC affichée par le sketch de diagnostic. Sur ces réseaux, la solution la plus pratique reste le partage de connexion de ton téléphone ou un petit routeur de poche.
Test avec le partage de connexion du téléphone : la box ou l'ESP32 ?
Le moyen le plus rapide de cerner la cause est de connecter l'ESP32 à un réseau dont tu contrôles entièrement les réglages. Le partage de connexion de ton téléphone est idéal pour cela :
- Donne au partage de connexion un nom court, composé uniquement de lettres sans accent et de chiffres (par exemple esptest), et un mot de passe simple d'au moins 8 caractères (par exemple test12345).
- Sur Android, règle l'option de bande dans les paramètres du point d'accès mobile (appelée bande AP ou Vitesse et compatibilité sur certains téléphones) sur 2,4 GHz et choisis WPA2-Personnel comme type de sécurité.
- Sur iPhone, va dans Réglages > Partage de connexion et active Autoriser d'autres utilisateurs. Sur les modèles récents, active aussi Optimiser la compatibilité ; le partage passe alors en 2,4 GHz. Le nom du partage est celui du téléphone : simplifie-le dans Réglages > Général > Informations > Nom et garde l'écran Partage de connexion ouvert jusqu'à ce que l'ESP32 soit connecté.
- Remplace le nom du réseau et le mot de passe du sketch de diagnostic par ceux du partage de connexion, pose le téléphone à 1 ou 2 mètres de l'ESP32 et téléverse le sketch.
- Lis les codes d'état et de cause dans le moniteur série, puis essaie le même sketch avec les identifiants de ta box.
Interprète le résultat ainsi : si l'ESP32 se connecte au partage de connexion mais pas à ta box, ton code, ta carte et ton alimentation sont bons ; le problème vient des réglages de bande, de canal, de sécurité, de filtrage MAC ou de nombre d'appareils de la box. S'il ne se connecte pas non plus au partage de connexion, le problème est du côté de l'ESP32 : change l'alimentation et le câble, baisse la puissance avec setTxPower, vérifie qu'aucun objet métallique ne se trouve devant l'antenne et relis le code. Le test du partage de connexion est aussi le moyen le plus rapide de prouver qu'un projet qui ne se connecte pas au lycée fonctionne en réalité.
Test WiFi avec le Raspberry Pi Pico W et MicroPython
Le Raspberry Pi Pico W et le Pico 2 W ne gèrent eux aussi que le 2,4 GHz ; tous les conseils de cet article sur la bande, le mot de passe, l'alimentation et le partage de connexion s'appliquent également à ces cartes. En MicroPython, les codes d'état se lisent à l'aide des constantes du module network. Le script ci-dessous fonctionne tel quel dans Thonny sur l'ESP32 comme sur le Pico W. Sur le Pico W, il arrête d'attendre dès que le réseau est introuvable ou que le mot de passe est faux ; sur l'ESP32, MicroPython continue de réessayer après certaines erreurs, le script affiche donc le dernier état au bout de 20 secondes :
1import network, time
2
3AG_ADI = "EvAgi_2G" # Wi-Fi adı / network name
4SIFRE = "sifre1234" # Wi-Fi şifresi / Wi-Fi password
5
6wlan = network.WLAN(network.STA_IF)
7wlan.active(True)
8if wlan.isconnected():
9 wlan.disconnect() # eski bağlantıyı kapat / close the previous connection
10 time.sleep(1)
11wlan.connect(AG_ADI, SIFRE)
12
13durum = wlan.status()
14for saniye in range(20): # en fazla 20 sn bekle / wait up to 20 s
15 durum = wlan.status()
16 print(saniye, "durum / status:", durum)
17 if durum in (network.STAT_GOT_IP, network.STAT_NO_AP_FOUND, network.STAT_WRONG_PASSWORD):
18 break # sonuç belli, beklemeyi bırak / result is known, stop waiting
19 time.sleep(1)
20
21if durum == network.STAT_GOT_IP:
22 print("Bagli / Connected, IP:", wlan.ifconfig()[0])
23 print("RSSI:", wlan.status("rssi"), "dBm")
24elif durum == network.STAT_NO_AP_FOUND:
25 print("Ag bulunamadi / Network not found (SSID, 2.4 GHz)")
26elif durum == network.STAT_WRONG_PASSWORD:
27 print("Sifre yanlis / Wrong password")
28else:
29 print("Baglanamadi / Failed, durum / status:", durum)Sur le Pico W, les valeurs numériques sont différentes : 3 signifie connecté avec une IP, 2 connecté mais en attente d'IP, -1 erreur générale, -2 réseau introuvable et -3 mauvais mot de passe. Sur l'ESP32, tu verras plutôt 1001 pendant la connexion, 1010 une fois l'IP obtenue et, en cas de problème, des codes reason ESP-IDF comme 201 et 202. Pour éviter les soucis avec les canaux 12 et 13 sur le Pico W, définis le code pays avant de te connecter (rp2.country('FR'), ou network.country('FR') sur les firmwares récents) ; si la connexion tombe de temps en temps, tu peux désactiver l'économie d'énergie avec wlan.config(pm=0xa11140). Pour créer un serveur web avec le Pico W, consulte l'article serveur web WiFi avec le Pico W, et si tu débutes en MicroPython, jette un œil au guide des bases de MicroPython.
Erreurs fréquentes et solutions
| Symptôme | Cause probable | Solution |
|---|---|---|
| Caractères incompréhensibles dans le moniteur série | La vitesse en bauds ne correspond pas | Règle le moniteur série sur 115200 bauds |
| État 1, reason 201 | Mauvais nom de réseau, réseau 5 GHz ou trop loin | Lance le scanner et copie exactement le nom du réseau 2,4 GHz |
| État 6, reason 15 à répétition | Mauvais mot de passe | Ressaisis le mot de passe en faisant attention à la casse et aux caractères spéciaux |
| État 4 ou 6 ; reason 202, 210 ou 211 | Mode de sécurité incompatible | Passe la box en WPA2-Personnel (AES) ou en mode mixte WPA2/WPA3 |
| Reste bloqué à l'état 0 | Associé à la box mais ne reçoit pas d'IP du DHCP | Redémarre la box, agrandis la plage DHCP ou utilise une IP fixe |
| Redémarrage sur WiFi.begin() avec Brownout detector was triggered | L'alimentation ne suit pas les pics de courant | Câble court, adaptateur d'au moins 1 A, 470 µF entre 3V3 et GND |
| Se connecte puis décroche au bout de quelques minutes (reason 200) | Signal faible, modem sleep ou problème d'alimentation | setSleep(false), setTxPower, sketch de reconnexion, rapprocher de la box |
| Fonctionne sur le bureau mais pas dans le boîtier | Boîtier métallique ou batterie devant l'antenne | Place l'antenne au bord du boîtier, tournée vers l'extérieur, utilise un boîtier en plastique |
| Connecté, mais la page web ne s'ouvre pas sur le téléphone | Le téléphone est sur un autre réseau ou le réseau invité isole les appareils | Connecte les deux au même réseau et lis l'IP dans le moniteur série |
| Les valeurs de analogRead() deviennent fausses quand le WiFi est actif | Le capteur est sur une broche ADC2, et le WiFi utilise l'ADC2 | Déplace le capteur sur les broches ADC1, GPIO 32 à 39 |
| Portée de quelques centimètres sur un ESP32-CAM ou une carte à antenne externe | La sélection d'antenne est sur externe, mais aucune antenne n'est branchée | Branche une antenne sur le connecteur IPEX ou vérifie la résistance de 0 Ω de sélection d'antenne |
Connecté : que peux-tu construire maintenant ?
- Serveur web et tableau de bord en direct : Monte un serveur web ESP32 avec WebSocket qui affiche les valeurs des capteurs sur ton téléphone en temps réel.
- Horloge Internet : Récupère l'heure auprès d'un serveur NTP et affiche-la sur un écran.
- Écran météo : Obtiens la température et l'humidité de ta ville grâce à une API météo.
- Notifications sur le téléphone : Envoie un message avec un bot Telegram quand la porte s'ouvre.
- Maison connectée : Relie l'ESP32 à Home Assistant via MQTT.
- Communication sans box : Fais dialoguer deux ESP32 avec ESP-NOW sans rejoindre aucun réseau.
- Téléversement sans fil : Une fois la carte enfermée dans son boîtier, envoie le nouveau code par WiFi grâce à une mise à jour OTA.
Un ESP32 qui ne se connecte pas au WiFi déroute au début, mais les codes d'état et de cause t'indiquent toujours à quelle étape se situe le problème : 1 et 201 signifient que le réseau n'a pas été trouvé, 15 et 202 désignent le mot de passe ou le mode de sécurité, 0 le DHCP, et 200 ou les redémarrages soudains le signal ou l'alimentation. Si tu découvres l'ESP32, tu trouveras les bases dans Qu'est-ce que l'ESP32 ?. Dans l'application BlueGrays, tu peux aussi explorer des projets comme la connexion WiFi de l'ESP32, un serveur web, le mDNS, une horloge NTP, une station météo, la mise à jour OTA et une alarme Telegram, avec des schémas de câblage pas à pas et du code prêt à l'emploi.
Questions fréquentes
Pourquoi mon ESP32 ne se connecte-t-il pas au WiFi ?
Les causes les plus courantes sont un réseau en 5 GHz, une faute de frappe dans le nom du réseau ou le mot de passe, une alimentation trop faible dont la tension chute au démarrage du WiFi et les réglages de sécurité de la box. Affiche la valeur de WiFi.status() et le code reason lors de la déconnexion, et tu verras tout de suite laquelle est en cause. Si le réseau est introuvable, tu verras 1 et 201 ; avec un mauvais mot de passe, le plus souvent 6 et 15.
L'ESP32 peut-il se connecter à un WiFi 5 GHz ?
L'ESP32 classique, l'ESP32-S2, S3, C3 et C6 ne gèrent que le 2,4 GHz et ne voient pas du tout les réseaux 5 GHz au scan. Le modèle bibande est l'ESP32-C5. Si ta box diffuse les deux bandes sous des noms différents, donne à l'ESP32 le nom du réseau 2,4 GHz.
Que signifie WiFi.status() 6 sur l'ESP32 ?
6 correspond à WL_DISCONNECTED : la carte n'est pas connectée, et la tentative de connexion est soit encore en cours, soit en échec. Sur l'ESP32, un mauvais mot de passe donne souvent cette valeur plutôt que 4 (WL_CONNECT_FAILED). Pour connaître la vraie cause, regarde le code reason de l'événement ARDUINO_EVENT_WIFI_STA_DISCONNECTED.
Pourquoi mon ESP32 se déconnecte-t-il sans arrêt du WiFi ?
Les principales causes des coupures à répétition sont un signal faible, une alimentation qui ne suit pas les pics de courant du WiFi, du métal ou une batterie devant l'antenne et le band steering de la box. Rapproche la carte de la box, ajoute un condensateur de 100 à 470 µF entre 3V3 et GND et désactive le modem sleep avec WiFi.setSleep(false). Écris aussi ton code pour qu'il se reconnecte tout seul après une coupure.
Un ESP32 peut-il se connecter au partage de connexion d'un téléphone ?
Oui, à condition que le partage de connexion émette en 2,4 GHz. Sur Android, règle la bande du point d'accès sur 2,4 GHz ; sur iPhone, active Optimiser la compatibilité et garde un nom simple. Le test du partage de connexion est le moyen le plus rapide de savoir si le problème vient de ta box ou de l'ESP32.
Un ESP32 peut-il se connecter à eduroam ou au réseau de l'école ?
L'ESP32 peut rejoindre des réseaux WPA2-Enterprise comme eduroam grâce à la variante WiFi.begin(nom, WPA2_AUTH_PEAP, identité, utilisateur, mot de passe) du core Arduino de l'ESP32. Sur les réseaux qui ouvrent une page de connexion dans le navigateur (portail captif), en revanche, l'ESP32 ne peut pas remplir cette page. Le mieux est de demander d'abord au service informatique et, si possible, d'obtenir un compte dédié aux appareils.
Projets à réaliser après cet article
Voir tous les projets
Connexion Wi-Fi STA ESP32 (avec écran LCD)
Dans ce projet, nous connectons l'ESP32 au réseau Wi-Fi domestique en mode Station (STA) de manière sécurisée et tolérante aux pannes. Nous isolons SSID/mot de passe dans un fichier `secrets.h` pour empêcher leur fuite sur Git, mettons en place une reconnexion automatique, et affichons le niveau RSSI et l'adresse IP sur un écran LCD I2C. La LED intégrée sert d'indicateur d'état.

Serveur Web asynchrone ESP32 (avec affichage de l'adresse IP sur l'écran LCD)
Dans ce projet, nous transformons l'ESP32 en un **serveur web asynchrone** que vous pouvez contrôler depuis votre téléphone ou votre ordinateur connecté au même réseau Wi-Fi. Grâce à la bibliothèque ESPAsyncWebServer, le serveur peut traiter plusieurs requêtes simultanément (contrairement au classique `WebServer.h` qui se bloque sur une seule requête). Depuis votre navigateur, vous pourrez vous connecter à l'adresse IP de l'ESP32, puis allumer et éteindre la LED co

ESP32 mDNS : accès à l'appareil via bluegrays-esp.local (avec écran LCD)
Dans ce projet, en ajoutant un service mDNS (Multicast DNS) à l'ESP32, nous permettons d'accéder à l'appareil via un nom d'hôte lisible, tel que `bluegrays-esp.local`, plutôt qu'à l'aide d'une adresse IP. Même si l'adresse IP attribuée par le DHCP venait à changer, vous pourrez toujours accéder à l'appareil sous le même nom. En exécutant également un petit serveur web sur l'appareil, nous envoyons des commandes de contrôle des LED depuis un navigateur via l'adresse `http://bluegrays-esp.local/`.

ESP32 : heure réelle depuis Internet via NTP
L'ESP32 se connecte au Wi-Fi et récupère l'heure réelle avec une précision de la milliseconde depuis des serveurs NTP (Network Time Protocol). Grâce à `configTzTime()`, le fuseau horaire de la Turquie (TRT, UTC+3) est appliqué automatiquement et le passage DST est géré via la chaîne POSIX TZ. L'heure est affichée sur le moniteur série et sur un écran LCD I2C en option. `configTzTime()` démarre le service SNTP ; des resynchronisations périodiques ont lieu tant que l'accès au réseau est disponible

ESP32 HTTPClient + API météo (avec écran LCD)
Dans ce projet, nous effectuons un appel REST à l'API météo (wttr.in) via Internet à l'aide de l'ESP32 et de la bibliothèque `HTTPClient.h`. À l’aide d’ArduinoJson v7, nous analysons la réponse JSON renvoyée et affichons les informations relatives à la ville, à la température, à l’humidité, à la météo et au vent sur un écran LCD I2C, en turc et en anglais. wttr.in est gratuit et ne nécessite pas de clé API : il suffit de saisir le nom d’une ville pour obtenir les conditions météo en temps réel d

Mise à jour OTA de l'ESP32 — Installation sans fil du firmware (avec écran LCD)
Dans ce projet, vous allez apprendre à installer un nouveau firmware sur l'ESP32 via Wi-Fi, sans câble USB. Grâce à la bibliothèque `ArduinoOTA`, l'ESP32 devient visible sur le réseau et apparaît automatiquement sous le nom `bluegrays-ota` dans l'onglet « Network port » de l'IDE Arduino. La première installation s'effectue via USB, puis toutes les mises à jour se font sans fil — une fonctionnalité essentielle pour les appareils sur le terrain. L'écran LCD I2C affiche l'état du Wi-Fi, l'adresse I

Compteur ESP32 WebSocket (2 boutons + écran LCD + affichage Web en temps réel)
Dans ce projet, deux boutons reliés à l'ESP32 (GPIO 5 incrémente, GPIO 4 décrémente) modifient un compteur. La valeur se met à jour instantanément sur un écran LCD I2C 16x2 et, grâce au support WebSocket d'ESPAsyncWebServer, dans tous les navigateurs connectés sans recharger la page. Au lieu du polling HTTP, une seule connexion persistante est utilisée et l'ESP32 envoie la nouvelle valeur à tous avec ws.textAll().

Système d'Alarme de Mouvement ESP32 (PIR + Buzzer + LED + Telegram)
Un système d'alarme de sécurité intelligent qui active le buzzer et la LED lorsque le capteur PIR détecte un mouvement, tout en envoyant une notification instantanée au propriétaire via Telegram. Il intègre un délai d'attente de 30 secondes pour limiter la fréquence des alarmes répétées ; ce mécanisme ne vérifie pas la validité des détections du capteur PIR et n'élimine pas les faux déclenchements. Idéal pour la sécurité domestique, la surveillance de garage, d'entrepôts ou de bureaux. Avec l'ES
Autres articles
Application BlueGrays
Réalise ce montage pas à pas sur ton téléphone
Schéma, code et liste des composants sur un seul écran. Plus de 160 projets Arduino, ESP32 et Pico à réaliser.
Scanne avec ton téléphone
Pointe l’appareil photo vers le code : la boutique d’applications de ton téléphone s’ouvre.
ou ouvre la boutique

