Come salvare i valori della sonda DHT11 su SDCard?

Hai messo le graffe?

SukkoPera:
Hai messo le graffe?

Si, ecco un pezzo di codice:

if (!SD.begin(4)) { // Digital PIN 4
    Serial.println(" initialization failed!");
} else {
    Serial.println(" initialization done.");
}

Adesso che ho inserito la scheda (senza le resistenze) il messaggio del monitor seriale è lo stesso.

Initializing SD card... initialization failed!
error opening test.txt

Come mai?

I collegamenti sono.

 _________
|876543219\
  1. Chip select -> PIN 10
  2. Data input -> PIN 11
  3. Ground -> GND
  4. 3,3V -> 3,3V
  5. Clock -> PIN 13
  6. Ground -> non connesso
  7. Data output -> PIN 12
  8. non connesso
  9. non connesso

Guarda che le resistenze sono obbligatorie, visto che una SD funziona a 3,3V
Senza resistenze si rompe

Brunello:
Guarda che le resistenze sono obbligatorie, visto che una SD funziona a 3,3V
Senza resistenze si rompe

Allora la rimuvo e aspetto

antoniocnn:
Allora la rimuvo e aspetto

Purtroppo probabilmente l'hai già danneggiata ...
... un oggetto fatto per 3.3V NON apprezza affatto se gli si danno 5V !!!

Hai una qualche altra unità dove provarla/verificare se funziona ancora? Sul PC?

Guglielmo

Una volta verificato, rileggi il post #10.

Poi, per come hai messo le graffe nell'else, l'unica cosa che comprende è:

Serial.println(" initialization done.");

Tutto quel che segue viene eseguito in ogni caso.

gpb01:
Purtroppo probabilmente l'hai già danneggiata ...
... un oggetto fatto per 3.3V NON apprezza affatto se gli si danno 5V !!!

No, l'ho alimentata a 3,3V

gpb01:
Hai una qualche altra unità dove provarla/verificare se funziona ancora? Sul PC?

Guglielmo

Si, l'ho messa nel portatile e funziona.

OK, quindi la SD è salva ... :grin:
... allora verifica bene tutti i collegamenti e verifica che sia formattata FAT32.

Guglielmo

No, l'ho alimentata a 3,3V

Bene, ma mi riferivo non all'alimentazione della scheda ( che hai alimentato correttamente ) ma al livello dei segnali logici, visto che una SD non è 5V tollerant

Altro problema,
il programma mi crea il file.txt ma dentro non c'è scritto niente, perche?

Grazie

Prova a chiudere il file dopo la scrittura.

SukkoPera:
Prova a chiudere il file dopo la scrittura.

Il comando close in che punto li metto?

Mi quoto:

SukkoPera:
Prova a chiudere il file dopo la scrittura.

SukkoPera:
Prova a chiudere il file dopo la scrittura.

Questo non mi aiuta. Se lo metto alla fine ottengo:

DHT TEST PROGRAM
LIBRARY VERSION: 0.4.1

Type, Status, RH (%), T (C)
66, 26
DHT TEST PROGRAM
LIBRARY VERSION: 0.4.1

Type, Status, RH (%), T (C)
68, 26

Ecco il codice

// 
// FILE:    Humidity.07GIU16
// PURPOSE: WRITE DATA FROM DHT11 TO SD_CARD FILE
// PROBE:   ONE DHT11
// AUTHOR:  Antonio Cannavale
// COMFORT: HR 40%, T 23C
//  _________
// |876543219\
//

#include <SPI.h> // Include SPI library
#include <SD.h> // Include SD library
#include <dht11.h> // Include DHT11 library

dht11 DHT;
#define DHT11_PIN 2 // Input at digital PIN 2

File myFile;

