Fidéle à ma méthode d'apprentissage, j'aime bien partir d'un truc qui marche, le casé dans un sketch et le comprendre et améliorer aprés si j'en suis capable.
Je ne suis pas fortiche en code.
Là j'ai essayé d'utiliser un ESP32 pour beneficier de sa capacité à "capter" du Bluetooth et du WIFI, pour ensuite envoyer par une liaison série filaire des messages à un Arduino qui pilotera des sorties (relais) en fonction de cela.
J'arrive à faire ou l'un ou l'autre (Wifi ou Bluetooth) mais pas les 2 pour, selon ce que je lis, un problème de mémoire (tailles des bibliothèques peut-être?).
Voici le code ou j'ai mis les 2 (BLE et WIFI)
#include <WiFi.h>
#include "BluetoothSerial.h"
const char* ssid = "Gite";
const char* password = "2011";
char* message = "R00000000F";
#define RXD2 16// 16 RX esp <--pont diviseur-- uno TX 3
#define TXD2 17// 17 TX esp -----------------> uno RX 2
WiFiServer server(80);
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error not enabled!
#endif
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32BT"); //Nom du Bluetooth
Serial1.begin(9600, SERIAL_8N1, RXD2, TXD2);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
server.begin();
}
void loop() {
if (SerialBT.available()) {
Serial1.write(SerialBT.read());
}
delay(20);
WiFiClient client = server.available();
if (client) {
String req = client.readStringUntil('\r');
delay(30);
client.flush();
if (req.indexOf("/S1F") != -1){
message = "R1xxxxxxxF";}
if (req.indexOf("/S1O") != -1){
message = "R0xxxxxxxF";
}
if (req.indexOf("/S2F") != -1){
message = "Rx1xxxxxxF";
}
if (req.indexOf("/S2O") != -1) {
message = "Rx0xxxxxxF";
}
if (req.indexOf("/S3F") != -1) {
message = "Rxx1xxxxxF";
}
if (req.indexOf("/S3O") != -1) {
message = "Rxx0xxxxxF";
}
if (req.indexOf("/S4F") != -1) {
message = "Rxxx1xxxxF";
}
if (req.indexOf("/S4O") != -1) {
message = "Rxxx0xxxxF";
}
if (req.indexOf("/S5F") != -1) {
}
if (req.indexOf("/S5O") != -1) {
message = "Rxxxx0xxxF";
}
if (req.indexOf("/S6F") != -1) {
message = "Rxxxxx1xxF";
}
if (req.indexOf("/S6O") != -1) {
message = "Rxxxxx0xxF";
}
if (req.indexOf("/S7F") != -1) {
message = "Rxxxxxx1xF";
}
if (req.indexOf("/S7O") != -1) {
message = "Rxxxxxx0xF";
}
if (req.indexOf("/S8F") != -1) {
message = "Rxxxxxxx1F";
}
if (req.indexOf("/S8O") != -1) {
message = "Rxxxxxxx0F";
}
Serial.println(message);
Serial1.println(message);
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
s += "<!DOCTYPE HTML>\r\n<html>";
s += "<h1>CONTROLE DES SORTIES:</h1>";
s += "<p><a href=\"/S1F\"><button>S1 ON</button></a></p>";
s += "<p><a href=\"/S1O\"><button>S1 OFF</button></a></p>";
s += "<p><a href=\"/S2F\"><button>S2 ON</button></a></p>";
s += "<p><a href=\"/S2O\"><button>S2 OFF</button></a></p>";
s += "<p><a href=\"/S3F\"><button>S3 ON</button></a></p>";
s += "<p><a href=\"/S3O\"><button>S3 OFF</button></a></p>";
s += "<p><a href=\"/S4F\"><button>S4 ON</button></a></p>";
s += "<p><a href=\"/S4O\"><button>S4 OFF</button></a></p>";
s += "<p><a href=\"/S5F\"><button>S5 ON</button></a></p>";
s += "<p><a href=\"/S5O\"><button>S5 OFF</button></a></p>";
s += "<p><a href=\"/S6F\"><button>S6 ON</button></a></p>";
s += "<p><a href=\"/S6O\"><button>S6 OFF</button></a></p>";
s += "<p><a href=\"/S7F\"><button>S7 ON</button></a></p>";
s += "<p><a href=\"/S7O\"><button>S7 OFF</button></a></p>";
s += "<p><a href=\"/S8F\"><button>S8 ON</button></a></p>";
s += "<p><a href=\"/S8O\"><button>S8 OFF</button></a></p>";
s += "</html>";
client.print(s);
}
}
Et le message après téléchargement
*"Le croquis utilise 1672861 octets (127%) de l'espace de stockage de programmes. Le maximum est de 1310720 octets.*
*Les variables globales utilisent 59468 octets (18%) de mémoire dynamique, ce qui laisse 268212 octets pour les variables locales. Le maximum est de 327680 octets.*
*Croquis trop gros; vois https://support.arduino.cc/hc/en-us/articles/360013825179 pour des conseils de réduction.*
*text section exceeds available space in board*
*Compilation error: text section exceeds available space in board"*
Si un expert pouvait m'éclairer et m'orienter vers une piste, je sais, ce sketch n'est qu'une ébauche pour voir si c'est possible d'utiliser WIFI ET BLUE pour communiquer avec un arduino pour pouvoir, au final, utiliser un Raspberry en Interface Homme Machine pour piloter des sorties via un MEGA (par la suite).
la mémoire Flash des ESP32 n'est jamais allouée à 100% au code, un choix de partitionnement est proposé dans le menu Outils. le choix diffère selon les variantes d'ESP32 et de cartes.
Bien souvent le choix Huge APP est là qui fait la part belle au code
Quelles options de partitionnement as-tu testées ?
Coexistence WiFi et BLE avec un ESP32 sous arduino IDE ?
je ne sais pas si c'est possible hors problème de mémoire
(pas évident d'utiliser un module radio unique simultanément avec WiFi et BLE même s'ils partagent la même bande de fréquence)
Merci pour cette piste sérieuse, ça me convient trés bien.
Pour ce qui est du partitionnement de la mémoire, je regarde dés que je peux (PC hors jeux pour l'instant).
Bon, ce probléme de mémoire, ce n'est pas un probléme d'antenne, mais je concois bien qu'il vaut mieux ne pas utiliser le wifi et le bluetooth en même temps, à rajouter dans le code.
Je peux, et je me suis effectivement posé la question.
Réponse, à côté de la plaque:
Il est utile, mais pas indispensable, de pouvoir dans mon cas de figure communiquer en
-filaire si je n'ai ni W ni B
-Wifi si je n'ai pas le B
-Bluetooth si je n'ai pas le W
Donc j'ai envi de tenter le coup.
Mais je ne compte pas utiliser les 3 en même temps.
Question antenne, j'ai aussi des modules HC05 (Bluetooth) et ESP8266 (Wifi), avec chacun leurs antennes. mais je ne comptais pas faire une usine à gaz!
Mon pb reste la mémoire, effectivement le systéme "multi antennes" avec un HC05 + un ESP8266 contourne ce pb je crois.
Et puis avec le ESP8266, je peux gérere 2/3 trucs en // de mon Arduino...
J'ai suivi tes conseils, j’obtiens maintenant "le croquis utilise 1672861 octets (79%) de l'espace de stockage de programmes. Le maximum est de 2097152 octets.
Les variables globales utilisent 59468 octets (18%) de mémoire dynamique, ce qui laisse 268212 octets pour les variables locales. Le maximum est de 327680 octets.
esptool.py v4.6"
avec comme partitionnement
No OTA (2MB APP/2 MB SPIFFS).
Pour l'instant, je n'ai rien testé de plus.
EDIT:
Dans les grande lignes tout marche, j'ai juste quelques pb annexes de connectiques à résoudre je pense.
C'est bien là ou je voulais en venir dans un premier temps
Et il faut avouer que ce n'est pas très clair dans ta description de ta problématique d'espace mémoire lorsque tu essaye d'avoir les deux en même temps.
On peut discuter du sujet, si notre avis t'intéresse, mais à la fin, cela reste ce que tu veux que ton programme fasse.
Après cela peut nous amener à nous poser des questions, du pourquoi tu veux faire ça comme ça aussi.
Par exemple là on se sait pas vraiment ce que tu veux faire et pourquoi tu aurais besoin que ton programme choisisse une communication Bluetooth ou Wifi, je suppose que tu as des terminaux sans Bluetooth ou que tu veux pouvoir gérer plusieurs lien parallèle avec tes terminaux.
Si tu as que des terminaux Bluetooth, qui communiqueront unitairement avec ton ESP32, avoir en plus le WIFI, complexifie ton programme, mai why not .
Comme j'ai dit @J-M-L j'ai acheté un carte wroom et le sujet m'intéresse, n'hésites donc pas à mettre tous les commentaires des tests que tu fais.
Je note avec avec surprise l'occupation mémoire de ce que tu as fais d'autant qu'il est totalement absurde de penser que le module wroom est soit wifi soit bluetooth.
Espressif détaille ici les contraintes et limites de la coexistence WiFi Bluetooth pour les ESP32 dans le cadre d'un développements sous IDF
Reste à voir si les bibliothèques WiFi , BTclassique et BLE du core ESP32 pour Arduino n'ajoutent pas des limites supplémentaires..
' carte Wroom'? c'est vague , les vendeurs sur Amazon , Aliexpress...font peu d'efforts ......
c'est un peu comme dire : j'ai acheté une voiture PureTech.....
Wroom est le nom générique d'une famille de modules sous capot métallique commercialisés par Espressif https://www.espressif.com/en/products/modules
Sous le capot de ces modules peut se loger un ESP32, ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6...... et toutes ces variantes n'ont pas les mêmes fonctionnalités radio, ni les mêmes capacité mémoire
Wroom c'est avant tout un module commercial, quel fabricant va acheter un module pour faire un système communiquant qui va marcher soit en Wifi soit en bluetooth? Si t'actives le bluetooth sur ton téléphone il ne désactive pas le Wifi! @al1fch Wroom-32 correspond à quelque chose de précis chez Espressif bien sur différent si c'est une fabrication de 2018 ou 2023 et le micro est un ESP32-DOWDQ6
sous le capot un ESP32 'première version', (ESP32-D0WD) , seule variante d'ESP32-x à ce jour supportant le Bluetooth Classique, les autres versions ne font que le BLE en matière de Bluetooth
Mais comme il disent dans la doc, la performance n'est pas stable dans certains cas — ce qui a pu conduire à certains souci par le passé mais il semble qu'ils aient amélioré les couches sous-jacentes maintenant.