Variables Globales trop importantes

Bonjour.
Dans le cadre de mon projet pour le bac (même si ce dernier est annulé…) j’ai besoin de faire un code assez conséquents…
Problème, lorsque que je téléverse, on m’indiques que les variables globales sont trop importantes… Et c’est vrai qu’il s’avère que j’utilise pas mal de bibliothèque je trouve. J’utilise un shield wifi qui a un port de carte micro-sd, je me demandais si il était pas possible de mettre le code ou les bibliothèques dessus et cela prendrais moins de place. J’ai suivi un tutoriel open class room sur le shield wifi et le stockage sur la carte sd, mais ça ne m’aide pas suffisamment…
voici mon code (pas forcément très optimisées :l)

#include <WiFi.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <SparkFun_ADXL345.h>
#define USE_ARDUINO_INTERRUPTS true
#include <PulseSensorPlayground.h>
const int OUTPUT_TYPE = SERIAL_PLOTTER;



//pulse
const int pulse = 0;
int Signal;
PulseSensorPlayground pulseSensor;
int ThresholdPulse = 440;
byte samplesUntilReport;
const byte SAMPLES_PER_SERIAL_SAMPLE = 10;
int bpmsee=0;
int pulsesee=0;

ADXL345 adxl = ADXL345(); 
byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char ssid[] = "Livebox-51B0";        // nom du reseau
char pass[] = "cuePaRNRqX4ygEhrAe";      // mot de passe
boolean messageOK=1; // fonction de debug
int stat=0;



WiFiServer server(80);      // Création d'un serveur sur le port 80
const int pinLedV = 3;
const int pinLedR = 2;
const int buzz = 4;
String data;


IPAddress server_addr(10,0,1,35);  // Ip mysql
char user[] = "root";              // username
char password[] = "none";        // mdp

WiFiClient client;
char INSERT_SQL[] = "INSERT INTO test_arduino.hello_arduino (message) VALUES ('Hello, Arduino!')";
MySQL_Connection conn((Client *)&client);














void setup(){
  Serial.begin(9600);     // On ouvre un port serie pour tester le fonctionnement
  Serial.println("Fonction disponible :");
  Serial.println("BpmOn : affiches le nombre de battement par minute du capteur cardiaque (moniteur série)");
  Serial.println("BpmOff : enlève l'affichages du nombre de battement par minute du capteur cardiaque (moniteur série)");
  Serial.println("PulseOn : affiche les ligne des battement du capteur cardiaque (traceurs série)");
  Serial.println("PulseOff : enlève l'affichages des ligne des battement du capteur cardiaque (traceurs série)");
  Serial.println("BugOn : affiches les message important des différente étapes");
  Serial.println("BugOff : enlève l'affichages des message important des différente étapes");
  Serial.println("help : affiches les fonction disponnibles");
  Serial.println("-----------------------------------------------------------------------------------------------------------");
  
  
  //Wifi connection
  messagebug("tentative de connexion wifi et création du serveur");
  if (WiFi.begin(ssid,pass)==WL_CONNECTED){   // Connexion au reseau wifi
    server.begin();     // Ouverture du serveur
    messagebug("connexion web http://")
    ;  // Affichage de l'adresse à utiliser sur le navigateur
    Serial.println(WiFi.localIP());
    digitalWrite(pinLedR, LOW);
    digitalWrite(pinLedV, HIGH);
    delay(2000);
    }
  else {
    messagebug("Probleme de connexion au reseau wifi!");
    digitalWrite(pinLedR, HIGH);
    digitalWrite(pinLedV, LOW);
    }

  //MySQL connection
   messagebug("connexion à la base de données");
   if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
    messagebug("connexion à la base de données réussi");
    digitalWrite(pinLedR, LOW);
    digitalWrite(pinLedV, HIGH);
  }
  else{
    messagebug("connexion à la base de données à échoué");
    digitalWrite(pinLedR, HIGH);
    digitalWrite(pinLedV, LOW);
  }

  //ADXL setup
  adxl.powerOn();
  adxl.setRangeSetting(16); 
  adxl.setSpiBit(0);
  adxl.setActivityXYZ(1, 0, 0);
  adxl.setActivityThreshold(5);
  adxl.setInactivityXYZ(1, 0, 0); 
  adxl.setInactivityThreshold(75);
  adxl.setTimeInactivity(0.9);
  adxl.setFreeFallThreshold(5);
  adxl.setFreeFallDuration(20);
  adxl.InactivityINT(1);
  adxl.ActivityINT(1);
  adxl.FreeFallINT(1);
  messagebug("adxl correctement démaré");
  
  digitalWrite(buzz, LOW);
  pulseSensor.analogInput(pulse);
  pulseSensor.setSerial(Serial);
  pulseSensor.setOutputType(OUTPUT_TYPE);
  pulseSensor.setThreshold(ThresholdPulse);
  if (pulseSensor.begin()){
    messagebug("capteur cardiaque corectement installé");
  }
  else {
    messagebug("problème avec le capteur cardiaque");
   
  }
  
}
void loop(){ 
  PULSE();
  ADXLSET();
  ADXL_TRM();
  bpm();
  debugentree();

    // A VOIR AVEC KIAN
    //a envoyer au php
 data = "led" + stat;
 messagebug(data);

phpenvoie();

}

