Erreur avec string trop long

Bonjour à tous,

J'ai remarqué que ma carte Arduino UNO arrêtai de fonctionner quand la taille du programme devenais trop grande (bien avant que 100% du processeur soit utilisé)

Voici un exemple:

#include <SoftwareSerial.h>
#include <Wire.h>
#include "RTClib.h"


RTC_DS1307 RTC;

String PadAvecZero(int donnee, int NombreChar)
{
  char* strdonnee;
  char strzero[20] = "0000000000000000000" ;
  
  String myString = String(donnee);
  
  if (myString.length() < NombreChar){
    String myString = strzero + String(donnee);
    myString = myString.substring(myString.length()-NombreChar);  
    return myString;
    }
  else {
    return myString;
  }
}



void Log(char* donnee,boolean FinDeLigne)
{
  String temp;
  DateTime now = RTC.now();
  
  Serial.print(PadAvecZero(now.year(), 4));
  Serial.print("/");
  Serial.print(PadAvecZero(now.month(), 2));
  Serial.print("/");
  Serial.print(PadAvecZero(now.day(), 2));  
  Serial.print(" ");
  Serial.print(PadAvecZero(now.hour(), 2));
  Serial.print(":");
  Serial.print(PadAvecZero(now.minute(), 2));
  Serial.print(":");
  Serial.print(PadAvecZero(now.second(), 2));
  Serial.print(" ");
  Serial.print(donnee); 
  
    if (FinDeLigne == true){
    Serial.println();
    }
  }
  
  
void setup() {

  Serial.begin(115200);
  
    Wire.begin();
    RTC.begin();
    RTC.adjust(DateTime(__DATE__, __TIME__));
    
    Log("Début du programme",true); 
    delay(5000);
}

void loop() {
 Log("bonjour",true); 
  delay(500);
 Log("Ceci est un test, c'est aussi un programme qui ne sert pas à grand chose!",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf as2fasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);


}/*


 Log("asdfasfasfasfdasf asdg1v afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfas1dfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asd1fsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd as1dfsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd as1dfsdfa1sdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd as1dfsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdf1sdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfa1sdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf as1dfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdf1a sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasd1fa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfa1sdf asdfasd1fa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf as6f asfd asdf asfd asd1fsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf5 asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asd4f asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf a4sdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfasfasd3fasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfjaffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afasdf asf asdf asf asfas3fasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfadfffsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asd3gv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfafsadfsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf as3dgv af3asdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfafdfsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afas3df asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffaaddsafsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afa3sdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsafqsasf",true); 
  delay(500);
 Log("asdfasfasfasfdasf asdgv afa2sdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsawerfsasf",true); 
  delay(500);
 Log("asdfasfasfa1sfdasf asdgv afas1df asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsreafsasf",true); 
  delay(500);
 Log("asdfasfasfa5sfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffwsafsasf",true); 
  delay(500);
 Log("asdfasfasf4asfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffwersafsasf",true); 
  delay(500);
 Log("asdfasfasf3asfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffwsafsasf",true); 
  delay(500);
 Log("asdfasfasf2asfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsayufsasf",true); 
  delay(500);
 Log("asdfasfas1fasfdasf asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsayufsasf",true); 
  delay(500);
  
 Log("asdfasfas1fasfdasf2 asdgv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsayufsasf",true); 
  delay(500);   
 Log("asdfasfas1fasfdasf asd2gv afasdf asf asdf asf asfasfasdfasdfsfasdf  fsadf asdf asdf asdf asdf asf asf asfd asdf asfd asdfsdfasdfasdf asdfasdfa sdfaffsayufsasf",true); 
  delay(500); 
} 
*/

(Inutile de me dire que ce programme est inutile, je le sais déjà, c'est seulement pour donner un exemple... )

Chez moi, ce programme fonctionne très bien, je vois les lignes de textes dans mon moniteur série)

Par contre si on enlève le commentaire sur la partie du bas, plus rien de fonctionne??

Pourquoi cela ne fonctionne plus??? Quelqu'un peut m'expliquer??

Soit c'est que ton programme est trop grand, soit c'est que la carte n'aime pas charger des séries de string dans sa mémoire vive

http://playground.arduino.cc/Learning/Memory

Edit : Un titre comme ça c'est nul, on dirait que tu prend tout le monde pour des cons avec les "???"...

Ok, alors comment faire pour faire fonctionner ce prog?

Ce programme ne contient aucune erreur de programmation, pourtant il ne fonctionne pas dans mes deux cartes Arduino UNO...

Regarde le lien que j'ai mis dans mon message, il montre la capacité de chaque mémoire et comment charger un string sans passer par la RAM

Merci pour ta réponse, j'essai présentement d'utiliser la méthode décrite dans ton lien...

Tu n'aime pas mon titre? Je peut le changer, quel titre veut-tu que j'utilise?

Charte :
Les titres de vos topics...

Utilisez un titre explicite ! Les sujets ayant pour titre “Help”, “A l'aide”, “Au secours” et assimilés… seront supprimés ou édités. Exposez clairement votre question. Evitez également d'écrire des titres tout en MAJUSCULES !

Le but est de définir le sujet, ce titre là ne définis en rien, je te laisse en trouver un explicite !

Merci beaucoup, cela fonctionne si j'écrit:

 Serial.println(F("bonjour"));

Mais si je passe dans une sous-routine, je n'y arrive pas, exemple:

void Log(char* donnee){
Serial.print(F(donnee)); 
}


void loop() {
Log("bonjour"); 
}

Je reçois l’erreur " initializer fails to determine size of '__c' "

As-tu une idée?

Essaie :

void Log(char donnee[]){
Serial.print(F(donnee)); 
}

Je rajouterai ensuite que la classe String est certes source de simplification quand on débute mais il faut aussi apprendre à vite s'en passer ...

Bonjour,

void Log(char* donnee){
Serial.print(F(donnee));
}

Je tue un mignon petit chaton si B@tto ne vois pas la boulette :stuck_out_tongue:

F() est une macro qui place le contenu entre parenthèses en mémoire flash.
Mettre en mémoire flash un pointeur n'as pas de sens, le compilateur te le fait donc savoir en te disant qu'il ne connait pas la taille de cette chose.

PS: utilise sprintf() au lieu de ton "truc" à base de String.
Les String c'est le mal et ça fait tout planter à un moment ou à un autre !

PPS: actuellement TOUTES tes chaines de caractéres sont en mémoire RAM ... pas bon ça :wink:
google -> "PROGMEM" et "<avr/pgmspace.h>"

Ah punaise oui ^^'