Probleme Horloge soudain

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

Probleme Horloge soudain

Message non lude Sna » Sam 10 Nov 2012 14:35

Bonjour,
Je suis en train de developper un petit projet avec le shield Mémoire
Mon probleme principal est que mon code s'est arreté de fonctionner, du jour au lendemain... enfin du premier jour au 2e ;)
Pour l'instant la fonction principale est un datalogger, il envoie une String sur le port série toutes les secondes et écrit cette meme String dans le fichier log
Jusqu'hier tout fonctionnait bien, mais la... je ne recois plus que des caracteres bizarres sur le port série ou le programme se plante completement
En etudiant un peu le probleme, cela semble venir de l'horloge RTC (quand je commente cette partie dans mon code tout refonctionne). La suite de l'etude me trouble par contre, car forcement la, je loade le sketch ds1307 pour test de l'horloge seule
et la bingo ca marche parfaitement
Donc dans mon code, je decommente petit a petit les lignes de l'horloge, tout fonctionne jusqu'au moment ou je decommente
Code: Tout sélectionner
//datastring += String(moment.year(),DEC);

Ce qui est amusant c'est que le mois le jour et l'heure fonctionne tres bien mais pas l'année
De meme que dans le sketch de base l'annee est bien affichée
Je pense donc a un probleme de conversion/variable plus qu'a un probleme materiel, mais alors comment expliquer que cela aie fonctionné?

Je joins mon code a tout hazard, si vous avez des suggestions d'optimisation je suis aussi preneur (pas vraiment l'habitude de faire des progs de moins de 32k et de moins de 1k de ram lol)
Code: Tout sélectionner
#include <EEPROM.h>
#include <Wire.h>
#include <SD.h>
#include <RTClib.h>
#include <Adafruit_BMP085.h>
//#include <dht.h>
#include <MemoryFree.h>

// Declaration des pin utilisees
const byte pin_Alarm = 0;
const byte pin_RelaisLampe = 1;
const byte pin_RelaisCO2 = 2;
const byte pin_RelaisArrosage = 3;
const byte pin_RelaisBrassage = 4;
const byte pin_Extracteur = 5;
const byte pin_Intracteur = 6;
const byte pin_Libre = 7;
const byte pin_CapteurTempInt = 8;
const byte pin_CapteurTempOut = 9;
const byte pin_SDShield = 10;

const byte pin_CapteurMoisture = A0;
const byte pin_CapteurLumiere = A1;
const byte pin_CapteurCO2 = A2;
const byte pin_Buttons = A3;

//Declaration objets speciaux
File fichier;
RTC_DS1307 RTC;
Adafruit_BMP085 BMP;
//dht DHT;

// Variables for PC instructions
byte Command = 0;
byte Variable = 0;
int Value = 0;

// Variables for options
int TempMinDay;
int TempMaxDay;
int HygroMinDay;
int HygroMaxDay;
int TempMinNight;
int TempMaxNight;
int HygroMinNight;
int HygroMaxNight;
int ArrosageIntervalMin;
int ArrosageTimeMin;
byte ArrosagePeriod;
byte LampOnAtH;
byte LampOnAtM;
byte Program;

//Information Variables
int LampOn;
int VentilationInOn;
int VentilationOutOn;
int ArrosageOn;
int BrassageOn;

int LastLampOnTime;
int LastArrosageTime;
int LastInjectionTime;
int DaysInProgram;

//Sensor Variables
int TempIn;
int TempOut;
int TempInBaro;
int HygroIn;
int HygroOut;
long PressionIn;
int PpmCo2;

//Work Variables
byte loopvar;

//Text Variables
String datastring;
//char datastring[50];
char Error[16];
char Message[16];

