Page 1 sur 1

Problème d'écriture

Message non luPosté: Mar 6 Nov 2012 22:42
de telec16
Bonjour,

J'ai un petit (gros) problème avec le shield mémoire, ou plutôt avec mon code, qui au début marchait très bien, mais de moins en moins bien à force de rajouter des fonctionnalités : au mieux le programme se lance puis s’arrête à la première écriture en laissant un fichier corrompu, ou il peut ne pas reconnaitre la carte, écrire n'importe quoi sur le port série, alors qu'il doit écrire une chaine constante ! Quoique pas exactement n'importe quoi : la variable qu'il va définir juste après, par exemple :
Code: Tout sélectionner
Serial.println("SD card ok");
Serial.println("RTC ok");
dataString = "6/11/2012";
va afficher : SD car6/11/2012k (à la place de SD card ok\nRTC ok).
C'est à mon avis un dépassement de RAM, il y a-t-il un moyen de calculer combien de RAM le programme consomme ?

Ci-joint le code (il fait ~22 000 octets) :
Code: Tout sélectionner
#include <Wire.h>
#include <SD.h>
#include <RTClib.h>
#include "DHT.h"

#define DHTPIN 3     
#define DHTTYPE DHT22
#define pin_chipSelect 10

DHT dht(DHTPIN, DHTTYPE);
File dataFile;
RTC_DS1307 RTC;
int h;
int t;
char incr;
String dataString = 0;
DateTime moment;

void setup()
{
  pinMode(pin_chipSelect, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(2, LOW);
  digitalWrite(4, HIGH);
  digitalWrite(9, LOW);

  delay(1000);

  Serial.begin(9600);
  Wire.begin();
  dht.begin();
  RTC.begin();

  Serial.println("DHT22 (AM2302) test!");
  Serial.print("Initializing SD card... ");
  if (!SD.begin(pin_chipSelect))
  {
    Serial.println("Card failed, or not present.");
    return;
  }
  Serial.println("card initialized.");
  Serial.print("Initializing RTC... ");
  if (!RTC.isrunning())
  {
    Serial.println("RTC synchronized.");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  else
    Serial.println("RTC already synchronized.");

  dataString = "Fait le ";
  moment = RTC.now();
  dataString+=String(moment.day(),DEC);
  dataString+='/';
  dataString+=String(moment.month(),DEC);
  dataString+='/';
  dataString+=String(moment.year(),DEC);
  dataString+=" a ";
  dataString+=String(moment.hour(),DEC);
  dataString+=':';
  dataString+=String(moment.minute(),DEC);
  dataString+=':';
  dataString+=String(moment.second(),DEC);

  dataFile = SD.open("dht22log.txt", FILE_WRITE);
  if (dataFile)
  {
    digitalWrite(9, HIGH);
    dataFile.print(dataString);
    dataFile.println(", ecriture toutes les deux secondes.");
    dataFile.println("Temperature (\'|\') de -25 a +75°C et humiditer (\'[\') de 0 a 100%.");
    dataFile.println("-25                      0                                                                          75");
    dataFile.println("0                                                  50                                               100");
    dataFile.close();
    digitalWrite(9, LOW);
  } 
  else
  {
    Serial.println("error opening dht22log.txt");
  }
}

void loop()
{
  h = dht.readHumidity();
  t = dht.readTemperature();
  dataString = 0;
 
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h))
  {
    Serial.println("Failed to read from DHT");
  }
  else
  {
    for(incr = (t+25); incr!=0; incr--)
    {
      dataString += " ";
    }
    dataString += "|";
    dataString += String(t);
    dataString += "\n";
    for(incr = h; incr!=0; incr--)
    {
      dataString += " ";
    }
    dataString += "[";
    dataString += String(h);
  }
  // if the file is available, write to it:
  dataFile = SD.open("dht22log.txt", FILE_WRITE);
  if (dataFile)
  {
    digitalWrite(9, HIGH);
    dataFile.println(dataString);
    dataFile.close();
    digitalWrite(9, LOW);
  } 
  else
  {
    Serial.print("error opening dht22log.txt : ");
    Serial.println(dataFile);
  }
  delay(1850);
}

Re: Problème d'écriture

Message non luPosté: Mer 7 Nov 2012 10:51
de phil

Re: Problème d'écriture

Message non luPosté: Mer 7 Nov 2012 11:27
de telec16
Merci,
Avec ce code :
Code: Tout sélectionner
#include <Wire.h>
#include <SD.h>
#include <RTClib.h>
#include "DHT.h"

#define DHTPIN 3     
#define DHTTYPE DHT22
#define pin_chipSelect 10

DHT dht(DHTPIN, DHTTYPE);
File dataFile;
RTC_DS1307 RTC;
int h;
int t;
char incr;
String dataString = 0;
DateTime moment;

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

void setup()
{
  pinMode(pin_chipSelect, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(2, LOW);
  digitalWrite(4, HIGH);
  digitalWrite(9, LOW);

  delay(1000);

  Serial.begin(9600);
  Wire.begin();
  dht.begin();
  RTC.begin();

  Serial.println(freeRam());//246
  Serial.println("DHT22 (AM2302) test!");
  Serial.print("Initializing SD card... ");
  if (!SD.begin(pin_chipSelect))
  {
    Serial.println("Card failed, or not present.");
    return;
  }
  Serial.println("card initialized.");
  Serial.print("Initializing RTC... ");
  if (!RTC.isrunning())
  {
    Serial.println("RTC synchronized.");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  else
    Serial.println("RTC already synchronized.");

   dataString = "Fait le ";
   moment = RTC.now();
   dataString+=String(moment.day(),DEC);
   dataString+='/';
   dataString+=String(moment.month(),DEC);
   dataString+='/';
   dataString+=String(moment.year(),DEC);
   dataString+=" a ";
   dataString+=String(moment.hour(),DEC);
   dataString+=':';
   dataString+=String(moment.minute(),DEC);
   dataString+=':';
   dataString+=String(moment.second(),DEC);
   
   dataFile = SD.open("dht22log.txt", FILE_WRITE);
   if (dataFile)
   {
   digitalWrite(9, HIGH);
   dataFile.print(dataString);
   dataFile.println(", ecriture toutes les deux secondes.");
   dataFile.println("Temperature (\'|\') de -25 a +75°C et humiditer (\'[\') de 0 a 100%.");
   dataFile.println("-25                      0                                                                          75");
   dataFile.println("0                                                  50                                               100");
   dataFile.close();
   digitalWrite(9, LOW);
   } 
   else
   {
   Serial.println("error opening dht22log.txt");
   }
  Serial.println(freeRam());//177
}

void loop()
{
  h = dht.readHumidity();
  t = dht.readTemperature();
  dataString = 0;

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h))
  {
    Serial.println("Failed to read from DHT");
  }
  else
  {
    for(incr = (t+25); incr!=0; incr--)
    {
      dataString += " ";
    }
    dataString += "|";
    dataString += String(t);
    dataString += "\n";
    for(incr = h; incr!=0; incr--)
    {
      dataString += " ";
    }
    dataString += "[";
    dataString += String(h);
  }
  // if the file is available, write to it:
  dataFile = SD.open("dht22log.txt", FILE_WRITE);
  if (dataFile)
  {
    digitalWrite(9, HIGH);
    dataFile.println(dataString);
    dataFile.close();
    digitalWrite(9, LOW);
  } 
  else
  {
    Serial.print("error opening dht22log.txt : ");
    Serial.println(dataFile);
  }
  Serial.println(freeRam());//217-77
  delay(1850);
}

j'ai ça sur la console :
246
DHT22 (AM2302) test!
Initializing SD card... card initialized.
Initializing RTC... RTC already synchronized.
177
error opening dht22log.txt : 0
77
error opening dht22log.txt : 0
77

La communication s’arrête là ...
Donc sa confirme mon problème de RAM, non ?
Il y a-t-il une puce compatible UNO mais avec plus de RAM ?

Re: Problème d'écriture

Message non luPosté: Jeu 8 Nov 2012 13:49
de Stéphane
J'avoue ne pas comprendre le ": 0" apres le "error opening dht22log.txt".
Et puis, d'après ce que je vois, je ne pense pas que ce soit du à un probleme de ram.
En effet, apres le println(), il y a un retour à la ligne avant d'afficher le freeram(), qui est de 177 puis 77, ce qui indique donc qu'il reste de la place.

Re: Problème d'écriture

Message non luPosté: Jeu 8 Nov 2012 18:45
de telec16
Le ': 0' c'est moi qui l'est mit pour le debug, c'est "dataFile" :
Code: Tout sélectionner
Serial.print("error opening dht22log.txt : ");
Serial.println(dataFile);

Mais après on est pas sur que le 77 soit juste, c'est peut-être de la RAM déjà allouée ou un beug ; En tout cas, si vous avez une explication même tordu, je suis preneur. ;)
Il m'es venu une idée : ne pourrait-on pas mettre une barrette de RAM d'ordi à l'Arduino ?
Merci de votre aide :)

Re: Problème d'écriture

Message non luPosté: Ven 16 Nov 2012 18:00
de Stéphane
Oups, désolé de ma question, je n'avais pas bien lu votre code.
Je ne pense pas que cela puisse être un problème de ram, mais vous pouvez néanmoins réduire l'espace utilisé, par exemple en remplacant vos flotilles d'espaces par des tabulations (caractère '\t'), qui réduiront l'empreinte de vos strings. Essayez en n'utilisant que des strings de debug (A, A1, b, C2, etc ) au lieu des phrases présentes, pour voir si cela change quelque chose :)

Re: Problème d'écriture

Message non luPosté: Mer 21 Nov 2012 14:56
de telec16
Désoler pour la réponse tardive, je n'avais pas trop le temps :/.
Donc avec ce code :
Code: Tout sélectionner
#include <Wire.h>
#include <SD.h>
#include <RTClib.h>
#include "DHT.h"

#define DHTPIN 3     
#define DHTTYPE DHT22
#define pin_chipSelect 10

