Go Down

Topic: Come salvare i valori della sonda DHT11 su SDCard? (Read 3423 times) previous topic - next topic

antoniocnn

#15
Jun 08, 2016, 06:27 pm Last Edit: Jun 09, 2016, 06:59 am by antoniocnn
ciao tutti,
ecco il codice completo

Code: [Select]

//
// 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
Antonio

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
Search is Your friend ... or I am Your enemy !

antoniocnn

#17
Jun 08, 2016, 06:34 pm Last Edit: Jun 08, 2016, 06:42 pm by antoniocnn
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?
Antonio

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 ;)

Guglielmo

Search is Your friend ... or I am Your enemy !

antoniocnn

#19
Jun 08, 2016, 07:01 pm Last Edit: Jun 08, 2016, 07:15 pm by antoniocnn
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 ;)

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
Antonio

SukkoPera

"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

antoniocnn

Hai messo le graffe?
Si, ecco un pezzo di codice:

Code: [Select]

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

antoniocnn

#22
Jun 08, 2016, 08:39 pm Last Edit: Jun 09, 2016, 07:11 am by antoniocnn
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.
Code: [Select]

 _________
|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
Antonio

brunello22

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

antoniocnn

Guarda che le resistenze sono obbligatorie, visto che una SD funziona a 3,3V
Senza resistenze si rompe
Allora la rimuvo e aspetto
Antonio

gpb01

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
Search is Your friend ... or I am Your enemy !

SukkoPera

#26
Jun 08, 2016, 09:20 pm Last Edit: Jun 08, 2016, 09:21 pm by SukkoPera
Una volta verificato, rileggi il post #10.

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

Code: [Select]
Serial.println(" initialization done.");

Tutto quel che segue viene eseguito in ogni caso.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

antoniocnn

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
Hai una qualche altra unità dove provarla/verificare se funziona ancora? Sul PC?

Guglielmo
Si, l'ho messa nel portatile e funziona.
Antonio

gpb01

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

Guglielmo
Search is Your friend ... or I am Your enemy !

brunello22

Quote
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

Go Up