modifica al datalogger

ciao

qualcuno mi potrebbe aiutare a modificare i tempi di scittura nella sd card nello sketch in questione?
Questa dovrebbe essere la spiegazione per farlo ma io non ci riesco.

// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()

grazie

datalogger_RTC.pde (5.96 KB)

Devi modificare questo parametro:

define SYNC_INTERVAL 1000

è l'intervallo (in millisecondi) fra un riversamento dei dati ed il successivo.

Cmq mettere tempi troppo brevi potrebbe comportare dei problemi. Bisognerebbe sapere quanto impiega la libreria a scrivere sulla SD.

grazie per la risposta.

quella prova l'ho già fatta aumentando o diminuendo il valore 1000 ma non funziona e l'unica differenza è un doppio conteggio dei secondi.

poi ho visto

"set it to 10*LOG_INTERVAL to write all data every 10 datareads"

che se non sbaglio significa che se scrivo 10*LOG_INTERVAL ho una scrittura ogni 10

letture ma non riesco a capire come si dovrebbe fare visto che ho provatoa modificare la formula

delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL)

ma non funziona.

Da qualche parte avrai la definizione di LOG_INTERVAL. Modifica quella.

Nello sketch si trovano solo due LOG_INTERVAL

uno nel

#Define LOG_INTERVAL 1000

e l’altro nella formula

delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL)

io credo di dover fare una modifica tipo

delay((LOG_INTERVAL -1) - (millis() 10 % LOG_INTERVAL)

non riesco ad allegare il file .pde come devo fare?

grazie

datalogger_RTC.pde (5.96 KB)

Nel precedente post volevo dire che ho provato a modificare la formula in quel modo ma non funziona.

Per l'allegato so come si fà, non riesco ad inserire nel post lo sketch in una finestra che può scorrere

grazie

Scusa, non offendertene, ma mi sembra che ti manchino un po' di basi di programmazione XD Non puoi mettere una riga di codice scritta così:

delay((LOG_INTERVAL -1) - (millis() 10 % LOG_INTERVAL)

Il compilatore minimo esce dal PC e ti tira un nocchino sul capo :stuck_out_tongue_closed_eyes:

La riga da modificare è la prima che hai indicato:

#Define LOG_INTERVAL 1000

Questa istruzione... istruisce il compilatore a sostituire in tutti i punti del codice dove trova LOG_INTERVAL questa dicitura con il valore 1000.

Per allegare del codice, lo copi-e-incolli nel post poi lo selezioni e premi il pulsantino "#" che vedi sopra alle emoticon. Ciao

e l'altro nella formula

delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL)

io credo di dover fare una modifica tipo

Non ti preoccupare non mi offendo,alla mia età sono cosciente dei miei limiti.

Di mettermi a studiare programmazione e inglese la vedo dura; a me piace Arduino perchè permette di smanettarci andando per intuito(quasi).

Seguendo il mio metodo casareccio ho provato a modificare per primo il

Define LOG_INTERVAL 1000 in #Define LOG_INTERVAL 100 o #Define LOG_INTERVAL 10000

ma come dicevo il risultato è solo un doppio conteggio dei secondi.

Se non si deve intervenire all'interno della formula suppongo che lo sketch non sia corretto.

grazie

Ti chiedo una cortesia. Pubblica tutto lo sketch così cerchiamo di vedere dove intervenire per ridurre i tempi.

questo è lo sketch

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

// A simple data logger for the Arduino analog pins

// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define LOG_INTERVAL 1000 // mills between entries (reduce to take more/faster data)

// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()

#define ECHO_TO_SERIAL 1 // echo data to serial port
#define WAIT_TO_START 0 // Wait for serial input in setup()

// the digital pins that connect to the LEDs
#define redLEDpin 2
#define greenLEDpin 3

// The analog pins that connect to the sensors
#define photocellPin 0 // analog 0
#define tempPin 1 // analog 1
#define BANDGAPREF 14 // special indicator that we want to measure the bandgap

#define aref_voltage 3.3 // we tie 3.3V to ARef and measure it with a multimeter!
#define bandgap_voltage 1.1 // this is not super guaranteed but its not -too- off

RTC_DS1307 RTC; // define the Real Time Clock object

// for the data logging shield, we use digital pin 10 for the SD cs line
const int chipSelect = 10;

// the logging file
File logfile;

void error(char *str)
{
  Serial.print("error: ");
  Serial.println(str);
  
  // red LED indicates error
  digitalWrite(redLEDpin, HIGH);

  while(1);
}

void setup(void)
{
  Serial.begin(9600);
  Serial.println();
  
  // use debugging LEDs
  pinMode(redLEDpin, OUTPUT);
  pinMode(greenLEDpin, OUTPUT);
  
#if WAIT_TO_START
  Serial.println("Type any character to start");
  while (!Serial.available());
#endif //WAIT_TO_START

  // initialize the SD card
  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    error("Card failed, or not present");
  }
  Serial.println("card initialized.");
  
  // create a new file
  char filename[] = "LOGGER00.CSV";
  for (uint8_t i = 0; i < 100; i++) {
    filename[6] = i/10 + '0';
    filename[7] = i%10 + '0';
    if (! SD.exists(filename)) {
      // only open a new file if it doesn't exist
      logfile = SD.open(filename, FILE_WRITE);
      break; // leave the loop!
    }
  }
  
  if (! logfile) {
    error("couldnt create file");
  }
  
  Serial.print("Logging to: ");
  Serial.println(filename);

  // connect to RTC
  Wire.begin();
  if (!RTC.begin()) {
    logfile.println("RTC failed");
#if ECHO_TO_SERIAL
    Serial.println("RTC failed");
#endif //ECHO_TO_SERIAL
  }
  

  logfile.println("millis,stamp,datetime,light,temp,vcc");
#if ECHO_TO_SERIAL
  Serial.println("millis,stamp,datetime,light,temp,vcc");
#endif //ECHO_TO_SERIAL
 
  // If you want to set the aref to something other than 5v
  analogReference(EXTERNAL);
}

