[RISOLTO] led su scrittura SD

Buongiorno a tutti, colgo l'occasione per farvi gli auguri per uno splendido anno.

Sto facendo delle prove con un data-logger di temperatura, ogni 5 minuti campiona 12 valori di temperatura nell'arco di un minuto, ne fa la media e poi scrive il risultato, la data e l'ora su una scheda SD.

Guardandolo ho pensato di volerlo "abbellire" con un led che si accende ad ogni scrittura.

Inizialmente mi è venuta l'idea di collegare il led ad un pin di Arduino (UNO) e farlo accendere per pochi millisecondi dopo il comando "dataFile.close()", poi mi sono chiesto se la cosa poteva essere fatta elettronicamente collegando il led direttamente a qualche segnale tra Arduino e la SD. Per farmi capire meglio, volevo chiedervi se era possibile collegare il led in modo analogo a quelli denominati "RX" e "TX" posti sul bus della schedina.

Grazie

Meluino

Scusate, rileggendo mi sono accorto di essermi dimenticato solo la cosa più importante :smiley: , lo schema con cui ho collegato la SD è QUESTO.

Meluino

Buonasera signori,
ormai reputo che il mio post non venga preso in considerazione. Anche perché normalmente le risposte vengono date nel giro di poche ore, soprattutto se sono abbastanza semplici e reputo che per qualcuno di voi questa lo sia. Non avrei sottolineato la cosa, però dato che anche il mio ultimo POST è stato ignorato, qualche pensiero comincio a farmelo...

Grazie

Meluino

Beh, sul tuo precedente post non ho nulla da dire, mi spiace, non conosco il prodotto e non saprei che fare
per quanto riguarda la tua idea attuale, a me non sembra una cosa poi così furba, di collegare un led su una linea della comunicazione SPI, comunque la cosa migliore è provare, metti un led con una resistenza tra gnd e MOSI, dimensioni per corrente molto bassa nel led (che così non alteri troppo i valori di lavoro del bus SPI) e vedi cosa succede, che poi se ne parla...
io comunque NON metterei il led su MISO, che viene dallo slave, che potrebbe non avere sufficente uscita in corrente, varrebbe casomai la rpova di metterlo invece che su MOSI su SS, occhio però che SS è negato, il led lo devi mettere al +, e se usi una solo device SPI forse SS semplicemente non viene tolto, dato che serve per "cambiare" il device
insomma, prova che vediamo....

Grazie Standardoil.

Standardoil:
a me non sembra una cosa poi così furba, di collegare un led su una linea della comunicazione SPI...

Infatti il mio quesito riguardava proprio questo, capire se questo tipo di soluzione potesse avere delle contro indicazioni.

Nel fine settimana farò sicuramente delle prove come mi hai consigliato, nel frattempo ho cercato nelle varie "SD-shield" e ho trovato qualcosa di interessante.

Nelle varie shield, praticamente ho spulciato solo quelle prodotte da Adafruit, ho notato il led chiamato "SD ACTIVITY LED", le configurazioni sono varie, ma questo SCHEMA rappresenta bene un po' tutte.

Ho visto che il led è inserito sulla linea SCK, però grande differenza tra questo schema e il mio circuito è l'utilizzo di un level shifter.

Standardoil:
Beh, sul tuo precedente post non ho nulla da dire, mi spiace, non conosco il prodotto e non saprei che fare...

Nessun problema, quando l'ho postato immaginavo che essendo un prodotto fuori produzione e soprattutto di un EX "competitor" la discussione non avesse molto appeal. Ma zero commenti...poi anche su questo post zero commenti dopo un giorno e mezzo, calcolando che si risponde a qualsiasi tipo di domanda...la cosa mi ha lasciato un po' d'amaro in bocca...

Grazie

Meluino

Tra l'altro, leggendo il pdf della shield Adafruit di cui ho postato lo schema, ho capito una cosa.
Come ho scritto nel primo post, volevo inserire un led per "abbellire" la schedina, ma in realtà questi "sd activity led" svolgono una funzione molto importante. Segnalare quando è il momento giusto per togliere la SD o spegnere il circuito. Vero è che nel mio caso si effettua una scrittura ogni 5 minuti e quindi andare a spegnere il circuito proprio in quell'istante è proprio da sfigati...! Però questo tipo di segnalazione può venire utile per progetti futuri dove magari la comunicazione sd è più frequente.

