Hello,
Mon projet sur ESP32 commence à devenir un peu complexe et je me suis donc décidé à le réécrire en créant des "bibliothéques". j'ai regardé plusieurs tuto, je me suis bien renseigné mais ça ne compile toujours pas, je ne comprends pas pourquoi....
j'ai essayé juste de creer un fichier pour le wifi. Mon code fonctionne bien si tout est dans le fichier ino principal.
Si quelqu'un a une idée....
Merci!
Mon fichier principal :
#include "wificonnect.h"
void setup() {
Serial.begin(115200);
wificonnect();
}
void loop() {
// put your main code here, to run repeatedly:
}
Merci pour la reponse , j'ai fait ces modifications mais ca ne marche toujours pas...
Voici ce que me dit mon compilateur:
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/Test_CPP_wifi.ino:4:1: error: expected initializer before 'void'
4 | void setup() {
| ^~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/Test_CPP_wifi.ino: In function 'void setup()':
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/Test_CPP_wifi.ino:6:3: error: 'wificonnect' was not declared in this scope
6 | wificonnect();
| ^~~~~~~~~~~
In file included from /Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_wifi/include/esp_private/esp_wifi_types_private.h:22,
from /Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_wifi/include/esp_wifi_types.h:11,
from /Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/libraries/WiFi/src/WiFiType.h:27,
from /Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/libraries/WiFi/src/WiFi.h:32,
from /Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:3:
/Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_hw_support/include/esp_interface.h:14:1: error: expected initializer before 'extern'
14 | extern "C" {
| ^~~~~~
/Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_wifi/include/esp_wifi_types.h:30:19: error: 'ESP_IF_WIFI_STA' was not declared in this scope
30 | WIFI_IF_STA = ESP_IF_WIFI_STA,
| ^~~~~~~~~~~~~~~
/Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_wifi/include/esp_wifi_types.h:31:19: error: 'ESP_IF_WIFI_AP' was not declared in this scope; did you mean 'ESP_ERR_WIFI_BASE'?
31 | WIFI_IF_AP = ESP_IF_WIFI_AP,
| ^~~~~~~~~~~~~~
| ESP_ERR_WIFI_BASE
/Users/julienlegrand/Library/Arduino15/packages/esp32/tools/esp32-arduino-libs/idf-release_v5.1-33fbade6/esp32/include/esp_wifi/include/esp_wifi_types.h:33:19: error: 'ESP_IF_WIFI_NAN' was not declared in this scope; did you mean 'ESP_ERR_WIFI_BASE'?
33 | WIFI_IF_NAN = ESP_IF_WIFI_NAN,
| ^~~~~~~~~~~~~~~
| ESP_ERR_WIFI_BASE
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:5:1: error: 'ssid' does not name a type
5 | ssid = "XXXXX";
| ^~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:6:1: error: 'password' does not name a type
6 | password = "XXXX";
| ^~~~~~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:9:20: error: initializer provided for function
9 | void wificonnect() (
| ^
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:12:3: error: 'WiFi' does not name a type
12 | WiFi.begin(ssid, password);
| ^~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:13:3: error: expected unqualified-id before 'while'
13 | while (WiFi.status() != WL_CONNECTED) {
| ^~~~~
In file included from /Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/cores/esp32/Arduino.h:200,
from /Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:1:
/Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/cores/esp32/HardwareSerial.h:356:16: error: 'Serial0' does not name a type; did you mean 'Serial'?
356 | #define Serial Serial0
| ^~~~~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:17:3: note: in expansion of macro 'Serial'
17 | Serial.println(" CONNECTED");
| ^~~~~~
/Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/cores/esp32/HardwareSerial.h:356:16: error: 'Serial0' does not name a type; did you mean 'Serial'?
356 | #define Serial Serial0
| ^~~~~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:18:3: note: in expansion of macro 'Serial'
18 | Serial.print("Adresse IP: ");
| ^~~~~~
/Users/julienlegrand/Library/Arduino15/packages/esp32/hardware/esp32/3.0.5/cores/esp32/HardwareSerial.h:356:16: error: 'Serial0' does not name a type; did you mean 'Serial'?
356 | #define Serial Serial0
| ^~~~~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:19:3: note: in expansion of macro 'Serial'
19 | Serial.println(WiFi.localIP());
| ^~~~~~
/Users/julienlegrand/Library/CloudStorage/OneDrive-Personnel/0000 - DIY/Arduino/Test_CPP_wifi/wificonnect.cpp:21:1: error: expected unqualified-id before ')' token
21 | )
| ^
exit status 1
Compilation error: expected initializer before 'void'
Éditez votre post et rajoutez les balises de code autour de la sortie du compilateur
Sans vos 3 fichiers c’est difficile de dire où est le problème. Postez les avec aussi les balises de code. Il y a sans doute une erreur de syntaxe dans le .h
Bonjour, Merci de votre aide,
Il manquait en effet le ; après la déclaration de fonction dans le header. (j'ai corrigé directement mon code ci dessus)
Pour les variables de connexion, elles sont renseignées dans le .CPP avant la connexion.
Au début, je les avais mis directement dans le .h, je ne pense pas que ça change grand chose.
j'ai moins d'erreur en rajoutant le ; mais il en reste en compilant le .cpp :
error: 'Serial' does not name a type
Serial.printf("Connecting to %s ", ssid);
^~~~~~
idem pour les fonction wifi. pourtant, je declare bien Arduino.h dans le CPP ainsi que wifi.h
elles sont déclarées dans le .h, en les notant extern, vous n'allouez pas de mémoire vous dites juste au compilateur "il va exister quelque part deux variables qui s'appellent ssid et password et qui seront de type const char *.
Donc ensuite, quelque part, pour que l'édition de lien fonctionne et que le compilateur s'y retrouve, il faut tenir votre promesse et définir (allouer la mémoire) les 2 constantes. Cela se fait avec l'écriture standard où l'on donne le type puis le nom de la variable et sa valeur.
Merci beaucoup de votre aide, tout a l'air de fonctionner (ca compile mais je n'ai pas d'ESP sous la main )
Je n'ai pas encore tout compris pour le déclaration de variable mais pour le reste c'etait des choses bêtes.... le C++ est rigoureux!!
Pour la programmation en général il faut être rigoureux oui.
La déclaration d'une variable informe le compilateur de son type et de son nom sans allouer de mémoire. Par exemple, avec extern int nombre;, on déclare que la variable nombre est de type entier, sans réserver d'espace mémoire. Cela signifie simplement qu'à la phase de "liens" du processus de compilation, le compilateur devra trouver un endroit où stocker cette variable (son adresse) lorsque tous les fichiers seront assemblés.
C'est ce que permet la définition d'une variable. On réserve de la mémoire pour celle-ci. Par exemple, écrire int nombre; définit la variable nombre, ce qui signifie que de la mémoire est allouée pour elle. On peut également initialiser la variable en même temps en écrivant int nombre = 42;, ce qui réserve de la mémoire et lui attribue une valeur initiale.
En C++, une variable (globale) ne doit être définie qu'une seule fois dans l'ensemble du programme pour éviter des conflits. Cependant, elle peut être déclarée plusieurs fois, ce qui est particulièrement utile lors de l'utilisation de fichiers d'en-tête (.h)
Lorsqu'une variable est déclarée dans un fichier d'en-tête avec extern, par exemple, extern int nombre;, cela permet à plusieurs fichiers source d'inclure ce fichier d'en-tête sans redéfinir la variable. Ainsi, chaque fichier source peut voir la déclaration de la variable, mais seule la définition réelle, comme int nombre;, doit se trouver dans un seul fichier source pour allouer de la mémoire.
➜ Cela garantit que le compilateur sait où trouver la variable lors de l'édition de liens, évitant ainsi les erreurs de redéfinition.