Come salvare i valori della sonda DHT11 su SDCard?

Ciao tutti,
sono un autodidatta e vorrei chiedere il vostro aiuto con lo scopo di salvare i valori di una sonda digitale (DHT11) in un file su SDCard.
In rete ho trovato come costruire il supporto per breadboard e i collegamenti ma adesso non so come si scrive il codice, potete aiutarmi?

Grazie infinite

Vedi qua: https://www.arduino.cc/en/Tutorial/ReadWrite.

Perchè aprire un nuovo thread ?
http://forum.arduino.cc/index.php?topic=405297.msg2788556#msg2788556

@antoniocnn: ... qui vuoi parlare di come salvare su SD, mentre nell'altro thread parlavi di come salvare su PC ...

Diciamo che avresti potuto fare tutto in un unico thread senza aprirne due, per cui, in funzione di come evolverà la discussione, mi riservo di unire i due thread in uno solo.

Guglielmo

nid69ita:
Perchè aprire un nuovo thread ?
Come salvare i valori della sonda DHT11 su PC via seriale? - #4 by antoniocnn - Software - Arduino Forum

Come dice Giglielmo, qui volevo parlare di come scrivere su SDCard.

SukkoPera:
Vedi qua: https://www.arduino.cc/en/Tutorial/ReadWrite.

Ciao,
grazie della risposta.
Ci temgo a precisare che sono un autodidatta e che non dispongo di tanto tempo da dedicare per cui mi occorre il vostro aiuto.
Procediamo con ordine.
step 1
Dal tuo url posso capire che devo inserire nel mio codice alcune librerie per cui:

#include <SPI.h> // Include SPI library
#include <SD.h> // Include SD library
#include <dht11.h> // Include DHT11 library
dht11 DHT;
#define DHT11_PIN 4 // Input at digital PIN 4
File myFile;

Tutto corretto? Devo invertire, aggiungere qualcosa?

Grazie

Se usi un Arduino recente (consiglio sempre l'ultima versione, 1.6.9 al momento), SPI.h non serve nemmeno, puoi toglierla. SD.h ovviamente invece serve, è la libreria che si interfaccia con la SD.

SukkoPera:
Se usi un Arduino recente (consiglio sempre l'ultima versione, 1.6.9 al momento), SPI.h non serve nemmeno, puoi toglierla. SD.h ovviamente invece serve, è la libreria che si interfaccia con la SD.

Bene,
grazie del consiglio.
Proseguo con la compilazione.

step 2 (parte 1)

void setup(){ // Start setup
  Serial.begin(9600);
  delay(1000); // Delay to let system boot
  
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.print("Initializing SD card...");
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

In questa prima parte ci sono errori?

Grazie

L'unica cosa che puoi avere sbagliato è il 4, che deve corrispondere al pin usato per lo Slave Select dell'adattatore che usi per la SD. Se usi l'Ethernet Shield ufficiale dovrebbe essere corretto, altrimenti dovrai consultare la documentazione della scheda.

Noto che usavi il pin 4 per il DHT, ovviamente dovrai spostarlo.

Però, ti prego, non procediamo in questo modo. Leggi il tutorial, cerca di CAPIRE l'esempio e abbozza uno sketch intero, poi se non funziona o se hai domande specifiche vediamo.

SukkoPera:
L'unica cosa che puoi avere sbagliato è il 4, che deve corrispondere al pin usato per lo Slave Select dell'adattatore che usi per la SD. Se usi l'Ethernet Shield ufficiale dovrebbe essere corretto, altrimenti dovrai consultare la documentazione della scheda.

Come avevo spiegato l'adattotore per la SD card l'ho costruito con il procedimento descritto in questa guida http://www.instructables.com/id/Cheap-DIY-SD-card-breadboard-socket/ per cui non ero a conoscenza di collegare la scheda a questo pin. Per il collegamento mi sono affidato alla guida SD-card on Arduino – Arduino, ESP8266, ESP32 & Raspberry Pi stuff.

SukkoPera:
Però, ti prego, non procediamo in questo modo. Leggi il tutorial, cerca di CAPIRE l'esempio e abbozza uno sketch intero, poi se non funziona o se hai domande specifiche vediamo.

Daccordo faro come dici.

Grazie

E allora è il pin 10, quello che hai collegato al pin CS della SD.

PS: Ho pagato due lettori di MicroSD 1.52€ spediti dalla Cina, e mi sembra un po' più affidabile come soluzione :D.

SukkoPera:
PS: Ho pagato due lettori di MicroSD 1.52€ spediti dalla Cina, e mi sembra un po' più affidabile come soluzione :D.

Spero che la somma dei due facesse 1.52€ :smiley: :smiley: :smiley: QUESTO viene 0.49 US$ ... :grin: :grin: :grin:

Guglielmo

Tra un pò ti pagano per comprarli :grin:
Ma li rubano per venderli a quel prezzo ?!?

nid69ita:
Ma li rubano per venderli a quel prezzo ?!?

Mah ... probabile ... difatti costano più le spese di spedizione che l'oggetto ... :smiley: :smiley: :smiley:

Cercando, c'è pure chi te li spedisce gratis ... e, incredibile ... arrivano e funzionano :smiley: :smiley: :smiley:

Guglielmo

gpb01:
Spero che la somma dei due facesse 1.52€ :smiley: :smiley: :smiley: QUESTO viene 0.49 US$ ... :grin: :grin: :grin:

Sì, la somma! Ho anche quel modello che indichi (pagato 0.89€ per due esemplari), ma me ne serviva uno che esponesse il pin 3.3V, per poterlo alimentare a tale tensione. Vero che potevo saldare un filo al punto giusto e utilizzare quell'altro, ma ho preferito ostentare la mia estrema ricchezza :D.

ciao tutti,
ecco il codice completo

// 
// FILE:    Humidity.07GIU16
// PURPOSE: READ AND WRITE DATA FROM DHT11 TO SD CARD FILE
// PROBE:   ONE SENSOR
// AUTHOR:  Antonio Cannavale
// COMFORT: HR 40%, T 23C
//

#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);
  delay(1000); // Delay to let system boot
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.print("Initializing SD card...");
  if (!SD.begin(4)) { // Digital PIN 4
    Serial.println(" initialization failed!");
    return;
  }
  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("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

  delay(600000); // Wait 10 minutes before accessing sensor again
} // End loop

Per evitare di danneggiare la scheda non l'ho colegata perché ancora non ho le resistenze ma dal monitor seriale leggo:
Initializing SD card... initialization failed!
DHT11, OK, 62, 21

Domanda.
Perché non compaioni le scritte "DHT TEST PROGRAM" "LIBRARY VERSION:" "Type, Status, RH (%), T (C)" dopo la frase "Initializing SD card..."?
Vanno percaso messe prima? In quale riga?

Grazie

Perché dopo "Inizialization failed" hai messo un "return" che ti fa uscire dal setup() ...

Non credo che la cosa sia voluta ... magari c'era da dove hai fatto copia/incolla, ma messo li, appena l'inizializzazione della SD non riesce, ti butta fuori dal setup() e, peggio, vai quindi a finire nel loop() senza aver terminato il setup() !!!

Guglielmo

gpb01:
Perché dopo "Inizialization failed" hai messo un "return" che ti fa uscire dal setup() ...

Non credo che la cosa sia voluta ... magari c'era da dove hai fatto copia/incolla, ma messo li, appena l'inizializzazione della SD non riesce, ti butta fuori dal setup() e, peggio, vai quindi a finire nel loop() senza aver terminato il setup() !!!

Guglielmo

E quindi?
Basta toglierlo e sostituirlo con qualcos'altro, ma cosa?

Se lo togli, dopo aver mandato il messaggio di errore, ovviamente il programma proseguirà ... ma anche questo è sbagliato ...

Se l'inizializzazione è fallita ... NON devi aprire il file ... quindi ... devi ripensare a come scrivere quella parte :wink:

Guglielmo

gpb01:
Se lo togli, dopo aver mandato il messaggio di errore, ovviamente il programma proseguirà ... ma anche questo è sbagliato ...

Se l'inizializzazione è fallita ... NON devi aprire il file ... quindi ... devi ripensare a come scrivere quella parte :wink:

Guglielmo

Bene,
l'ho sostituito con "else"
Adesso il monitor seriale mi visualizza:

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

DHT TEST PROGRAM
LIBRARY VERSION: 0.4.1

Type, Status, RH (%), T (C)
DHT11, OK, 61, 21