void PULSE(){
  
  Signal = analogRead(pulse);
  if (pulsesee==1){
    Serial.println(Signal);
  }
}

void ADXLSET() {
  int x,y,z;   
  adxl.readAccel(&x, &y, &z);
}

void ADXL_TRM() {
  
  byte interrupts = adxl.getInterruptSource();

  //chute?
  if(adxl.triggered(interrupts, ADXL345_FREE_FALL)){
    Serial.println("Chute");
    delay(4000);
    if(adxl.triggered(interrupts, ADXL345_INACTIVITY)){
    Serial.println("Inactivité");
     digitalWrite(buzz, HIGH);
    }
   delay(4000);
   if(adxl.triggered(interrupts, ADXL345_INACTIVITY)){
    Serial.println("Inactivité");
     digitalWrite(buzz, HIGH);
    }
  }

 }
 
void phpenvoie(){
delay(2000);

  messagebug("Recording data.");

  // Initiate the query class instance
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  // Execute the query
  cur_mem->execute(INSERT_SQL);
  // Note: since there are no results, we do not need to read any data
  // Deleting the cursor also frees up memory used
  delete cur_mem;
}


void bpm(){
  int bpm = pulseSensor.getBeatsPerMinute();
  if (pulseSensor.sawStartOfBeat()){
    if (bpmsee==1) {
      Serial.println(bpm);
    }
  }
  delay(20);
}


void debugentree () {
  String chaine ="";
  while (Serial.available()) {
    delay(10);
    char c=Serial.read();
     if (c != 10 && c != 13) { //nettoyage de la chaine
      chaine += c; //on ajoute le caractère
    }
    
  }
    if (chaine == "PulseOn") {
      pulsesee=1;
      Serial.println("affichage des pulse ON");
      chaine = "";
      return;
    }

    else if (chaine == "PulseOff") {
      pulsesee=0;
      Serial.println("affichage des pulse OFF");
      chaine = "";
      return;
    }
  
    else if (chaine == "BpmOn") {
      bpmsee=1;
      Serial.println("affichage des bpm ON");
      chaine = "";
      return;
    }

    else if (chaine == "BpmOff") {
      bpmsee=0;
      Serial.println("affichage des bpm OFF");
      chaine = "";
      return;
    }

    else if (chaine == "BugOn") {
      bug(1);
      chaine = "";
      return;
    }
  
    else if (chaine == "BugOff") {
      bug(0);
      chaine = "";
      return;
    }

    else if (chaine == "help") {
      Serial.println("Fonction disponible :");
      Serial.println("BpmOn : affiches le nombre de battement par minute du capteur cardiaque (moniteur série)");
      Serial.println("BpmOff : enlève l'affichages du nombre de battement par minute du capteur cardiaque (moniteur série)");
      Serial.println("PulseOn : affiche les ligne des battement du capteur cardiaque (traceurs série)");
      Serial.println("PulseOff : enlève l'affichages des ligne des battement du capteur cardiaque (traceurs série)");
      Serial.println("BugOn : affiches les message important des différente étapes");
      Serial.println("BugOff : enlève l'affichages des message important des différente étapes");
      Serial.println("help : affiches les fonction disponnibles");
      Serial.println("-----------------------------------------------------------------------------------------------------------");
    return;
    }
}

void bug(boolean b) {
  messageOK = b;
  if (messageOK) {
    Serial.println("Mode bug ON");
    return;
  }
  Serial.println("Mode bug OFF");
}


void messagebug(String s){
  if (messageOK){
    Serial.println(s);
  }
}

