Scrittura dati su scheda SD

Ciao a tutti, vi scrivo a seguito di un problema riguardante la scrittura di alcuni dati su una scheda microSD, collegata ad Arduino tramite apposita shield.
Il mio intento è di creare un documento contenente una serie di letture di valori di un sensore di umidità del terreno a determinati intervalli. Prima di scrivere il codice completo, però, ho provato degli esempi riguardanti solo la scrittura su scheda SD, e ho tristemente constatato che il codice che ho ricavato dai miei esempi non funziona oltre il void setup();
Infatti, l’inizializzazione, la creazione del documento e la scrittura delle righe di intestazione poste nel setup funziona perfettamente, il resto del codice contenuto nel void loop che riguarda la scrittura dei valori letti ogni 15 minuti invece no. Riporto di seguito il codice:

#include <SPI.h>
#include <SD.h>

int sensorPin = A0;
int sensorValue = 0;
int percent = 0;
int CS_PIN = 53;
int percentValue = 0;
int fifteen = 1;  //conta il numero di intervalli eseguiti

unsigned long prev = 150000;
unsigned long interval = 150000;  //15 minuti
unsigned long now;

File report;

void setup() {
  
  Serial.begin(9600);
  pinMode(CS_PIN, OUTPUT);
  SD.begin();
  // crea il file e le intestazioni delle colonne su SD
  report = SD.open("pippo.txt", FILE_WRITE);
  report.println("Interval \t Percent \t analogValue \n");
  report.close();  
}

void loop() {
  
  now = millis();
  if ((now - prev) > interval){
    sensorValue = analogRead(sensorPin);    //lettura sensore
    percent = convertToPercent(sensorValue);//conversione del valore letto in percentuale
    printValuesToSerial();                  //invio alla seriale dei valori
    //invio dei valori al file su SD
    report = SD.open("pippo.txt");
    report.print(fifteen);
    report.print("\t");
    report.print(percent);
    report.print("\t");
    report.print(sensorValue);
    report.print("\n");
    report.close();
    prev = now; //memorizzaizone ultimo avvio
    fifteen++;  //incremento contatore di intervalli
  }
}

int convertToPercent(int value){
  
  percentValue = map(value, 1023, 465, 0, 100);
  if (percentValue > 100)
    percentValue = 100;
  return percentValue;
}

void printValuesToSerial(){
  
  Serial.print("\n\nAnalog Value: ");
  Serial.print(sensorValue);
  Serial.print("\nPercent: ");
  Serial.print(percent);
  Serial.print("%\n");
  
}

Vi ringrazio anticipatamente per l’aiuto.

oltre che 150000 mS non sono 15 minuti ma 2,5 minuti, non ho la conoscenza di aiutarti.
Ciao Uwe

curiosità... perché inizializzi "prev" a 15000?

per il tuo problema penso manchi semplicemente "FILE_WRITE" nella SD.open del loop();

Oltre il FILE WRITE, questa unsigned long prev= 150000 deve diventare
unsigned long prev = 0;
e poi l'intervallo deve diventare
const long interval = 900000 // ovvero 15 minuti

Grazie mille, il vostro aiuto è stato prezioso!

Per il FILE_WRITE pensavo servisse soltanto nel setup per creare il file, che stupido. Adesso funziona.

Il prev = 150000 l'ho visto su un esempio su internet. Prima l'avevo sempre inizializzato a 0.

Penso che vi disturberò nuovamente in futuro per l'utilizzo di un RTC, ma non prima di averci provato fino all'esasperazione!
Grazie mille :slight_smile:

tratom:
Grazie mille, il vostro aiuto è stato prezioso!

Per il FILE_WRITE pensavo servisse soltanto nel setup per creare il file, che stupido. Adesso funziona.

Il prev = 150000 l'ho visto su un esempio su internet. Prima l'avevo sempre inizializzato a 0.

Penso che vi disturberò nuovamente in futuro per l'utilizzo di un RTC, ma non prima di averci provato fino all'esasperazione!
Grazie mille :slight_smile:

Manco un Karma ? :grin: Scherzo :smiley:
:wink: