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\
- Chip select -> PIN 10
- Data input -> PIN 11
- Ground -> GND
- 3,3V -> 3,3V
- Clock -> PIN 13
- Ground -> non connesso
- Data output -> PIN 12
- non connesso
- 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 ...
... 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.1Type, Status, RH (%), T (C)
66, 26
DHT TEST PROGRAM
LIBRARY VERSION: 0.4.1Type, 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
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
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();
}