Arduino program duration

Hello, I have a problem at the moment.
I am creating random values in a loop to record them afterwards, but the acquisition of values stops after 3min51 and then nothing, and I have to be able to acquire data for at least a month. Does anyone know what this problem is due to?

Your code? Just a wild guess.

Do you have any code?
Common problems are writing outside array boundaries....
Referring to out of scope data....

#include <SPI.h>
#include <SD.h>
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
#include <DS3231.h>

#include "iarduino_RTC.h"

iarduino_RTC watch (RTC_DS1307);
File myFile;
File root;
String nomfichierbase = "mesure";
String nomfichier;
int valH;//création d'une variable stockant le taux d'hydrogene
int valTemp;//création d'une variable stockant la valeur de temperature
int valH20;//creation d'une variable stockant la valeur de l'humidité

int heure =0;
int Minute =0;
int Seconde=0;
int jour=15;
int mois;
int an;

LiquidCrystal_I2C LCD(0x27,20,4);
void setup()
{ // ouverture du port serie
Serial.begin(9600);

while (!Serial) {
;
}
//===========================================================================PARTIE CARTE SD=================================================================================================================================
Serial.println("inititialisation de la carte SD");
if (!SD.begin(4)) {
Serial.println("inititialisation ratée");
while (1);
}
Serial.println("inititialisation reussit.");
myFile = SD.open(nomfichier, FILE_WRITE);
Serial.print("DATE HEURE hydrogne temperature humidite");
//====================================================================================ECRAN=====================================================================================================================================
LCD.init(); // initialisation de l'afficheur
LCD.backlight();

//=====================================================HORLOGE=========================================
watch.begin();
watch.settime(Seconde,Minute,heure, jour, mois, an);// 0 sec, 30 min, 18hour, 2 date, january, 2022

}
void loop() {
//millis()<10000
int indice=0;
while (1){
const unsigned long PERIODE=1;
static unsigned long nextTime=millis();
if (millis()-nextTime>= PERIODE)
{
nextTime+=PERIODE;
//=============================PARTIE VALEUR============================================
valH = random(0, 50);//generation d'un valeur aleatoire pour le taux d hydrogene
valTemp =random(10,30);//generation d'une valeur aleatoire pour la temperature
valH20 =random(0,5);//generation d'une valeur aleatoire pour l'humidité
//===========================================================================PARTIE CARTE SD==================================================
Serial.println(watch.gettime("d-m-Y, H:i:s"));
// ouverture du fichier
myFile = SD.open(nomfichier, FILE_WRITE);
// si le ficher est bon on écrits dedans
if (myFile)
{

    delay (1000);
    myFile.print(watch.gettime("d-m-Y H:i:s "));myFile.print(" ");myFile.print(valH);myFile.print(" ");myFile.print(valTemp);myFile.print(" ");myFile.println(valH20);
    //on ferme le fichier pour enregistrer la valeur  
    myFile.close(); 
    //============================================================ECRAN=================================================
    LCD.setCursor(0, 0);
    LCD.print("mesures capt1 ");
    LCD.print(watch.gettime("H:i"));
    LCD.setCursor(0, 1);
    LCD.print("tempt : ");LCD.print(valTemp);LCD.print(" C");
    LCD.setCursor(0, 2);
    LCD.print("taux H : ");LCD.print(valH);LCD.print(" ppm ");
    LCD.setCursor(0, 3);
    LCD.print("humidite: ");LCD.print(valH20);LCD.print(" % ");
    //----------------------------------------lecture de la carte----------------------------------
    // réouverture pour la lecture
    //myFile = SD.open("mesure.txt");
    // lire le fichier jusqu'à ce qu'il n'y ait rien d'autre dedans.:
    //while (myFile.available()) {
    //  Serial.write(myFile.read());
    // }
    //================================NOUVEAUX FICHIER===============================================
    myFile = SD.open(nomfichier); //ouverture du fichier
    if (myFile.size() > 3000)
    {//si la taille du depasse les 900mo on le ferme et on en recre un autre pour reprendre l'acquisition
      myFile.close();
      nomfichier=nomfichierbase+indice;
      indice++;
      Serial.println(nomfichier);
      Serial.print("on ecrit dans ");Serial.println(nomfichier);
      myFile = SD.open(nomfichier, FILE_WRITE);
      }
   }
   if(!SD.begin(4)){
    LCD.clear();
    LCD.setCursor(4,2);
    LCD.print("ERREUR");
    LCD.setCursor(0,3);
    LCD.print("carte SD manquante");
    
   }

}

}

}

Use code tags:
before_adding_code_tags


#include <SPI.h>
#include <SD.h>
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
#include <DS3231.h>

#include "iarduino_RTC.h" 



iarduino_RTC watch (RTC_DS1307);
File myFile;
File root;
String nomfichierbase = "mesure";
String nomfichier;
int valH;//création d'une variable stockant le taux d'hydrogene
int valTemp;//création d'une variable stockant la valeur de temperature
int valH20;//creation d'une variable stockant la valeur de l'humidité


int heure =0;
int Minute =0;
int Seconde=0;
int jour=15;
int mois;
int an;

LiquidCrystal_I2C LCD(0x27,20,4);
void setup() 
{  // ouverture du port serie
  Serial.begin(9600);
 
  while (!Serial) {
    ;
  }
  //===========================================================================PARTIE CARTE SD=================================================================================================================================
  Serial.println("inititialisation de la carte SD");
  if (!SD.begin(4)) {
    Serial.println("inititialisation ratée");
    while (1);
  }
  Serial.println("inititialisation reussit.");
  myFile = SD.open(nomfichier, FILE_WRITE); 
  Serial.print("DATE HEURE hydrogne temperature humidite");
  //====================================================================================ECRAN=====================================================================================================================================
  LCD.init(); // initialisation de l'afficheur
  LCD.backlight();

  //=====================================================HORLOGE=========================================
  watch.begin();
  watch.settime(Seconde,Minute,heure, jour, mois, an);// 0  sec, 30 min, 18hour, 2 date, january, 2022
  
}
void loop() {
  //millis()<10000
  int  indice=0;
  while (1){
    const unsigned long PERIODE=1;
    static unsigned long nextTime=millis();
    if (millis()-nextTime>= PERIODE)
    {
      nextTime+=PERIODE;
      //=============================PARTIE VALEUR============================================
      valH = random(0, 50);//generation d'un valeur aleatoire pour le taux d hydrogene
      valTemp =random(10,30);//generation d'une valeur aleatoire pour la temperature
      valH20 =random(0,5);//generation d'une valeur aleatoire pour l'humidité
      //===========================================================================PARTIE CARTE SD==================================================
        Serial.println(watch.gettime("d-m-Y, H:i:s"));
      // ouverture du fichier
      myFile = SD.open(nomfichier, FILE_WRITE);
      // si le ficher est bon on écrits dedans
      if (myFile) 
      {
        
        delay (1000);
        myFile.print(watch.gettime("d-m-Y H:i:s "));myFile.print(" ");myFile.print(valH);myFile.print(" ");myFile.print(valTemp);myFile.print(" ");myFile.println(valH20);
        //on ferme le fichier pour enregistrer la valeur  
        myFile.close(); 
        //============================================================ECRAN=================================================
        LCD.setCursor(0, 0);
        LCD.print("mesures capt1 ");
        LCD.print(watch.gettime("H:i"));
        LCD.setCursor(0, 1);
        LCD.print("tempt : ");LCD.print(valTemp);LCD.print(" C");
        LCD.setCursor(0, 2);
        LCD.print("taux H : ");LCD.print(valH);LCD.print(" ppm ");
        LCD.setCursor(0, 3);
        LCD.print("humidite: ");LCD.print(valH20);LCD.print(" % ");
        //----------------------------------------lecture de la carte----------------------------------
        // réouverture pour la lecture
        //myFile = SD.open("mesure.txt");
        // lire le fichier jusqu'à ce qu'il n'y ait rien d'autre dedans.:
        //while (myFile.available()) {
        //  Serial.write(myFile.read());
        // }
        //================================NOUVEAUX FICHIER===============================================
        myFile = SD.open(nomfichier); //ouverture du fichier
        if (myFile.size() > 3000)
        {//si la taille du depasse les 900mo on le ferme et on en recre un autre pour reprendre l'acquisition
          myFile.close();
          nomfichier=nomfichierbase+indice;
          indice++;
          Serial.println(nomfichier);
          Serial.print("on ecrit dans ");Serial.println(nomfichier);
          myFile = SD.open(nomfichier, FILE_WRITE);
          }
       }
       if(!SD.begin(4)){
        LCD.clear();
        LCD.setCursor(4,2);
        LCD.print("ERREUR");
        LCD.setCursor(0,3);
        LCD.print("carte SD manquante");
        
       }
      
   }

}

}

Why do you have a 'while(1)' inside the loop() function?

infinite loop I intend to add later stuff that is not in the loop

If not in the loop() then where do you intend to add it?

in anticipation

You are opening a file 1000 times per second, and not closing it right away. What is going on there? Oh, wait, now I see the 'delay(1000)' in there. So what is the millis() timing for? Please describe the logic, in plain words.

I asked where, not why...

forgot that i found the problem

That is good news.

it was the creation of the file that was the problem.the program continued to write to the first file and it ended up crashing

why not do something like as follows (couldn't complete the simulation)

# include <SD.h>

File myFile;
String nomfichier = "myFile.txt";

const unsigned long PERIODE = 1000;     // 1 second
unsigned long       msecLst;
char s [90];

// -----------------------------------------------------------------------------

void
loop ()
{
    unsigned long msec = millis ();

    if ( (msec - msecLst) < PERIODE)  
        return;

    msecLst = msec;

    if (myFile.size () > 100)  {
        Serial.println ("overflow");
        myFile.close ();
        myFile.open (FILE_READ);

        char buf [90];
        while (myFile.read (buf, sizeof(buf)))
            Serial.println (buf);

        myFile.close ();
        myFile.open (FILE_WRITE);
    }

    // simulate data
    int valH    = random (0, 50);
    int valTemp = random (10,30);
    int valH20  = random (0,5);

    sprintf (s, "%8ld %6d %6d %6d", msec, valH, valTemp, valH20);
    Serial.println (s);

    if (! myFile.write (s))
        Serial.println ("write failed");
}

// -----------------------------------------------------------------------------
void setup ()
{  // ouverture du port serie
    Serial.begin (9600);
    while (! Serial)
        ;

    if (! SD.begin (4)) {
        Serial.println ("inititialisation ratée");
        while (1);
    }

    Serial.println ("inititialisation reussit.");
    myFile = SD.open (nomfichier, FILE_WRITE);
    Serial.println ("DATE HEURE hydrogne temperature humidite");
}

I have actually fixed this problem, it was a loop problem, but another one appeared.
Now it's the files that stop being created from 3 min49

If you want help with that, post the updated code.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.