void setup()
{
//Start serial port at 9600 bps:
  Serial.begin(9600);

//Get configuration values from EEPROM
  TempMinDay = ReadFromEEPROM(0);
  TempMaxDay = ReadFromEEPROM(2);
  HygroMinDay = ReadFromEEPROM(4);
  HygroMaxDay = ReadFromEEPROM(6);
  TempMinNight = ReadFromEEPROM(8);
  TempMaxNight = ReadFromEEPROM(10);
  HygroMinNight = ReadFromEEPROM(12);
  HygroMaxNight = ReadFromEEPROM(14);
  ArrosageIntervalMin = ReadFromEEPROM(16);
  ArrosageTimeMin = ReadFromEEPROM(18);
  ArrosagePeriod = ReadFromEEPROM(20);
  LampOnAtH = ReadFromEEPROM(22);
  LampOnAtM = ReadFromEEPROM(24);
  Program = ReadFromEEPROM(26);

//Declaration des pins
  pinMode(pin_Alarm, OUTPUT);
  pinMode(pin_RelaisLampe, OUTPUT);
  pinMode(pin_RelaisCO2, OUTPUT);
  pinMode(pin_RelaisArrosage, OUTPUT);
  pinMode(pin_RelaisBrassage, OUTPUT);
  pinMode(pin_Extracteur, OUTPUT);
  pinMode(pin_Intracteur, OUTPUT);
  pinMode(pin_CapteurTempInt, INPUT);
  pinMode(pin_CapteurTempOut, INPUT);
  pinMode(pin_SDShield, OUTPUT);

//Initialisation BMP085 (Barometrique)
  BMP.begin(); 

//Initialisation RTC_DS1307 (Horloge)
  Wire.begin();
  RTC.begin();                           
  if (! RTC.isrunning())
  { RTC.adjust(DateTime(__DATE__, __TIME__)); }    // Config RTC avec les valeurs de l'ordinateur au moment de la compilation

//Initialisation SD Card
  if (!SD.begin(pin_SDShield))                           // Verification de la presence de la SD card
  {                         
    Serial.println("No SD");
    return;                                              // Si probleme, sortir et bloquer l'execution
  }
  Serial.println("SD Ok");
  fichier = SD.open("log.txt", FILE_WRITE);               // Ouverture du fichier en mode Ecriture.
  if (fichier)                                             // Si le fichier existe deja, on ecrira a la suite des donnees presentes.
  { fichier.close(); }
  else                                                     //Si probleme a l'ouvertre, alors signaler l'erreur
  { Serial.println("Error open file config"); }
Serial.println(freeMemory());
}