void setup(){ // Start setup
  Serial.begin(9600); // Open seral communications and wait for port to open
  delay(1000); // Delay to let system boot
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  // See if the card is present and can be initialized:
  Serial.print("Initializing SD card...");
  if (!SD.begin(10)) { // Digital PIN 10
    Serial.println(" initialization failed!");
  } 
  else {
    Serial.println(" initialization done.");
  }
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // If the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("DHT TEST PROGRAM");
    myFile.print("LIBRARY VERSION: ");
    myFile.println(DHT11LIB_VERSION);
    myFile.println();
    myFile.println("Type,\tStatus,\tRH (%),\tT (C)");
    }
  else {
    // If the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  Serial.println();
  Serial.println("DHT TEST PROGRAM");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tStatus,\tRH (%),\tT (C)");
  delay(1000); // Wait before accessing Sensor
} // End setup

void loop(){ // Start loop
  int chk;
  Serial.print("DHT11, \t");
  chk = DHT.read(DHT11_PIN); // Read the value returned from sensor at digital PIN 4
  switch (chk){
    case DHTLIB_OK: // The sensor samples and its checksum are OK
                Serial.print("OK,\t"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: // The checksum test failed
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: // A timeout occurred, and communication has failed
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }
  
  // DISPLAY DATA
  Serial.print(DHT.humidity,1); // Print the humidity
  Serial.print(",\t");
  Serial.println(DHT.temperature,1); // Print the temperature
  
  // FILE WRITE 
  myFile.print(DHT.humidity,1); // Print the humidity
  myFile.print(",\t");
  myFile.println(DHT.temperature,1); // Print the temperature
  
  myFile.close();
  
  delay(600000); // Wait 10 minutes before accessing sensor again
} // End loop

OK, forse davo per scontate alcune cose:

  • Nel setup: 1. Apri; 2. Scrivi l'intestazione; 3. Chiudi.
  • Nel loop, ad ogni misurazione: 1. Apri; 2. Scrivi; 3. Chiudi.

Ora è più chiaro?

SukkoPera:
OK, forse davo per scontate alcune cose:

  • Nel setup: 1. Apri; 2. Scrivi l'intestazione; 3. Chiudi.
  • Nel loop, ad ogni misurazione: 1. Apri; 2. Scrivi; 3. Chiudi.

Ora è più chiaro?

Si, ma ho ancora dei problemi.

Ah OK, ma la soluzione è semplice.

SukkoPera:
Ah OK, ma la soluzione è semplice.

Davvero semplice.

Grazie al vostro aiuto sono riuscito a compilare il programma per fare eseguire ad arduino quello che volevo, per questo motivo vorrei condividere con tutti il codice. Il Programma è molto elementare ma ben commentato a lato.

// 
// FILE:    Humidity.07GIU16
// PURPOSE: WRITE DATA FROM DHT11 TO SD_CARD FILE
// PROBE:   ONE DHT11
// AUTHOR:  Antonio Cannavale
// COMFORT: HR 45%, T 21C
//  _________
// |876543219\
//

#include <SPI.h> // Include SPI library
#include <SD.h> // Include SD library
#include <dht11.h> // Include DHT11 library

dht11 DHT;
#define DHT11_PIN 2 // Input at digital PIN 2

File myFile;

void setup(){ // Start setup
  Serial.begin(9600); // Open serial communications and wait for port to open
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  // See if the card is present and can be initialized:
    Serial.print("Initializing SD card..."); // Print to the serial port
  
  if (!SD.begin(10)) { // Digital PIN 10
    delay(500); // Delay to let system boot
    Serial.println(" initialization failed!"); // Print to the serial port
    Serial.println();
    Serial.println("DHT TEST PROGRAM");
    Serial.print("LIBRARY VERSION: ");
    Serial.println(DHT11LIB_VERSION);
    Serial.println();
    Serial.println("Type,\tStatus,\tRH (%),\tT (C)");
    delay(1000); // Wait before accessing Sensor
  return; //Don't do anything more
  }
    Serial.println(" initialization done."); // Print to the serial port
    delay(500); // Delay to let system boot
    Serial.println(" initialization failed!"); // Print to the serial port
    Serial.println();
    Serial.println("DHT TEST PROGRAM");
    Serial.print("LIBRARY VERSION: ");
    Serial.println(DHT11LIB_VERSION);
    Serial.println();
    Serial.println("Type,\tStatus,\tRH (%),\tT (C)");
    delay(1000); // Wait before accessing Sensor

  // Open the file. Note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // If the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt..."); // Print to the serial port
    myFile.println("DHT TEST PROGRAM");
    myFile.print("LIBRARY VERSION: ");
    myFile.println(DHT11LIB_VERSION);
    myFile.println();
    myFile.println("Type,\tStatus,\tRH (%),\tT (C)");
    myFile.close(); // Close the file
    }
  else {
    // If the file didn't open, print an error:
    Serial.println("error opening test.txt"); // Print to the serial port
  }
} // End setup

void loop(){ // Start loop
  myFile = SD.open("test.txt", FILE_WRITE); // Open the file
  int chk;
  Serial.print("DHT11, \t"); // Print to the serial port
  myFile.print("DHT11, \t");
  chk = DHT.read(DHT11_PIN); // Read the value returned from sensor at digital PIN 2
  switch (chk){
    case DHTLIB_OK: // The sensor samples and its checksum are OK
                Serial.print("OK, \t"); // Print to the serial port
                myFile.print("OK, \t");
                break;
    case DHTLIB_ERROR_CHECKSUM: // The checksum test failed
                Serial.print("Checksum error, \t"); // Print to the serial port
                myFile.print("Checksum error, \t");
                break;
    case DHTLIB_ERROR_TIMEOUT: // A timeout occurred, and communication has failed
                Serial.print("Time out error, \t"); // Print to the serial port
                myFile.print("Time out error, \t");
                break;
    default: 
                Serial.print("Unknown error, \t"); // Print to the serial port
                myFile.print("Unknown error, \t");
                break;
  }
  
  // DISPLAY DATA
  Serial.print(DHT.humidity,1); // Print to the serial port the humidity
  Serial.print(",\t"); // Print to the serial port
  Serial.println(DHT.temperature,1); // Print to the serial port the temperature
  
  // FILE WRITE
  myFile.print(DHT.humidity,1); // Print the humidity
  myFile.print(",\t");
  myFile.println(DHT.temperature,1); // Print the temperature
  myFile.close(); // Close the file
  
  delay(600000); // Wait 10 minutes before accessing sensor again
} // End loop

Ho ancora mille idee per migliorare il programma, ad esempio verificare se il file test.txt esiste ed eventualmete cancellarlo. Inoltre mi piacerebbe ridurre al minimo i comandi evitando ridondanze inutili.

Decido di mantenere aperta questa discussione per inserire nuovi aggiornamenti sul codice.

Certo che quel delay di 10 minuti non è il massimo :smiley:
Perché non impari millis ? Guarda che se vorrai fare qualche modifica quel delay ti metterà non poco i bastoni fra le ruote... volendo potresti anche fare un file csv, perché per forza di testo?
Ciao!

SD.begin(pin SD);
  File logFile = SD.open ("quellochevuoi.csv", FILE_WRITE);
  if (logFile)
  {
    String header = "quellochevuoi, quellochevuoi, etc";
    logFile.println(header);
    logFile.close();

  }

Con solo questo nel setup, potresti farti un header di un file exel

e poi nel loop così definisci i tuoi 10 minuti, quel delay è pessimo fidati :wink:

unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = millis();


 previousMillis = millis();

    String dataString = String(DHT.humidity,1)+ ", " + String(quellochetipare);

    File logFile = SD.open("quellochevuoi.csv", FILE_WRITE);
    if (logFile)
      logFile.println(dataString);
    logFile.close();
}