Techniques "avancées" de serveur web sur ESP8266

1. Utilisation du SPIFFS avec un ESP8266

les processeurs ESP8266 embarquent un plus ou moins grosse mémoire flash accessible en SPI. C'est dans cette mémoire que vous chargez votre code mais il est aussi possible de stocker des fichiers directement dans cet espace. Stocker des fichiers veut dire qu'il faut un système de gestion de fichiers, et SPIFFS c'est cela: SPI Flash Filing System

On verra dans ce premier tuto comment configurer l'IDE pour charger des fichiers dans cet espace. Pour ce tuto j'utilise un WemosD1 mini R2 qui dispose de 4Mo de mémoire flash et qui est architecturé sur un ESP-8266EX

L'approche est similaire pour d'autres type d'ESP.

SPIFFS a été conçu pour être peu gourmand en resources processeur (ram) et offre des fonctions simples de haut niveau comme ouvrir, fermer, lire, écrire ou se positionner à un endroit précis d'un fichier. Utilisant la mémoire flash qui a tendance à s'user vite si on écrit toujours au même endroit, le SPIFFS offre une approche simple (statique) mais relativement efficace d'allocation des blocs pour éviter une usure prématurée de votre ESP.

Cependant n'y voyez pas l'équivalent dun file system moderne. il n'y a pas de correction d'erreur et il n'y a pas d'arborescence de fichier (répertoires et sous répertoires), tout est au même niveau.

Cependant le caractère / est accepté dans un nom de fichier ce qui fait que vous pouvez stocker un fichier du nom de "/web/index.htm" si vous voulez avoir quelque chose de structuré conceptuellement. Attention cependant les noms de fichiers sont limités à 32 caractères, y compris le '\0' de fin de c-string donc 31 caractères utiles.

ESP8266FS

Pour charger des fichiers directement depuis l'IDE il faut installer un plugin qui va copier les fichiers au bon endroit. Cela n'écrasera pas votre sketch que vous avez éventuellement déjà chargé, les zones mémoires étant bien définies (mais si vous changez la taille de la partition faut tout recharger)

Pour cela rendez vous sur Arduino plugin for uploading files to ESP8266 file system et suivez les instructions d'installation du gitHub "releases page"

1. Créez un répertoire tools dans votre dossier Arduino standard

2. Copiez dedans le fichier ESP8266FS-0.3.0.zip que vous avez téléchargé (à l'heure où j'écris ces lignes)

3. Dé-zippez le ficher, ça va créer dans .../Arduino/tools l'arborescence suivante: ESP8266FS/tool/esp8266fs.jar

4. Quittez et relancez l'IDE

5. Créez et sauvez à l'endroit qui vous convient un nouveau sketch vide sous le nom de testSPIFFS.ino

6. Dans l'explorateur de fichier de votre ordinateur, allez dans le dossier de ce nouveau sketch et créez un répertoire sous le nom de data (donc à côté de votre .ino) -> Ce sera la racine de ce qui sera transféré dans la mémoire flash gérée par SPIFFS

7. Prenez un éditeur de texte et créez un fichier contenant le code HTML suivant

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8" />
 <title>Démo SPIFFS</title>
</head>
<h1>Bonjour à tous!</h1>
</body>
</html>

8. sauvez ce fichier sous le nom de hello.html dans le répertoire data de votre sketch, en forçant le format UTF-8 (pour qu'on ait les accents comme il faut).

9. Une fois que le fichier est sauvé en UTF-8 dans le répertoire data du sketch, retournez dans l'IDE et assurez vous que la console Série soit fermée, que le bon port Série et la bonne "board" arduino soit sélectionnée. Dans le menu tools vous verrez une entrée ESP8266 Sketch Data Upload.

dataUpload.png

Notez que suivant votre carte, vous pouvez choisir une certaine répartition de l'espace flash: une partie pour le programme et une partie pour les données. Ici pour mon Wemos je peux avoir soit 1 Megas soit 3 Megas pour la partie SPIFSS

Plus vous prenez un espace de stockage important, plus le téléchargement des fichiers du répertoire data va durer longtemps car il initialise toute l'image mémoire. prenez 1M pour le SPIFFS si vous n'avez pas besoin de plus. (notez que si vous allez choisir d'autres types d'ESP vous aurez plus de choix de configuration de votre espace mémoire total, assurez vous d'avoir toute la place voulue en flash pour votre sketch).

10. Choisissez le menu "ESP8266 Sketch Data Upload", ça déclenche le téléchargement de votre répertoire data dans la mémoire des données flash de votre ESP. (si vous n'avez pas un ESP qui se fonctionne tout seul en téléchargement, il vous faudra le mettre en mode flash)

Regardez en dessous de votre sketch dans la console de compilation, il y a des informations qui défilent pour montrer la taille de vos données et ensuite la progression du chargement. (j'ai choisis un SPIFFS de 1 Mega)

Voici ce qui est affiché (on voit que je charge 1 Mega de données pris dans le répertoire data de mon sketch, transmis à 115200 bauds, donc ça prends assez longtemps)

[sub][SPIFFS] data   : ~/Desktop/[color=red]testSPIFFS/data[/color]
[SPIFFS] [color=red]size   : 1004[/color]
[SPIFFS] page   : 256
[SPIFFS] block  : 8192
/hello.html
skipping .DS_Store
[SPIFFS] upload : /var/folders/xk/mwl4yt3j5rsgdmgmgjlqsk7w0000gn/T/arduino_build_803691/testSPIFFS.spiffs.bin
[SPIFFS] address: 0x300000
[SPIFFS] reset  : nodemcu
[SPIFFS] port   : /dev/cu.Repleo-CH341-00002314
[SPIFFS] speed  : [color=red]115200[/color]

[color=red]Uploading 1028096 bytes[/color] from /var/folders/xk/mwl4yt3j5rsgdmgmgjlqsk7w0000gn/T/arduino_build_803691/testSPIFFS.spiffs.bin to flash at 0x00300000
................................................................................ [  7% ]
................................................................................ [ 15% ]
<snip>
................................................................................ [ 95% ]
............................................                                     [ 100% ][/sub]