Meluino

C'è già un Led sul pin 13 ( SCK ) della UNO, non ti basta ?

brunello22:
C'è già un Led sul pin 13 ( SCK ) della UNO, non ti basta ?

Il led posto sulla UNO è coperto dalla proto shield (particolare che non avevo scritto), quindi risulta praticamente invisibile. Detto questo mi sono messo ad osservarlo e non l'ho mai visto accendersi, non vorrei che quello che gli sto facendo scrivere sia talmente piccolo e quindi rapido che non sia elettricamente "apprezzabile".

Ogni 5 minuti faccio scrivere questo:

if (dataFile) {
    dataFile.print(tempC);
    dataFile.print("\t");
    dataFile.print(now.day());
    dataFile.print("/");
    dataFile.print(now.month());
    dataFile.print("/");
    dataFile.print(now.year());
    dataFile.print("\t");
    dataFile.print(now.hour(), DEC);
    dataFile.print(":");
    dataFile.print(now.minute(), DEC);
    dataFile.print(":");
    dataFile.println(now.second(), DEC);

    dataFile.close();}

Meluino

il level shifter serve per la scheda SD, che se ben ricordo è a 3v3
ma se lavori dritto sulle uscite della UNO il led lo dimensioni per 5v
comunque temo proprio che alla velocità del bus SPI tu non faccia in tempo ad apprezzare l'accensione del led
nemmeno di un led che accendi apposta prima di aprire il file e spegni dopo averlo chiuso,
temo che l'intera operazione dura un "nullesimo" di secondo, casomai fai due conti con millis prima e dopo, che ti togli il dubbio
mi sa che ti tocca accendere un led apposta e mettere un delay per farlo vedere
oppure gioca a rovescio, metti un contatto che se non chiuso non cominci la scrittura, così, quando apri il contatto sai che antro il tempo di finire la scrittura e la scheda SD è libera

Puoi mettere un monostabile con un cd4538 sul pin ck della sd card , funziona anche a 3.3V, CX=100N RX=100K , led rosso a basso consumo e resistenza led da 2K2

Sì, infatti. Anche con porte elementari, che possono essere utili anche per altro, si può realizzare un monostabile.

Buonasera signori,
grazie a tutti per le risposte che mi state offrendo.

Ieri sera mi ero portato al lavoro tutto il necessario per fare qualche prova, ma...per esigenze lavorative non sono riuscito a fare nulla.

Poco male, ci riprovo stasera nella speranza di avere un periodo più tranquillo, nel frattempo vi devo dire che le vostre soluzioni mi piacciono parecchio, anche perché è evidente che quello che volevo fare in principio non è adatto al mio prototipo.

Grazie

Meluino

Buongiorno.

Ieri sera mi sono messo a fare alcune prove.

icio:
Puoi mettere un monostabile con un cd4538...

Non ho quell'integrato, perciò ho provato a fare un monostabile con due porte NOR, ho effettuato dei test a monte e li reputavo soddisfacenti. Purtroppo quando ho inserito il circuito all'interno del mio progetto non ho riscontrato i risultati sperati. Il led non si accendeva...

A fine turno mi sono accorto di avere a disposizione un CD4047BCN, potrebbe "sostituire" il cd4538?

Standardoil:
...temo che l'intera operazione dura un "nullesimo" di secondo, casomai fai due conti con millis prima e dopo, che ti togli il dubbio...

Ho provato ad inserire millis, togliendo i vari dalay e tempi di campionamento ho una differenza di 15 ms tra un ciclo e l'altro, a questo tempo va tolto il tempo di esecuzione ciclo???!!!

Comunque direi che evidentemente la mia richiesta è troppo esigente per quello che fa il datalogger in questione.
Ho deciso di fare un compromesso tra funzionalità e segnalazione, ovvero, ho inserito all'interno del firmware l'accensione di un led subito dopo il controllo della SD (in voidsetup), inoltre ne faccio accendere un altro prima di iniziare a scrivere su di essa e lo faccio spegnere a fine scrittura con un dalay di 1 secondo.
Diciamo che a parte il controllo iniziale, una volta iniziato il loop se la schedina per qualche motivo dovesse essere tolta i led continuerebbero a segnalare come se nulla fosse accaduto...però...