Merci beaucoup ! :wink:

D'abord évite de mettre ton password en clair sur un forum. Modifie ton code pour le cacher.

Ensuite tu peux gagner un peu d'espace en utilisant la fonction F dans tes print, voir ici, ça libérera un peu de mémoire.

je me demandais si il était pas possible de mettre le code ou les bibliothèques dessus et cela prendrais moins de place

Tu rêves. L'ARDUINO n'est pas une RASPBERRY PI (pour rester dans le monde embarqué).

Et la solution de faire un programme interprétateur? Et que tout le code soit dans un fichier (ou plusieurs) sur la SD. Je reprends ce qui existait dans mes débuts avec les TO7 et ZX81. L'interprétateur basique sur un TO7, c'est de mémoire 8Ko!

Ça n'a sans doute pas un gros intérêt à émuler un plus gros système, autant changer de carte, mais d'un point de vue mathématiques pure, c'est un jeu comme un autre. Il y aurait un problème de lenteur.

Le problème est que la librairie SDFat consomme énormément de ressources mémoire.
Je ne connais pas pire.

Exemple ici : RitonDuino: Un WEB server ARDUINO sur Ethernet (avec graphes HighCharts)

L'ajout du stockage de fichiers HTML sur SD m'oblige à changer pour une MEGA.

Effectivement, j'ai le même problème. Je me demande si je n’aurai pas intérêt à me réécrire cette partie. Plus de 800 octets de données c'est beaucoup. Je me dis aussi que j'en ai rien à faire de la partie FAT12 par exemple. Pour les fonctions qui ne m'intéressent pas, il est possible qu'elles ne soient pas dans le code final.

Je suis d'ailleurs prêt à sacrifier les sous répertoires pour gagner des octets.

Dans mon (ex) job j’avais écrit des pilotes de SD en SPI pour un ATMEL ARM7TDMI.
Au départ on travaillait avec des SD de quelques Mo, ensuite le code a évolué pour accepter les SDHC.

Rien n’est infaisable.

L’énorme avantage est qu’il serait certainement possible d’utiliser de vieilles SD de quelques Mo, largement suffisantes sur ARDUINO, alors qu’actuellement avec SDFat elles ne sont pas acceptées.
De plus, certaines SD actuelles ne fonctionnent pas.

Les librairies SD et SDFat me donnent peu de satisfaction.
J’évite autant que possible.
Je préfère utiliser un ESP32 qui dispose de FATFS en FLASH, et récupérer les données via HTTP.

De plus, certaines SD actuelles ne fonctionnent pas.

Je ne suis pas sûr que cela règlerait le problème, car il faut avoir tous les protocoles de toutes les cartes et les essayer. Il en en aura forcément qui passeront au travers.

Sûr que ce n'est pas impossible, mais il y a quand même du boulot.

Non, en SPI pas besoin de spécifs. Tout est standard.

Il y a deux standards : la SD classique 1.X, autrefois appelée MMC, et la SDHC 2.X.

C'est certainement d'ailleurs pour cela que SD et SDFat n'acceptent pas les anciennes SD.
Ils ont implémenté le SDHC 2.X et c'est tout.
Pourtant avec ARDUINO ce serait bien utile.
J'ai des vielles SD et j'ai même des lecteurs SD (pas micro, je dis bien SD).
D'ailleurs le format SD se vend toujours. Sandisk en fabrique.


On en trouve même chez Boulanger.

Mais toutes les SDHC passent?

Et si les SD ne passent par pourquoi il parlent de la FAT16?

Et ta photo, c'est pas une SD, c'est une SDXC. La SD est limitée à 2Go
Je n'ai pas vu de Sd chez boulanger

Pour pas payer pas payer trop chère une carte pour une uno, j'avais cherché, je n'ai pas trouvé de carte de moins de 8Go.

Je parle de SD : le format physique, donc les dimensions.

Et si les SD ne passent par pourquoi il parlent de la FAT16?

Peut-être en partitionnant une SD en partitions < 2Go.

Je parle de SD : le format physique, donc les dimensions.

Désolé, c'est vrai que c'est ambigu. Pour moi le format m'intéresse car une microSD c'est presque uniquement si on la laisse en place. Pour passer des données, c'est pas d'un pratique fou! Le grand format est vendu partout.

Mais alors c'est quoi qui ne passe pas?

