Les Bases d'un Serveur Web sur ESP-01 en commande AT

De même le setup() est maintenant simplifié, on envoie la suite de commandes

AT+RESTORE
AT+CWMODE=1
AT+CWQAP
AT+CWJAP="ssid","pwd"
AT+CIPMUX=1
AT+CIPSERVER=1,80

en vérifiant à chaque fois que ça s'est bien passé.

Si ça se passe mal - je ne le fais pas ici - vous pourriez couper l'alimentation de l'ESP par exemple si elle est pilotée pour le rebooter complètement et éventuellement balancer un reset de l'arduino.. c'est la gestion d'erreur simple, on reboot... :). Il faudrait injecter un peu d'intelligence pour ne pas que ça reboot sans arrêt, utiliser l'EEPROM par exemple pour mémoriser le reboot et ne pas rebooter plus de 3 fois et avoir dans ce cas un mode de boot piloté par un switch qui bosserait dans un mode de configuration etc... bref un monde de possibilités !


On peut rendre notre code un peu plus configurable. Vous avez vu que je n'ai pas codé en dur partout que mon ESP était sur Serial1 mais j'utilise une macro qui remplace ESPSEPRIAL par le nom du port Série à utiliser. C'est une bonne pratique à retenir si vous voulez du code adaptable; En procédant ainsi, grace à la compilation conditionnelle, on peut même gérer un port Série SoftwareSerial ou Hardware Serial. Voici comment je fais:

// Don't go faster than 38400 with sowftare serial for reliability
#define ESPSERIALBAUD 115200 // Set to whatever is used by default by your ESP after a RESTORE

// uncomment this line if you want to use sowftare SERIAL and define the pins you use below
// #define USESOFTWARESERIAL

#ifdef USESOFTWARESERIAL
#include <SoftwareSerial.h>
// DEFINE THE PINS YOU USE FOR SOFTWARE SERIAL
#define ARDUINO_RX_PIN 5    // set here the pin number you use for software Serial Rx
#define ARDUINO_TX_PIN 6    // set here the pin number you use for software Serial Tx
SoftwareSerial esp01(ARDUINO_RX_PIN, ARDUINO_TX_PIN); // rxPin (the pin on which to receive serial data), txPin (the pin on which to transmit serial data)
#define ESPSEPRIAL esp01
#else
// DEFINE WHICH HARDWARE SERIAL YOU USE
#define ESPSEPRIAL Serial1  // could be Serial1, Serial2, Serial3 etc depending on your hardware.
#endif

Si vous définissez USESOFTWARESERIAL alors le compilateur va importer la classe SoftwareSerial définir 2 pins pour le Rx et Tx, créer une instance de la classe et définir ESPSEPRIAL à cette instance. Sinon vous affectez ESPSEPRIAL au port série matériel que vous voulez. Comme cela c'est super simple de passer sur Serial2 si c'est celui là qui vous plait.

EDIT: VOIR POST #41 SUR LA DISCUSSION DU AT+RESTORE, LE PLUS SIMPLE EST ALORS DE S'EN PASSER

On aurait pu faire pareil avec la fonction de debug et définir quel port Série utiliser pour afficher les messages de debug, j'ai eu la flemme, mais comme les fonction de debug sont encapsulées et qu'il n'y a pas des print qui traineront partout dans le code, ce serait facile à faire.


Voilà en mettant tout cela bout à bout et en injectant un peu de code on arrive à un projet qui fonctionne. On n'a pas traité tous les cas d'erreur, donc parfois faudra rebooter votre machine si d'aventure le réseau Wi-Fi était perdu etc... mais vous avez le principe.

Je vous joins un projet complet qui affiche cette page web. (les quelques commentaires sont en anglais, question d'habitude... désolé pour les non anglophones)

j'ai hacké un petit goodie supplémentaire dans la fonction qui lit le HTML stocké en mémoire flash: Je regarde avant d'envoyer le code si la ligne contient (un seul) "$$$x$$$". si c'est le cas la génération de code est modifié et on remplace le "$$$x$$$" par le contenu d'une variable stockée à la position x dans un tableau global. ça permet de rendre le code HTML statique en mémoire flash, mais de générer un truc un peu plus dynamique. par exemple la ligne HTML qui affiche la température est

Temp&eacute;rature = [color=red]$$0$$[/color]&deg;C

et le $$$0$$$ est replacé par [nobbc]variables[0][/nobbc] lors de l'envoi à l'ESP.

Ce n'est pas une implémentation robuste, il ne faut pas que la ligne soit trop longue pour ne pas être tronquée au milieu des $$ par exemple ou que je déborde de mon buffer... je vous laisse améliorer le concept :slight_smile:

Mais ça vous donne une idée de comment rendre tout cela un peu plus dynamique et donc les boutons sont fonctionnels et pour le montrer si vous augmentez ou baissez la température, la LED intégrée de la carte arduino clignotera plus ou moins vite (demi période = 10 fois la valeur de la température).

En PJ le projet complet.

En espérant que cela vous aide à

  • Analyser un problème avant de commencer à coder
  • comprendre mieux comment on peut parler à son ESP-01 par commande AT
  • architecturer un projet (il y a 2h de codage donc c'est pas super génial)
  • éviter si on peut ce qui mange beaucoup de mémoire
  • créer des trucs funs...

Soit dit en passant, vous voyez aussi pourquoi c'est galère et que la majorité de ceux qui utilisent un ESP pour une communication Wi-Fi ne le font pas au niveau de la ligne de commande mais prennent une librairie toute faite :slight_smile:

Have fun!

ESP01_WebServer.zip (5.62 KB)