void loop(void)
{
  DateTime now;

  // delay for the amount of time we want between readings
  delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL));
  
  digitalWrite(greenLEDpin, HIGH);
  
  // log milliseconds since starting
  uint32_t m = millis();
  logfile.print(m); // milliseconds since start
  logfile.print(", ");
#if ECHO_TO_SERIAL
  Serial.print(m); // milliseconds since start
  Serial.print(", ");
#endif

  // fetch the time
  now = RTC.now();
  // log time
  logfile.print(now.unixtime()); // seconds since 1/1/1970
  logfile.print(", ");
  logfile.print('"');
  logfile.print(now.year(), DEC);
  logfile.print("/");
  logfile.print(now.month(), DEC);
  logfile.print("/");
  logfile.print(now.day(), DEC);
  logfile.print(" ");
  logfile.print(now.hour(), DEC);
  logfile.print(":");
  logfile.print(now.minute(), DEC);
  logfile.print(":");
  logfile.print(now.second(), DEC);
  logfile.print('"');
#if ECHO_TO_SERIAL
  Serial.print(now.unixtime()); // seconds since 1/1/1970
  Serial.print(", ");
  Serial.print('"');
  Serial.print(now.year(), DEC);
  Serial.print("/");
  Serial.print(now.month(), DEC);
  Serial.print("/");
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(":");
  Serial.print(now.minute(), DEC);
  Serial.print(":");
  Serial.print(now.second(), DEC);
  Serial.print('"');
#endif //ECHO_TO_SERIAL

  analogRead(photocellPin);
  delay(10);
  int photocellReading = analogRead(photocellPin);
  
  analogRead(tempPin);
  delay(10);
  int tempReading = analogRead(tempPin);
  
  // converting that reading to voltage, for 3.3v arduino use 3.3, for 5.0, use 5.0
  float voltage = tempReading * aref_voltage / 1024;
  float temperatureC = (voltage - 0.5) * 100 ;
  float temperatureF = (temperatureC * 9 / 5) + 32;
  
  logfile.print(", ");
  logfile.print(photocellReading);
  logfile.print(", ");
  logfile.print(temperatureF);
#if ECHO_TO_SERIAL
  Serial.print(", ");
  Serial.print(photocellReading);
  Serial.print(", ");
  Serial.print(temperatureF);
#endif //ECHO_TO_SERIAL

  // Log the estimated 'VCC' voltage by measuring the internal 1.1v ref
  analogRead(BANDGAPREF);
  delay(10);
  int refReading = analogRead(BANDGAPREF);
  float supplyvoltage = (bandgap_voltage * 1024) / refReading;
  
  logfile.print(", ");
  logfile.print(supplyvoltage);
#if ECHO_TO_SERIAL
  Serial.print(", ");
  Serial.print(supplyvoltage);
#endif // ECHO_TO_SERIAL

  logfile.println();
#if ECHO_TO_SERIAL
  Serial.println();
#endif // ECHO_TO_SERIAL

  digitalWrite(greenLEDpin, LOW);

  // Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
  // which uses a bunch of power and takes time
  if ((millis() - syncTime) < SYNC_INTERVAL) return;
  syncTime = millis();
  
  // blink LED to show we are syncing data to the card & updating FAT!
  digitalWrite(redLEDpin, HIGH);
  logfile.flush();
  digitalWrite(redLEDpin, LOW);
  
}

E' questo quello che devi cambiare, lo dice anche il commento allegato:

#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card

millisecondi tra 2 chiamate di flush() - per scrivere i dati sulla scheda

Abbassa quel valore ed i dati saranno scritti con più frequenza.

OK funziona

avevo un problema con la breadboard che dava falsi contatti.

ciao