Meluino

meluino:
Diciamo che a parte il controllo iniziale, una volta iniziato il loop se la schedina per qualche motivo dovesse essere tolta i led continuerebbero a segnalare come se nulla fosse accaduto...però...

Meluino

perche? basta che metti l'accensione del LED "dopo" la if (datafile), chettelodebbopropriodireio?

Standardoil:
perche? basta che metti l'accensione del LED "dopo" la if (datafile), chettelodebbopropriodireio?

Io l'accensione l'ho messa dopo if (datafile), ma se tolgo la schedina il led continua al lampeggiare comunque, l'avevo provato ieri, ora mi hai fatto venire il dubbio e ho riprovato prima di rispondere. Confermo che il led continua a lampeggiare.
Ti posto lo spaccato di codice:

if (dataFile) {
    digitalWrite(SD_OK, HIGH);
    dataFile.print(tempC);
    dataFile.print("\t");
    dataFile.print(now.day());
    dataFile.print("/");
    dataFile.print(now.month());
    dataFile.print("/");
    dataFile.print(now.year());
    dataFile.print("\t");
    dataFile.print(now.hour(), DEC);
    dataFile.print(":");
    dataFile.print(now.minute(), DEC);
    dataFile.print(":");
    dataFile.println(now.second(), DEC);
    digitalWrite(SD_OK, LOW);
    dataFile.close();
    delay(1000);
  }

Intendevi così, giusto?

Meluino

che strano, avrei scommesso il contrario
posta il codice completo, va...

Il codice è questo:

#define tempPin 0
#define SD_OK 9
#include <SD.h>
#include <SPI.h>

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

int valori[12];
int T_campionamento = 5000;
int T_attesa = 240000;
int somma;
float media;
float tempC;
const int chipSelect = 10;

void setup() {

  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
  } else {
    //digitalWrite(SD_OK, HIGH);
  }
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

  analogReference(INTERNAL);
}

void loop() {

  delay (T_attesa);

  DateTime now = RTC.now();

  for (int i = 0; i < 12; i++) {
    valori[i] = analogRead(tempPin);
    delay(T_campionamento);
  }
  somma = 0;

  for (int i = 0; i < 12; i++)
    somma = somma + valori[i];

  media = somma / 12;

  tempC = media / 9.31;

  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  if (dataFile) {
    digitalWrite(SD_OK, HIGH);
    dataFile.print(tempC);
    dataFile.print("\t");
    dataFile.print(now.day());
    dataFile.print("/");
    dataFile.print(now.month());
    dataFile.print("/");
    dataFile.print(now.year());
    dataFile.print("\t");
    dataFile.print(now.hour(), DEC);
    dataFile.print(":");
    dataFile.print(now.minute(), DEC);
    dataFile.print(":");
    dataFile.println(now.second(), DEC);
    digitalWrite(SD_OK, LOW);
    dataFile.close();
    delay(1000);
  }
}

Meluino

non capisco, il reference della open() dice espressamente:
Returns
a File object referring to the opened file; if the file couldn't be opened, this object will evaluate to false in a boolean context, i.e. you can test the return value with "if (f)".
qui ci vuole qualcuno più esperto di me....
EDIT
no, poi scusa, non ci siamo, tu il delay lo hai messo DOPO aver spento il led, qua c'è qualcosa di non chiaro.....

Standardoil:
EDIT
no, poi scusa, non ci siamo, tu il delay lo hai messo DOPO aver spento il led, qua c'è qualcosa di non chiaro.....

Sì, lì c'è un errore di riscrittura, nel senso che mentre effettuato le prove diminuivo tempi, i campionamenti, spostavo i comandi...
Nel rimettere a posto ho scritto male. Durante i test lasciavo acceso il led per un secondo, il deley era prima dello spegnimento.

Meluino

anch'io ho male al pollice,
ma nel frattempo sono andato dal dentista,
ecco la foto della mia macchina nel parcheggio,
comunque il piede adesso va bene.................

posti l'ultima versione? e descrivi i problemi che ti da l'ultima versione?
altrimenti a casa non ci andiamo più........