SCRITTURA FILE CSV CON DATI TEMPERATURA SU SD CARD

Codice e Schema con PIC18F458 per Scrivere su Scheda di Memoria SD un file CSV con i dati di Temperatura raccolti ogni 10 Secondi…

 
 
 
 




 

INTRO

L’idea per questo progetto nasce dalla curiosità di monitorare le condizioni ambientali per lunghi periodi e poi andare a creare grafici per la temperatura, umidità, vento, e altre variabili. La memoria più semplice da utilizzare in questo caso è la scheda SD ed andare a scrivere i valori in un file CSV. In questo modo si possono andare a scrivere moltissimi valori senza preoccuparsi dello spazio occupato.

In questo esempio si va a leggere la temperatura da un sensore LM35 e visto che vi è una sola variabile da tenere in considerazione i dati vengono messi uno per uno in colonna ogni 10 secondi. Lo spegnimento del sistema comporta l’automatica chiusura del file .CSV permettendo quindi di rimuovere la scheda SD.

Inserita su un PC con installato microsoft excell sarà possibile realizzare il grafico con l’andamento della temperatura.

Ad esempio la temperatura della mia stanza monitorata per alcuni minuti è la seguente:

I picchi potrebbero essere fluttuazioni dovute al rumore, inaccuratezza dello strumento, errore di conversione o altri fattori. Una volta che i dati sono su excell si potrebbe anche eseguire un filtraggio oppure una media. Inoltre i dati sono accessibili anche su matlab.

 




 
CODICE

Il codice è il seguente:

sbit Mmc_Chip_Select           at LATC0_bit;   //CS modulo SD card
sbit Mmc_Chip_Select_Direction at TRISC0_bit;  //RCO

char filename[9] = "Temp.csv";          //Nome del file
char temp[5];                           //Stringa valore temperatura
float temperatura;                      //valore temperatura
char carr_ret_nl[]="\r\n";              //Stringa per andare a capo

//sottoprogramma per creare un nuovo file e scrivere la prima riga
void M_Create_New_File() {
  Mmc_Fat_Set_File_Date(2020, 6, 3, 22, 0, 0);   //anno, mese, giorno, ora, minuti, secondi
  Mmc_Fat_Assign(&filename, 0xA0);               //Cerca il file o ne crea uno nuovo
  Mmc_Fat_Append();                              //Aggiungi al file
  Mmc_Fat_Write("Temperatura °C", 14);           //Scrivi stringa
  Mmc_Fat_Write(carr_ret_nl, 3);                 //Vai a capo
}

//sottoprogramma per aggiungere una nuova riga al file
void File_Open_Append(float tempIN){                  //ricevi il float con la temperatura
   Mmc_Fat_Assign(&filename, 0xA0);                   //Cerca il file o ne crea uno nuovo
   Mmc_Fat_Append();                                  //Aggiungi al file
   FloatToStr_FixLen(tempIN, temp, 5);                //Converti la temperatura in stringa a 5 caratteri
   Mmc_Fat_Write(temp, 5);                            //Scrivi la stringa con la temperatura (5byte)
   Mmc_Fat_Write(carr_ret_nl, 3);                     //Vai a capo
}

void main() {
  TRISB.B0 = 0;                                         //PORTB LED
  ADC_Init();                                           //Inizializza ADC

  SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);   //Inizializza SPI

  if(Mmc_Fat_Init() == 0) {                          //Se la SD è stata rilevata

    M_Create_New_File();                             //Crea nuovo file
    
    while(1){                                        //Ciclo infinito
      temperatura = ADC_Read(0);                     //Leggi canale 0 ADC
      temperatura = temperatura * 0.4882;            //Converti temperatura
      File_Open_Append(temperatura);                 //Scrivi temperatura
      PORTB.B0 = 1;
      delay_ms(2000);                                //Lampeggio led acceso 2 secondi
      PORTB.B0 = 0;
      delay_ms(2000);                                //Altri 8 secondi di delay
      delay_ms(2000);
      delay_ms(2000);
      delay_ms(2000);
    }
  }
}

