Omet navegació

15.- SD i MicroSDHC

A la imatge tens el component/Shield utilitzat per connectar una targeta SD o MicroSDHC a Arduino, i els ports que no podem utilitzar a Arduino per que els ocupa el shield SD:

Sd Shield elecrow RHT03 + Arduino

La terminologia abreujada és la següent:

  • CS vol dir Chip select  or slave select
  • SPI vol dir Serial Peripheral Interface Bus
  • MOSI vol dir Master Output, Slave Input (output from master).
  • MISO vol dir Master Input, Slave Output (output from slave).
  • SCK vol dir Serial Clock

Primer de tot cal posar una targeta SD de la mida que vulgués formatejada amb Gparted a fat32, i després caldrà carregar la llibreria SD a la carpeta libraries d'Arduino de la teua home, en el meu cas l'he posada a «/home/tecnologia/Arduino/libraries/SD» però segons la teua versió de Arduino també podria anar a «/home/tecnologia/sketchbook/libraries» .  La llibreria SD la pots baixar des de la web del fabricant ecrow.

Ara ja pots provar el programa CardInfo.ino que trobaràs a la llibreria SD que acabes de carregar.

Path to cardInfo

Canvia la linea «const int chipSelect = 4;» per aquesta altra «const int chipSelect = 10;» El motiu és que la selecció de chip CS és fa pel port 10 d'Arduino per a aquest shield.
El resultat d'executar aquest programa al monitor sèrie d'Arduino és aquesta captura. A tu et variarà depenent de la mida de la teua SD i dels fitxers que hi hagen.

Monitor série Arduino amb SD

Ara ja pots provar el següent programa que fa servir la targeta SD per emmagatzemar la temperatura en ºC i la humitat relativa en % des de la data que li poses fins que l'atures.  Una vegada carregat el programa si retires el cable USB i deixes el cable que alimenta Arduino amb 5 V pots posar-lo a una estació meteorològica i retirar-lo quan vulgues, com que el fitxer de la targeta SD  s'obre cada vegada que es van a enregistrar els valors «Data, Humitat , Temperatura» en una fila nova i despres es tanca i espera 10 segons fins el següent valor, no tindràs cap problema a aturar el programa o traure-li la pila a Arduino per retirar la SD o MicroSDHC per llegir el fitxer de text sense errors.

Et calen a més a més de la llibreria SD les llibreries DHT i Time que tens ací: SD-Time-dht11-dht.zip (zip - 87657 B).

El programa també el pots baixar des d'ací: TiH-File_DFRobot.ino.zip (zip - 1874 B).

// TiH-File_DFRobot.ino Programa per enregistrar Temperatura en ºC ,Humitat en % i la data en format (day,month,yr,hr,min,sec) a una tergeta SD o microSDHC
// Per fer aquest programa s'han gastat les fonts 1 i 2 que segueixen
// Font1: http://playground.arduino.cc/Main/DHT11Lib
// Font2: https://www.arduino.cc/en/Tutorial/Files
// created   Nov 2010 by David A. Mellis
// modified 9 Apr 2012 by Tom Igoe
// Modificat 3 gener 2017 per Carles Ferrando
// Llicència: GNU GPL v3: https://www.gnu.org/licenses/gpl.html

#include <SD.h>
File myFile;
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 7
#include <Time.h>  

//Definim temperatura i humitat relativa reals mesurades pel sensor DHT11 de DFRobot
float temperatura; // T en ºC
float humitat; // Humitat relativa %

//Definim la data i hora per configurar el rellotge
int hora;
int minut;
int segon;
int dia;
int mes;
int any;

void setup()
{
 // Obre el port serie de comunicacions i espera per connectar al port
  Serial.begin(9600);
   while (!Serial) {
    ; // espera per connectar al port. Necessari sols per  Leonardo
  }

  //setTime(hr,min,sec,day,month,yr); // CAL POSAR L-HORA REAL I LA DATA AL COMENÇAR LA CLASSE A LA RATLLA DE SOTA
    setTime(13,15,00,3,01,2017); //  CAL POSAR L-HORA REAL I LA DATA AL COMENÇAR LA CLASSE

    Serial.println("IES Gabriel Ciscar Aula Tecnologia 3");

  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(10, OUTPUT);

  if (!SD.begin(10)) {
    Serial.println("Initcializacio feta!");
    return;
  }
  Serial.println("initcializacio feta.");

  if (SD.exists("dades.txt")) {
    Serial.println("dades.txt existeix.");
  }
  else {
    Serial.println("dades.txt no existeix.");
  }

  // Obre un fitxer nou i tanca'l de forma immediata:
  Serial.println("Creant dades.txt...");
  myFile = SD.open("dades.txt", FILE_WRITE);
  myFile.close();

  // Comprova si el fitxer existeix: 
  if (SD.exists("dades.txt")) {
    Serial.println("dades.txt existeix.");
  }
  else {
    Serial.println("dades.txt no existeix.");  
  }
 
}

void loop()
{
  // Actualitza l_hora a partir de l_hora configurada al setTime
  time_t t = now(); 
  hora = hour(t);
  minut= minute(t);
  segon= second(t);
  dia = day(t);
  mes= month(t);
  any= year(t);
  
 File dataFile  = SD.open("dades.txt", FILE_WRITE);

 // Llegeix les dades
   int chk = DHT.read(DHT11_PIN);
   
 // Mostra les dades pel terminal serie
 humitat=DHT.humidity ;  
 temperatura= DHT.temperature;
 Serial.print(dia);
 Serial.print("/");
 Serial.print(mes);
 Serial.print("/");
 Serial.print(any);
 Serial.print(" ");
 Serial.print(hora);
 Serial.print(":");
 Serial.print(minut);
 Serial.print(":");
 Serial.print(segon);
 Serial.print(" ");
 Serial.print(";");
 Serial.print(" ");
 Serial.print(humitat);
 Serial.print(" ");
 Serial.print(";");
 Serial.print(" ");
 Serial.println(temperatura);
   
//Guarda les dades a la targeta SD
if (dataFile) {
 dataFile.print(dia);
 dataFile.print("/");
 dataFile.print(mes);
 dataFile.print("/");
 dataFile.print(any);
 dataFile.print(" ");
 dataFile.print(hora);
 dataFile.print(":");
 dataFile.print(minut);
 dataFile.print(":");
 dataFile.print(segon);
 dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.print(humitat);
 dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.println(temperatura);
 
 dataFile.close();
} 
else {
  Serial.println("Error en obrir el fitxer");
  // if the file didn't open, do something here
}

delay (10000); // Espera 10 segons entre cada mesura

}



El resultat d'executar aquest programa és semblant a aquesta captura.

Captura de «dades.txt»