Stocker et récupérer des données

De Wiki L.A.B
Aller à : navigation, rechercher

Afficher les infos d'une carte SD

Matériel
Principe

Avant de pouvoir écrire ou lire une carte SD, il est nécessaire de s'assurer a minima que la carte fonctionne. Si vous voulez écrire et qu'elle est en lecture seule, vous allez au devant de gros problèmes.

Programme

Voici le programme qu'il faut éditer dans l'IDE Arduino, puis compiler et charger dans la carte Arduino.

/*
  Ce programme affiche toutes les informations concernant la carte SD ainsi que son mode READ/WRITE
*/
#include <SPI.h>
#include <SD.h>

Sd2Card card;
SdVolume volume;
SdFile root;

// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
const int chipSelect = 4;    

void setup()
{
 // Ouvre le port serie et attend au besoin...
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.print("\nInitializing SD card...");
  pinMode(10, OUTPUT); 

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
   Serial.println("Wiring is correct and a card is present."); 
  }

  // print the type of card
  Serial.print("\nCard type: ");
  switch(card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Maintenant on essaie d'ouvrir le volume en fat 16 ou 32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }

  // On affiche la taille de l'espace
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
  
  volumesize = volume.blocksPerCluster();    
  volumesize *= volume.clusterCount();       
  volumesize *= 512;                            
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  
  Serial.println("\nFichiers trouves sur la carte avec nom, date et taille en bytes: ");
  root.openRoot(volume);
 
  // Liste les fichiers de la carte avec date et taille
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) { 
  // rien à faire
}

Ecrire des données sur une carte SD

Matériel
Principe

Le but est de montrer comment écrire dans un fichier.

Programme

Voici le programme qu'il faut éditer dans l'IDE Arduino, puis compiler et charger dans la carte Arduino.

/*
  Ce programme montre comment écrire sur une SD Carte
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 */
 
#include <SD.h>
#include <SPI.h>

File myFile;
void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  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(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  myFile = SD.open("test.txt", FILE_WRITE);
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    myFile.close();
    Serial.println("done.");
  } else {
    Serial.println("error opening test.txt");
  }
  
}

void loop()
{
	// nothing happens after setup
}

Lire des données depuis une carte SD

Matériel
Principe

Le but est de monter comment lire des informations d'un fichier sur la carte SD.

Programme

Voici le programme qu'il faut éditer dans l'IDE Arduino, puis compiler et charger dans la carte Arduino.

/*
  Ce programme montre comment écrire sur une SD Carte
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 */
 
#include <SD.h>
#include <SPI.h>

File myFile;
void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  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(4)) {
    Serial.println("initialization failed!");
    return;
  }
  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");

 // open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
	// nothing happens after setup
}

Ecrire à intervalle régulier les données d'un capteur de température/humidité

Matériel
  • Arduino Uno
  • Shield datalogger
  • Carte SD formatée en FAT 16/32
  • Plaque d'essai (breadbord)
  • Capteur DHT11 ou DHT22
  • Résistance 4,7kΩ 1/4W (si besoin)
  • Straps ou fils de liaison
Montage

Montage DHT11 Montage DHT11

Programme


Voici le programme qu'il faut éditer dans l'IDE Arduino, puis compiler et charger dans la carte Arduino. Il utilise une librairie.

Pour télécharger la librairie : DHT11 La librairie SD pour écrire sur la carte est nativement fournie par l'IDE.

#include <dht11.h>
#include <SD.h>
#include <SPI.h>

dht11 DHT11;
File myFile;
long iteration;

#define DHT11PIN 2

void setup()
{
  Serial.begin(9600);
  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(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile = SD.open("sensors.csv", FILE_WRITE);
  if (myFile) {
    Serial.print("Writing to sensors.csv...");
    myFile.println("loop;humidity,temperature");
    myFile.close();
    Serial.println("done.");
  } else {
    Serial.println("error opening sensors.csv");
  }
  
  Serial.println("DHT11 Humidity and Temperature Digital Sensor sketch");
  delay(1000);          // wait for sensor initialization

  // loop
  iteration = 1;
}

void loop()
{
  uint8_t chk = DHT11.read(DHT11PIN);

  Serial.print("Sensor status: ");
  switch (chk)
  {
    case 0:  Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    case -3: Serial.println("The sensor is busy"); break;
    default: Serial.println("Unknown error"); break;
  }

  Serial.print("Humidity (%): ");
  Serial.println(DHT11.humidity, DEC);

  Serial.print("Temperature (C): ");
  Serial.println(DHT11.temperature, DEC);

  myFile = SD.open("sensors.csv", FILE_WRITE);
  if (myFile) {
    Serial.print("Writing data from sensors to sensors.csv...");    
    String sIteration = String(iteration);
    String sHumidity = String(DHT11.humidity); 
    String sTemperature = String(DHT11.temperature); 
    myFile.println(sIteration + ";" + sHumidity + ";" + sTemperature);  
    myFile.close();
    Serial.println("done.");
  } else {
    Serial.println("error opening sensors.csv");
  }
  
  iteration++;
  delay(2000);
}