DHT dht(DHTPIN, DHTTYPE);
File dataFile;
RTC_DS1307 RTC;
int h;
int t;
char incr;
String dataString = 0;
DateTime moment;

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

void setup()
{
  pinMode(pin_chipSelect, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(9, LOW);

  delay(1000);

  Serial.begin(9600);
  Wire.begin();
  dht.begin();
  RTC.begin();

  Serial.println(freeRam());//246
  //Serial.print("Initializing SD card... ");
  if (!SD.begin(pin_chipSelect))
  {
    //Serial.println("Card failed, or not present.");
    Serial.println("Cf");
    return;
  }
    Serial.println("Ci");
 // Serial.print("Initializing RTC... ");
  if (!RTC.isrunning())
  {
    //Serial.println("RTC synchronized.");
    //Serial.println("Cf");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  else
   // Serial.println("RTC already synchronized.");

   dataString = "Fait le ";
   moment = RTC.now();
   dataString+=String(moment.day(),DEC);
   dataString+='/';
   dataString+=String(moment.month(),DEC);
   dataString+='/';
   dataString+=String(moment.year(),DEC);
   dataString+=" a ";
   dataString+=String(moment.hour(),DEC);
   dataString+=':';
   dataString+=String(moment.minute(),DEC);
   dataString+=':';
   dataString+=String(moment.second(),DEC);
   
   dataFile = SD.open("dht22log.txt", FILE_WRITE);
   if (dataFile)
   {
   digitalWrite(9, HIGH);
   dataFile.print(dataString);
   dataFile.println(", ecriture toutes les deux secondes.");
   dataFile.println("Temperature (\'|\') de -25 a +75°C et humiditer (\'[\') de 0 a 100%.");
   dataFile.println("-25                      0                                                                          75");
   dataFile.println("0                                                  50                                               100");
   dataFile.close();
   digitalWrite(9, LOW);
   } 
   else
   {
   //Serial.println("error opening dht22log.txt");
    Serial.println("De");
   }
  Serial.println(freeRam());//177
}

void loop()
{
  h = dht.readHumidity();
  t = dht.readTemperature();
  dataString = 0;

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h))
  {
   // Serial.println("Failed to read from DHT");
    Serial.println("De2");
  }
  else
  {
    for(incr = (t+25); incr!=0; incr--)
    {
      dataString += " ";
    }
    dataString += "|";
    dataString += String(t);
    dataString += "\n";
    for(incr = h; incr!=0; incr--)
    {
      dataString += " ";
    }
    dataString += "[";
    dataString += String(h);
  }
  // if the file is available, write to it:
  dataFile = SD.open("dht22log.txt", FILE_WRITE);
  if (dataFile)
  {
    digitalWrite(9, HIGH);
    dataFile.println(dataString);
    dataFile.close();
    digitalWrite(9, LOW);
  } 
  else
  {
    //Serial.print("error opening dht22log.txt : ");
    Serial.println("De3");
    Serial.println(dataFile);
  }
  Serial.println(freeRam());//217-77
  delay(1850);
}

ça marche !
envoyé sur le serial (de mémoire) :
246
Ci
172
172
172
...
sur la carte SD :
Code: Tout sélectionner
Fait le 21/11/2012 a 14:50:36, ecriture toutes les deux secondes.
Temperature ('|') de -25 a +75°C et humiditer ('[') de 0 a 100%.
-25                      0                                                                          75
0                                                  50                                               100
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                           [43
                                              |21
                                            [44
                                              |21
                                             [45
                                              |21
                                              [46
                                              |21
                                              [46
                                              |21
                                              [46
                                              |21
                                               [47
                                              |21
                                               [47
                                              |21
                                               [47
                                              |21
                                                [48
                                              |21
                                                [48
                                              |21
                                                [48
                                              |21
                                                 [49
                                              |21
                                                [48

Re: Problème d'écriture

Message non luPosté: Mer 21 Nov 2012 17:23
de telec16
je me suis réjoui trop vite ...
l'affichage beug encore :
Code: Tout sélectionner
Fait le 21/11/2012 a 17:19:13, ecriture toutes les deux secondes.
Temperature ('|') de -25 a +75°C et humiditer ('[') de 0 a 100%.
-25                      0                                                                          75
0                                                  50                                               100
                                             |20
                                                 [49
                                             |20
                                                  [50
                                              |21
                                                 [49
                                              |21
                                                  [50
                                              |21
                                                           [59
                                              |21
                                                              66
                                              |21
                                                              72
                                              |21
                                                              77
                                              |21
                                                              80
                                              |21
                                                              82
                                              |21
                                                              81
                                                |23
                                                            91
                                                 |24
                                                           96
                                                  |25
                                                          99
                                                   |26
                                                         99
                                                   |26
                                                         99
                                                    |27
                                                        99
                                                    |27
                                                        99
                                                     |28
                                                       99
                                                     |28
                                                       99
                                                     |28
                                                       99
                                                     |28
                                                       99
                                                      |29
                                                      99
                                                      |29
                                                      99
                                                        |31
                                                    99