ESP_wroom_32 manque de mémoire

Bonjour,

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).

Merci de votre attention.

Bonsoir @jef59

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 ?

La première chose que je regarderais est l'instanciation d'une classe dans la fonction loop

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)

par contre si l'alternance WiFI / BLE te convient tu as içi un exemple proposé en exemple pour la bibliothèque WiFI
https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiBlueToothSwitch/WiFiBlueToothSwitch.ino

Vu que l'antenne est commune , il me semble que cela se bousculerait au portillon.
Bon, moi et la radio.........
Séquence rétro :
image

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 vais lire les liens de @al1fch.

A suivre.

Au delà des capacité physique, tu peux te poser la question de l'utilité d'avoir en même temps le Bluetooth et le wifi.

Merci pour cette remarque, c'est du bon @terwal :wink:

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...

A réfléchir dirait @terwal :thinking:

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 :slight_smile:
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 :slight_smile: .

Cool, si ca fait ce que tu veux :slight_smile:

Bonjour,

@terwal
Si on considére que ce que je veux faire existe déja dans le commerce, ça ne sert qu'à me faire plaisir de le faire moi même.

Au départ, j'étais arrivé à faire cela

C'est déja pas mal, on peut même sans probléme interagir avec Android, son tel portable et une appli.

Mais l'idée m'a pris d'essayer avec mon petit niveau de remplacer le HC05 par un ESP Wroom.

Donc avoir la possibilité d'utiliser le Bluetooth OU le Wifi.

Et qui dit Wifi, dit je pense possibilité d'un serveur accessible par Internet, je n'en suis pas là.

EDIT

J'oubliais.
J'aimerais aussi que mon systéme d'entrées/Sorties puisse fonctionner si je n'ais plus ni wifî ni Bluetooth.

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.

Cette remarque m'interesse

Tu peux developper STP?

Bonjour

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..

https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/coexist.html
res

' 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..... :wink:

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

J'ai exactement cela sur le capot

@le_viking
Je ne suis pas plus avancé

Je ne suis pas un fabricant!

C'est le

[quote="le_viking, post:15, topic:1304383"]
soit en Wifi soit en bluetooth
[/quote] qui ne colle pas?

Je ne fais pas expés, mais je ne vois pas!

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

oui mais ce n'est pas un ESP32 :slight_smile:
Dans votre smartphone, vous avez plusieurs antennes, dédiées à la téléphonie cellulaire, le BT, le WiFi, le GPS...

sur l'ESP32 il n'y a qu'une seule antenne partagée entre le WiFi et le BT ce qui emmène des contraintes sur l'usage, comme l'a dit @al1fch

Je ne dis pas qu'il n'y a pas de contrainte, mais pour l'utilisateur c'est transparent c'est juste un partage de temps.

oui, tout à fait.

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.