La carte Ethernet Shield est équipée d'un lecteur de carte microSD comme celles que l'on peut trouver dans certains téléphones. Beaucoup d'autres shields disposent également d'un lecteur de carte mémoire. Quel que soit le shield, l'accès à la carte mémoire se fait de la même manière.
Ci-dessous un extrait du schéma du shield Ethernet où l'on peut voir le connecteur de la carte mémoire.
La carte se connecte sur un bus SPI (Serial Peripheral Interface) à 4 fils (hors alimentation) :
L'EDI Arduino inclut une bibliothèque SD qui rend le fonctionnement du bus SPI transparent.
Vous devez avoir une carte Arduino UNO avec le Shield Ethernet. Une carte mémoire insérée dans le connecteur du Shield Ethernet. La carte mémoire doit être formatée en FAT16 ou FAT32 (pas de NTFS). Le nom du fichier ne doit pas faire plus de 8 caractères (hors extension).
Comme souvent, nous allons partir d'un exemple fournit par l'EDI Arduino. Ouvrir le fichier exemple "Datalogger" (Fichier => Exemples => SD).
Ce programme initialise la carte SD puis enregistre dans un fichier texte ("datalog.txt") le résultat des conversions analogiques / numériques des entrées analogiques 0 à 2. Les valeurs sont séparées par des virgules. L'opération est répétée en boucle. Nous pouvons suivre le déroulement du programme grâce aux informations affichées dans la console.
Attention : Il y a une petite erreur dans le programme ligne 43, remplacer pinMode(10, OUTPUT); par pinMode(chipSelect, OUTPUT);
Débrancher la carte Arduino UNO et ajouter la carte Danger Shield par-dessus le Shield Ethernet (voir photo ci-contre).
Nous allons maintenant apporter quelques modifications à ce programme.
à partir du schéma de la carte Danger Shield, modifier le programme de manière à enregistrer les résultats des mesures de la luminosité et de la température.
L'enregistrement se fait en boucle à la vitesse maximale à laquelle le microprocesseur peut aller (voir vitesse de défilement dans la console). Afin d'avoir une idée du temps écoulé entre deux mesures, nous allons ajouter une information temporelle dans chaque ligne enregistrée dans le fichier texte :
Temps, Luminosité, TempératurePour obtenir l'information "Temps", utiliser la fonction : micros()
Combien de microsecondes (en moyenne) séparent deux mesures successives ?
Par rapport à la capacité du type unsigned long, au bout de combien temps la valeur renvoyée par la fonction micros() va revenir à 0 ?
L'enregistrement devra maintenant se faire toutes les secondes...
Ouvrir le fichier exemple "ReadWrite" (Fichier => Exemples => SD).
Téléverser le programme, observer son fonctionnement (moniteur série + lecture du code).
Exécuter le programme plusieurs fois de suite (appuyer simplement sur le bouton reset du Shield Ethernet). Que constate-on au niveau du fichier "test.txt" ?
En faisant une compilation des exemples "Datalogger", "ReadWrite" et des travaux réalisés dans l'activité "Serveur Web", faire un programme qui reprend exactement la même chose que Datalogger (version 3ème modification) et qui affiche le fichier dans un navigateur WEB si on se connecte sur l'adresse IP du Shield Ehernet.
Remarque : Nous avons ici un fichier texte et non pas du HTML. Pour qu'il soit interprété ainsi par le navigateur (et non pas comme un fichier HTML), il faut dans l'en-tête http définir le "Content-Type" à "text/plain" au lieu de "text/html". Si on omet cette modification, le navigateur interprète alors le fichier comme un fichier HTML et les sauts de ligne sont alors ignorés.
Au lieu d'afficher le fichier "brut", nous allons afficher la courbe de température sous la forme d'un graphique :
à partir des informations ci-dessous, recréer la même page WEB à partir des résultats des mesures stockés dans le fichier texte de la carte mémoire.
Pour faciliter la création du graphique, nous allons utiliser une bibliothèque Javascript de Google comme dans le TP Serveur WEB.
Pour coder les lettres accentuées en Javascript : http://www.designvegetal.com/gadrat/c/caracteres/iso-8859-1.html#codeoct
Pour faciliter le travail, vous disposez de 2 fichiers à placer à la racine de votre carte mémoire :
Vous disposez également d'une fonction void EnvoieFichier(EthernetClient client, char* tNomFichier) :
Cette fonction permet d'envoyer un fichier présent à la racine de la carte mémoire à un client WEB. Elle s'utilise ainsi :
Article connexe : Arduino - Serveur Web