Problème d'écriture

Un log shield sur carte SD avec horloge RTC et zone de prototypage à pastilles carrées

Problème d'écriture

Message non lude telec16 » Mar 6 Nov 2012 22:42

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);
}
Avatar de l’utilisateur
telec16
 
Messages: 21
Inscription: Dim 4 Nov 2012 21:27

Re: Problème d'écriture

Message non lude phil » Mer 7 Nov 2012 10:51

all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: Problème d'écriture

Message non lude telec16 » Mer 7 Nov 2012 11:27

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 ?
Avatar de l’utilisateur
telec16
 
Messages: 21
Inscription: Dim 4 Nov 2012 21:27

Re: Problème d'écriture

Message non lude Stéphane » Jeu 8 Nov 2012 13:49

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.
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40

Re: Problème d'écriture

Message non lude telec16 » Jeu 8 Nov 2012 18:45

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 :)
Avatar de l’utilisateur
telec16
 
Messages: 21
Inscription: Dim 4 Nov 2012 21:27

Re: Problème d'écriture

Message non lude Stéphane » Ven 16 Nov 2012 18:00

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 :)
Avatar de l’utilisateur
Stéphane
 
Messages: 179
Inscription: Lun 2 Mai 2011 09:40

Re: Problème d'écriture

Message non lude telec16 » Mer 21 Nov 2012 14:56

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
Avatar de l’utilisateur
telec16
 
Messages: 21
Inscription: Dim 4 Nov 2012 21:27

Re: Problème d'écriture

Message non lude telec16 » Mer 21 Nov 2012 17:23

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
Avatar de l’utilisateur
telec16
 
Messages: 21
Inscription: Dim 4 Nov 2012 21:27


Retourner vers Mémoire

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité