Buongiorno,
Innanzitutto scusate per la lunghezza del messaggio ma vorrei descrivere bene il mio problema per evitare dubbi. Sto cercando di realizzare un datalogger con Arduino e la cosa è da molto che va avanti causa numerosi incidenti di percorso. Comunque poco a poco sto risolvendo questi problemi se non fosse che oggi ne è saltato fouri uno che davvero non riesco a superare. Prima del codice vi spiego brevemente lo scopo: vorrei che arduino leggesse, ogni mezz’ora, due sensori (temperatura, celle di carico) e salvasse i file su una SD. Inoltre mi piacerebbe mettere un led per segnalare sia quando arduino sta facendo i rilevamente, in modo da non estrarre la sd in quel momento, sia quando la sd non è presente ad esempio per il download dei dati. Ho visto che sulla libreria SD esiste l’apposita SD.begin che dà false in caso di assenza di sd e ho pensato di utilizzarla in questo modo:
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3 //definisce il pin del termometro
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);
int sensorPin1 = A1, sensorPin2 = A2; //analogici celle di carico
int sleep1=1, sleep2=2; //digitali dello sleep
int redLed=5;
const int chipSelect = 10; //per la SD
File ArduBeeNo; //indirizzo del file
void setup()
{
pinMode(sleep1, OUTPUT); //setta i pin degli sleep in OUTPUT
pinMode(sleep2, OUTPUT);
pinMode(10, OUTPUT); //per la SD
pinMode(redLed, OUTPUT); //setta i pin per i led
digitalWrite(redLed, LOW);
SD.begin(chipSelect);
delay(100);
}
void loop()
{
char time[21];
while(!SD.begin()) //verifica che ci sia la SD
{
digitalWrite(redLed, HIGH); //accendi il led rosso
delay(1000);
}
digitalWrite(redLed, LOW); //spegni il led rosso
if (flag()==1) // se siamo sulla mezz'ora
{
digitalWrite(redLed, HIGH); //accende il led rosso
ArduBeeNo=SD.open("ArduBeeNo.csv", FILE_WRITE); //apre il file
getTime(time);
ArduBeeNo.print(time); //scrive l'ora
ArduBeeNo.print(";");
ArduBeeNo.print(getWeight()); //scrive il peso
ArduBeeNo.print(";");
ArduBeeNo.println(getTemperature()); //scrive la temperatura
ArduBeeNo.close(); //chiude il file
digitalWrite(redLed, LOW);
}
delay(1000);
}
Il codice è un estratto solo di main e loop, ci sono altre funzioni ma intevengono solo in fase di rilevamento, il mio problema invece è che il led rimane acceso sempre, in poche parole non riesce ad uscire dal ciclo while di verifica della SD. Premetto che:
- da istruzioni di datalogger (la mia è adafruit) ho appunto messo il pin CS sul 10 e nn sul 4;
- la SD funziona benissimo usando la scheda con lo sketch di esempio;
- per quanto ne sappia nessuno dei sensori/led attaccati interferisce con la SD poichè ho lasciato libero i pin 10,11,12,12 e anche il 4 per sicurezza.
Se qualcuno mi riuscisse ad aiutare, gliene sarei infinitamente grato