Prima di tutto indico nel codice dove è connesso il Chip Select della scheda SD, poi inizializzo alcune variabile che mi serviranno nel codice e alcune sottofunzioni. La prima sottofunzione crea il file con una determinata data di creazione e si va a scrivere la prima stringa ovvero “Temperatura °C”. Nella seconda sottofunzione si va a riprendere il file e si aggiunge una riga contenente la temperatura. Nel codice principale si inizializzano l’ADC e le porte B come uscite.

Si inizializza il protocollo di comunicazione SPI. Usare una frequenza di Fcristallo/64 va bene per un quarzo da 4MHz. Se si usa un quarzo più piccolo bisogna usare _SPI_MASTER_OSC_DIV64 diverso. Dopo di che se la scheda SD viene rilevata, quindi la comunicazione funziona e la scheda SD è inserita si va a creare il file. Nel ciclo infinito si va a leggere la temperatura, la si converte in gradi e poi si richiama la routine di scrittura di una nuova riga. Si accende il LED, lo si rispegne dopo due secondi e poi vi sono altri 4 delay da 2 secondi in modo tale che la temperatura venga letta ogni 10 secondi circa.

Le routine utilizzate della libreria SD card sono le seguenti:

  • Mmc_Fat_Init(); inizializza la comunicazione con la scheda SD, se è tutto apposto ritorna 0, se non trova il filesystem 1 se non trova la scheda SD restituisce 255.
  • Mmc_Fat_Set_File_Date(2020, 6, 27, 22, 0, 0); Setta la data di creazione del file, bisogna inserire anno, mese, giorno, ora minuti secondi nell’ordine.
  • Mmc_Fat_Assign(“file.txt”, 0xA0); Cerca il file chiamato file.txt, se non esiste lo crea.
  • Mmc_Fat_Append(); Modifica il file richiamato dalla funzione precedente.
  • Mmc_Fat_Write(“NE555.IT”, 8); Scrive nel file la stringa, bisogna indicare quanti byte è la stringa, in questo caso 8.
  • char carr_ret_nl[]=”\r\n”; Scrivendo questa stringa si manda a capo. La dimensione di questa stringa è 3 byte anche se sono solo 2 caratteri (char 13 e char 10).

Vi sono molte altre funzioni per la scrittura su scheda SD ma non sono state usate per questo progetto.

 

SCHEMA

Lo schema è il seguente:

Il cristallo X1 è un quarzo da 4MHz e con i due condensatori da 22pF formano il circuito di oscillazione. La resistenza R1 serve per evitare che il PIC18F458 si resetti, mentre ai pin 11 e 32 si hanno 5V e ai pin 12 e 31 la massa dell’alimentazione. C3 è un condensatore di filtraggio.

Il modulo SD CARD è alimentato anch’esso a 5V anche se internamente funziona a 3.3V.

Il sensore di temperatura è un LM35 e il LED di segnalazione ha un resistore da 1K come limitatore di corrente. Il chip select del modulo è connesso a RC0 e la comunicazione è effettuata in SPI.

Lo schema montato su breadboard ha l’aspetto mostrato in foto. L’alimentatore del circuito è formato da un vecchio alimentatore 5V 1A caricabatteria per cellulare.

 

DOWNLOAD

Potete scaricare la simulazione del circuito con PROTEUS e i file MIKROC al seguente LINK!!!

 




 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

1 pensiero su “SCRITTURA FILE CSV CON DATI TEMPERATURA SU SD CARD

  1. Ciao. Stavo da tempo cercando uno schema semplice per scrivere molti valori di una grandezza su un file csv salvato su una SD micro memory.
    Vorrei registrare non la temperatura ma l energia elettrica consumata
    . Ho dei contatori di energia con uscita tipo S0: viene rilasciato un impulso ogni tot kwh misurati. (esempio per contatori Orno WE-521 emessi 1000 impulsi per kwh.)È possibile creare un circuito con PIC che conti quanti impusi sono stati emessi ogni minuto e memorizzi il valore sulla SD card?
    Grazie
    Paolo Ming

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *