String et tableau utiliser la Flash plutot que la ram

Bonjour,

J'ai fait une fonction void infoLog( String description, String comment) qui est appelé en boucle si j'ai des changement d'état. Mon bute enregistré un changement d'état des action sur carte sd

exemple:

if (NIVEAU_HAUT_BAC_VIDANGE == HIGH)
infoLog("BAC DE VIDANGE", ".::MODE AUTO::. Marche pompe N°" + String(pumpNumber) );

if (NIVEAU_BAS_BAC_VIDANGE == LOW)
infoLog("BAC DE VIDANGE", ".::MODE AUTO::. Arret pompe N°" + String(pumpNumber) );

if (modeAuto == YES)
infoLog("BAC DE VIDANGE", "Mode automatique actif");
void infoLog( String description, String comment)
{
  char fileName[] = "info.log";
  
  String info = " - [" + description + "] -> " + comment;

  // On ecrit l'information dans le fichier log, a condition qu'il soit different
  if (info != prevInfo)
  { 
    prevInfo = info;

    // On ouvre le fichier, si il n'existe pas il sera cree
    File dataFile = SD.open(fileName, FILE_WRITE);

    // Si le fichier est disponible, il sera cree
    if (dataFile) 
    { // Format d'ecriture du fichier log [JJ/MM/AAAA HH:MM:SS] - [PERIFERIQUE_DEFECTUEUX] -> DESCRIPTION DU PROBLEME
      dataFile.print(writeHourLog()); // la date [JJ/MM/AAAA HH:MM:SS]
      dataFile.println(info);
      dataFile.close();
      Serial.println("Ecriture dans le fichier log");
    }  
    else 
    {
      Serial.println("Impossible d'écrire sur info.log");
    }
    
    Serial.print(writeHourLog());
    Serial.println(info);
  }
}

Si j'ai une seule condition de vrai tout fonctionne bien: il va me marqué 1 fois l'information passé en paramètre.

Mais si j'ai 2 conditions de vrai, il va me marqué les informations à chaque cycle de la boucle.

J'aimerais donc rajouté un paramètre à ma fonction qui correspondrait à l'index d'un tableau:

void infoLog( String description, String comment, byte index)

J'aurais besoin d'aide pour modifier ma fonction.

Lorsque cette partie fonctionnera, je ferais la modif pour utiliser un tableau dynamique: http://playground.arduino.cc/Code/DynamicArrayHelper

Merci

J'ai réussis au final!

J'en ai profité pour doubler la fonction pour gérer le type info et error.

Mais ça me bouffe 2ko de ram pour, j'aurais besoin d'aide pour charger les string en flash

Voila le code:

void dataLog(byte index, byte type, String description)
{
   
  char fileNameInfo[] = "info.log";
  char fileNameError[] = "error.log";
  

  // On ecrit l'info dans le fichier log, a condition qu'il soit different et qu'il soit de type information
  if (description != prevDescription[index] && type == info)
  { 
    prevDescription[index] = description;

    // On ouvre le fichier, si il n'existe pas il sera cree
    File dataFile = SD.open(fileNameInfo, FILE_WRITE);

    // Si le fichier n'existe pas, il sera cree
    if (dataFile) 
    { // Format d'ecriture du fichier log [JJ/MM/AAAA HH:MM:SS] - [PERIFERIQUE_DEFECTUEUX] -> DESCRIPTION DU PROBLEME
      dataFile.print(writeHourLog()); // la date [JJ/MM/AAAA HH:MM:SS]
      dataFile.println(description); // - [PERIFERIQUE_DEFECTUEUX] -> DESCRIPTION DU PROBLEME
      dataFile.close();
      Serial.println("Ecriture dans le fichier log");
    }  
    else 
    {
      Serial.println("Impossible d'ecrire sur info.log");
    }
    
    Serial.print(writeHourLog());
    Serial.println(description);
  }
  
    // On ecrit l'error dans le fichier log, a condition qu'il soit different et qu'il soit de type error
  if (description != prevDescription[index] && type == error)
  { 
    prevDescription[index] = description;

    // On ouvre le fichier, si il n'existe pas il sera cree
    File dataFile = SD.open(fileNameError, FILE_WRITE);

    // Si le fichier n'existe pas, il sera cree
    if (dataFile) 
    { // Format d'ecriture du fichier log [JJ/MM/AAAA HH:MM:SS] - [PERIFERIQUE_DEFECTUEUX] -> DESCRIPTION DU PROBLEME
      dataFile.print(writeHourLog()); // la date [JJ/MM/AAAA HH:MM:SS]
      dataFile.println(description); // - [PERIFERIQUE_DEFECTUEUX] -> DESCRIPTION DU PROBLEME
      dataFile.close();
      Serial.println("Ecriture dans le fichier log");
    }  
    else 
    {
      Serial.println("Impossible d'ecrire sur info.log");
    }
    
    Serial.print(writeHourLog());
    Serial.println(description);
  }
}

Utilisation:

dataLog(0,info," - [BAC DE VIDANGE] -> .::MODE AUTO::. Mode automatique actif");
dataLog(1,error," - [BAC DE VIDANGE] -> .::MODE MANUEL::. Mode manuel actif");
// etc...

Voir là ==> http://arduino.cc/en/Reference/PROGMEM

Merci, j'avais déjà mis le lien...

Je voulais savoir si les chaines de caractère était chargé à la compilation ou si je pouvais mettre des chaines de caractères dynamique et que l'arduino faisait le travail lorsqu'il est lancé?

Puis-je avoir un coup de main pour la mise en place?

dudux2:
Je voulais savoir si les chaines de caractère était chargé à la compilation ou si je pouvais mettre des chaines de caractères dynamique et que l’arduino faisait le travail lorsqu’il est lancé?

PROGMEM → à la compilation (constantes)
En RAM → tu peut les changer si tu veut (pas constantes)

Fichier d’include pour PROGMEM : #include <avr/pgmspace.h>
Type “chaine de char en PROGMEM” = “PGM_P
Pour placer une chaine de char en PROGMEM : PSTR**(“ma chaine de char”)** ou F(“blabla”) (depuis Arduino 1.0.x)
Pour manipuler une chaine en PROGMEM → voir les fonctions de la libc :
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

Ps: log sans faire de vérif, c’est franchement inutile et ça te bouffe de la mémoire pour rien :wink:

void dataLog(byte type, PGM_P description) {
 
  File dataFile = SD.open((type == info) ? "info.log" : "error.log", FILE_WRITE);

  if (dataFile) { 
    dataFile.print(writeHourLog());
    dataFile.println(description); // La lib SD gère les PGM_P
    dataFile.close();
    Serial.println(F("Ecriture dans le fichier log OK"));
  } else 
    Serial.println(F("Impossible d'ouvrir le fichier log"));
    
  Serial.print(writeHourLog());
  Serial.println(description);
}

Merci