Le protocole SDHC n'est pas le même que SD ou MMC.
Il faudrait regarder dans les librairies SD et SDFat mais je suis pratiquement sûr que le 1.X n'est pas implémenté.

J'ai essayé de regarder dedans, mais c'est pas les commentaires qui les étouffent. Pour comprendre ce qu'ils ont fait, il est nécessaire de comprendre le protocole. Du coup ce qui a été fait n'est pas si indispensable que ça

En fait on peut se contenter que du protocole SDHC. Je mets ça sur un coin de l'oreiller...

Je viens de vérifier dans la librairie SDFAT.
Il semblerait que les SD (non HC) soient prises en compte.

J'ai bien quelques SD 8Mo 16MO mais aucune ne passe.
Il se peut qu'il s'agisse d'un problème de tension.

A l'heure actuelle cela a peu d'intérêt de toutes façons.

La SdFat n'admet par défaut que le Fat16 et Fat32. Tes cartes ne serait-elles pas en Fat12?

D'après ce que j'ai compris les cartes démarreraient en 3,3V puis passerait en plus basse tension avec accord bilatéral. Du coup, cela devrait passer.


SdFat c'est un bel ensemble de 63 fichiers h et cpp. Pas facile de voir quelque chose. Sur la classe SdFatEX, je n'ai trouvé que des commentaires!


Je suis en train de me prendre la tête avec la SdFat. J'avais un programme qui tournait bien en Fat, je veux passer en SdFat parce que les accès sont plus rapides (50%) et je bug.

J'ai écris de quoi lire et écrire les .bmp, et un format perso, j'arrive à écrire un ficher basique en SdFat qui écrit dans un fichier et qui le relit, mais je bug a mettre les deux ensembles. J'y cois pas!

Non, j’ai reformaté en FAT16.

Je suis en train de me documenter sur des flash SPI du genre W25Q32 ou W25Q128.

Je pense à un ESP32 monté en serveur FTP pour mettre les fichiers dans la FLASH.

Après chargement, on peut insérer la FLASH sur un montage à base d’ARDUINO.
Librairie : SerialFlash.

Je suis un peu à l'inverse, la SDHC grand format m'intéresse pour passer des fichiers de l'ordi à l'arduino. Comme je le fais pour passer les infos se la caméra à l'ordi actuellement. Disons que cela remplace les disquettes. J'ai commencé ma vie avec des disquettes de 7 pouces, puis celle de 5 pouces, puis celles de 3.5 pouces, les SDHC c'est environ du 1.5 pouce... Mais je ne veux pas descendre et prendre la pince à épiler pour les microSC.

La possibilité de mettre une carte SDHC sur un ordi portable est presque indispensable.

pour revenir à la question d'origine, faire un nettoyage avec de F("") devrait donner de bons résultats déjà...

Rien que sur ces parties y'en a des octets !!

Serial.println("Fonction disponible :");
  Serial.println("BpmOn : affiches le nombre de battement par minute du capteur cardiaque (moniteur série)");
  Serial.println("BpmOff : enlève l'affichages du nombre de battement par minute du capteur cardiaque (moniteur série)");
  Serial.println("PulseOn : affiche les ligne des battement du capteur cardiaque (traceurs série)");
  Serial.println("PulseOff : enlève l'affichages des ligne des battement du capteur cardiaque (traceurs série)");
  Serial.println("BugOn : affiches les message important des différente étapes");
  Serial.println("BugOff : enlève l'affichages des message important des différente étapes");
  Serial.println("help : affiches les fonction disponnibles");
  Serial.println("-----------------------------------------------------------------------------------------------------------");
      Serial.println("Fonction disponible :");
      Serial.println("BpmOn : affiches le nombre de battement par minute du capteur cardiaque (moniteur série)");
      Serial.println("BpmOff : enlève l'affichages du nombre de battement par minute du capteur cardiaque (moniteur série)");
      Serial.println("PulseOn : affiche les ligne des battement du capteur cardiaque (traceurs série)");
      Serial.println("PulseOff : enlève l'affichages des ligne des battement du capteur cardiaque (traceurs série)");
      Serial.println("BugOn : affiches les message important des différente étapes");
      Serial.println("BugOff : enlève l'affichages des message important des différente étapes");
      Serial.println("help : affiches les fonction disponnibles");
      Serial.println("-----------------------------------------------------------------------------------------------------------");

et en enlevant les fautes d'orthographe on doit gagner encore quelques octets (ou en perdre) :confused: :grin: