Go Down

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

antoniocnn

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

Grazie
Antonio

SukkoPera

Prova a chiudere il file dopo la scrittura.
"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

Prova a chiudere il file dopo la scrittura.
Il comando close in che punto li metto?
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

#34
Jun 09, 2016, 03:23 pm Last Edit: Jun 09, 2016, 03:33 pm by antoniocnn
Prova a chiudere il file dopo la scrittura.
Questo non mi aiuta. Se lo metto alla fine ottengo:
Quote
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
Code: [Select]

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

SukkoPera

#35
Jun 09, 2016, 03:40 pm Last Edit: Jun 09, 2016, 03:41 pm by 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?
"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

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.
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

#38
Jun 09, 2016, 06:37 pm Last Edit: Jun 10, 2016, 07:28 am by antoniocnn
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.

Code: [Select]

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

As_Needed

#39
Jun 09, 2016, 09:13 pm Last Edit: Jun 09, 2016, 09:26 pm by As_Needed
Certo che quel delay di 10 minuti non è il massimo :D
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!



Code: [Select]
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 ;)

Code: [Select]
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();
}
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

antoniocnn

#40
Jun 10, 2016, 07:36 am Last Edit: Jun 10, 2016, 06:44 pm by antoniocnn
Certo che quel delay di 10 minuti non è il massimo :D
ho imparato quello al momento, procediamo con calma. Faccio un po di fatica a comprendere il linguaggio. Comuneque grazie del congliio :D

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?
Il comando millis al momento mi risulta difficile da comprendere. Ho deciso di fare un file di testo perché i comandi mi sembravano molto elementari, non escludo in futuro di sostituirlo con un altro formato più performante :D

Grazie dei suggerimenti sono molto contento e stimolato a migliorare

A tutti

Grazie
Antonio

As_Needed

MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

Go Up