void loop()
{
//Get Sensors Value
  TempInBaro = BMP.readTemperature();
  PressionIn = BMP.readPressure();
  LampOn = analogRead(pin_CapteurLumiere);
  LampOn = digitalRead(pin_CapteurLumiere);
  //int chk = DHT.read22(pin_CapteurTempInt);
  //if(chk == 0)
  //{
  //  TempIn = DHT.temperature;
  //  HygroIn = DHT.humidity;
  //}
  //chk = DHT.read22(pin_CapteurTempOut);
  //if(chk == 0)
  //{
  //  TempOut = DHT.temperature;
  //  HygroOut = DHT.humidity;
  //}
Serial.println(freeMemory()); 

//Get Command
  byte inbyte = 0;
  Command = 0;
  Variable = 0;
  Value = 0;
  if (Serial.available() > 0)
  {
    // if we get a valid byte, read analog ins:
    inbyte = Serial.read();
    if (inbyte > 0)
    {
      Command = inbyte - '0';
      inbyte = Serial.read();
      if (inbyte > 0)
      {
        Variable = inbyte - '0';
        while (inbyte != '/')
        {
          inbyte = Serial.read(); 
          if (inbyte > 0 && inbyte != '/')
          {
            Value = Value * 10 + inbyte - '0';
          }
        }
      }
    }
  }
  switch(Command)
  {
  case 1:
    switch(Variable)
    {
    case 1: TempMinDay = Value; WriteToEEPROM(TempMinDay, 0); break;
    case 2: TempMaxDay = Value; WriteToEEPROM(TempMaxDay, 2); break;
    case 3: HygroMinDay = Value; WriteToEEPROM(HygroMinDay, 4); break;
    case 4: HygroMaxDay = Value; WriteToEEPROM(HygroMaxDay, 6); break;
    case 5: TempMinNight = Value; WriteToEEPROM(TempMinNight, 8); break;
    case 6: TempMaxNight = Value; WriteToEEPROM(TempMaxNight, 10); break;
    case 7: HygroMinNight = Value; WriteToEEPROM(HygroMinNight, 12); break;
    case 8: HygroMaxNight = Value; WriteToEEPROM(HygroMaxNight, 14); break;
    }
    break;
  case 2:
    switch(Variable)
    {
    case 1: ArrosageIntervalMin = Value; WriteToEEPROM(ArrosageIntervalMin, 16); break;
    case 2: ArrosageTimeMin = Value; WriteToEEPROM(ArrosageTimeMin, 18); break;
    case 3: ArrosagePeriod = Value; WriteToEEPROM(ArrosagePeriod, 20); break;
    case 4: LampOnAtH = Value; WriteToEEPROM(LampOnAtH, 22); break;
    case 5: LampOnAtM = Value; WriteToEEPROM(LampOnAtM, 24); break;
    case 6: Program = Value; WriteToEEPROM(Program, 26); break;
    }
    break;
  case 3:
    switch(Variable)
    {
      case 1:
        datastring = "X";
        datastring += String(Command);
        datastring += '/';
        datastring += String(Variable);
        datastring += '/';
        datastring += String(Value);
        datastring += '/';
        datastring += String(TempMinDay);
        datastring += '/';
        datastring += String(TempMaxDay);
        datastring += '/';
        datastring += String(HygroMinDay);
        datastring += '/';
        datastring += String(HygroMaxDay);
        datastring += '/';
        datastring += String(TempMinNight);
        datastring += '/';
        datastring += String(TempMaxNight);
        datastring += '/';
        datastring += String(HygroMinNight);
        datastring += '/';
        datastring += String(HygroMaxNight);
        datastring += '/';
        datastring += String(ArrosageIntervalMin);
        datastring += '/';
        datastring += String(ArrosageTimeMin);
        datastring += '/';
        datastring += String(ArrosagePeriod);
        datastring += '/';
        datastring += String(LampOnAtH);
        datastring += ':';
        datastring += String(LampOnAtM);
        datastring += '|';
        Serial.println(datastring);
     break;
    }
  }


//Prepare Protocol
  DateTime moment = RTC.now();         //Init de l'objet temporel
  datastring = String(moment.day(),DEC);
  datastring += '/';
  datastring += String(moment.month(),DEC);
  datastring += '/';
  //datastring += String(moment.year(),DEC);
  datastring += ' ';
  datastring += String(moment.hour(),DEC);
  datastring += ':';
  datastring += String(moment.minute(),DEC);
  datastring += ':';
  datastring += String(moment.second(),DEC);
  datastring += "|";
  datastring += String(Program);
  datastring += '/';
  datastring += String(LampOn);
  datastring += '/';
  datastring += String(TempIn);
  datastring += '/';
  datastring += String(TempOut);
  datastring += '/';
  datastring += String(HygroIn);
  datastring += '/';
  datastring += String(HygroOut);
  datastring += '/';
  datastring += String(PressionIn);
  datastring += '/';
  datastring += String(TempInBaro);
  datastring += '/';
  datastring += String(PpmCo2);
  datastring += '|';

Serial.println(freeMemory()); 

//Log
  loopvar++;
  if(loopvar >= 10)
  {
    loopvar = 0;
    fichier = SD.open("log.txt", FILE_WRITE);
    if (fichier)
    {
      Serial.println(freeMemory()); 
      fichier.println(datastring);
      fichier.close();
    }
    else
    {
      Serial.println("Error open file");
    }
  }
Serial.println(freeMemory()); 

//Send Serial
  Serial.println(datastring);

// delay 10ms to let the ADC recover:
  delay(1000);
}
void WriteToEEPROM(int i_inttosave, int i_offset)
{
  byte lowByte = ((i_inttosave >> 0) & 0xFF);
  byte highByte = ((i_inttosave >> 8) & 0xFF);
  EEPROM.write(i_offset, lowByte);
  EEPROM.write(i_offset + 1, highByte);
}

unsigned int ReadFromEEPROM(int i_offset)
{
  byte lowByte = EEPROM.read(i_offset);
  byte highByte = EEPROM.read(i_offset + 1);

  return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}
Sna
 
Messages: 9
Inscription: Sam 10 Nov 2012 13:45

Re: Probleme Horloge soudain

Message non lude Sna » Sam 10 Nov 2012 14:57

Suite du test, si je mets une carte SD dans le lecteur, je dois encore commenter les minutes et les secondes
c'est vraiment bizarre

Je suis sur Arduino Uno rev 2
Sna
 
Messages: 9
Inscription: Sam 10 Nov 2012 13:45

Re: Probleme Horloge soudain

Message non lude Sna » Dim 11 Nov 2012 01:22

Bon, toujours pas compris mais résolu
il m'a suffit de faire

Code: Tout sélectionner
datastring += moment.day();

à la place de
Code: Tout sélectionner
datastring += String(moment.day(), DEC);

Et en plus j'ai gagne plein de memoire :)
Sna
 
Messages: 9
Inscription: Sam 10 Nov 2012 13:45


Retourner vers Mémoire

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités

cron