Opérations de base sur un module wifi ESP8266 d'Arduino

Opérations de base sur un module wifi ESP8266 d'Arduino

Opérations de base sur un module wifi ESP8266 d'Arduino

Quand expressif lancé les premiers modules sur le marché Wifi avec l'intégré ESP8266 et l' firmware avec lequel le gérer à l'aide des commandes AT, ce qui nous intéressait, nous, les utilisateurs, c'était de l'intégrer dans des assemblys avec microcontrôleurs et les problèmes se réduisaient à connaître le (autrefois) sombre Tableau des commandes AT ESP8266, les besoins alimentaires ou Mise à jour du micrologiciel ESP8266.

Table des matières

    Puis des alternatives sont rapidement arrivées pour programmer le ESP8266 et implémentations de modules Wifi de formats très différents qui soulèvent d’autres préoccupations : quel module wifi ESP8266 choisir en fonction de la gamme des différentes antennes (y compris externes) ou de l'intégration physique de ces nouveaux modules dans nos assemblages.

    Il est certain qu'en raison de tous ces changements, l'accent n'a peut-être pas été mis sur les aspects les plus fondamentaux, sur la gestion la plus élémentaire du système. Module Wi-Fi ESP8266. Bien que polarité.es Vous pouvez trouver des informations sur l'utilisation du ESP8266 et il existe quelques applications destinées à expliquer de manière générique le fonctionnement du Module Wi-Fi ESP8266 en utilisant les commandes AT, notamment dans l'article sur bibliothèque pour faire des requêtes HTTP depuis Arduino avec le module wifi ESP8266, les impressions des lecteurs suggèrent qu'il serait utile d'ajouter quelques informations de base supplémentaires pour aider les utilisateurs du ESP8266 pour réaliser leurs propres implémentations.

    Discutez des opérations de base pour travailler avec le ESP8266 et proposer des solutions génériques est un objectif de plusieurs parties très différentes ; Pour aider à suivre le contenu de l’article, l’index suivant peut servir de guide :

    Contrôlez le module wifi ESP8266 depuis l'ordinateur via le port série

    D'une assiette Arduino et en utilisant votre IDE il est possible de surveiller le fonctionnement d'un Module Wi-Fi ESP8266, envoyer le Commandes AT ESP8266 et voyez la réponse mais il est beaucoup plus pratique de le faire depuis un ordinateur avec une application de type terminal.

    Utiliser CuteCom pour tester le module wifi ESP8266 via le port série

    Selon le tableau Arduino utilisé, un seul port série matériel peut être disponible, ce qui ajoute un peu d'inconvénient à l'envoi et à la réception. Changer la vitesse de communication est beaucoup plus confortable dans une application de communication série à partir d'un ordinateur et de certaines cartes mères. Arduino (et dans certaines circonstances) ne prennent pas bien en charge les vitesses les plus élevées des communications série, en particulier 115200 XNUMX bauds, qui est la vitesse par défaut des dernières versions du firmware.

    À Propos De Quel programme utiliser pour surveiller le ESP8266 en utilisant le port série, il existe de nombreux choix en fonction des besoins et des préférences ; ces derniers temps, j'utilise davantage le classique MignonCom (celui de la capture d'écran ci-dessus) car il est très confortable pour moi de répéter certains Module wifi ESP8266 aux commandes dans les tests de projet.

    Quelques recommandations ont déjà été données ici sur les programmes fonctionnant comme une console série ; Par exemple, quand on parle de PuTTY pour contrôler les périphériques série UART depuis l'ordinateur. PuTTYEn plus d'être une excellente application, elle est disponible pour la plupart des systèmes d'exploitation de bureau. De plus, comme PuTTY peut être utilisé comme console avec à la fois le port série et le Famille de protocoles Internet (TCP/IP), y compris ceux qui opèrent sur TLS, devient un outil courant qui compense largement le (peu) temps passé à le configurer et à s'habituer à son utilisation.

    Utilisation de PuTTY pour tester le module wifi ESP8266 via le port série

    En plus du logiciel de communication série, pour connecter le Module Wi-Fi ESP8266 au port USB Un ordinateur nécessite également un convertisseur USB à la série TTL. Comme dans le cas des logiciels, il existe plusieurs versions, à partir desquelles elles servent uniquement à convertir le port USB sur un port série TTL (qui peuvent être obtenus à partir d'un euro) à ceux qui peuvent émuler différents protocoles (comme SPI o I2C).

    Tout comme un programme qui fonctionne comme une console série, le matériel permettant de communiquer avec l'ordinateur via USB avec un circuit logique (pas seulement le ESP8266) sera un outil courant dans le travail d'un développeur d'applications microcontrôlées, cela vaut la peine de l'avoir dans la boîte à outils le plus tôt possible et de travailler avec lui Module Wi-Fi ESP8266 C'est une excellente opportunité d'en obtenir un.

    Matériel pour les communications série USB UART pour surveiller le module wifi ESP8266

    Le convertisseur USB a UART TTL Il peut également être utilisé pour surveiller le comportement d'un circuit qui utilise le ESP8266, pour ce faire, les sorties que l'on souhaite surveiller sont connectées en série à l'entrée de données (RX) du convertisseur avec une diode rapide (la 1N4148, par exemple) et une résistance (2K2, par exemple) en parallèle l'une avec l'autre. Une telle configuration fonctionne comme un renifleur série matériel.

    Exemple de renifleur pour ESP8266 connecté à Arduino à l'aide d'un convertisseur USB UART TTL

    Bien que le renifleur dans l'image ci-dessus soit certainement rudimentaire (entre autres, il n'a pas tampon) suffit à contrôler le fonctionnement d'un assemblage avec Arduino et l' ESP8266.

    En supprimant le renifleur du schéma précédent, le schéma montrant comment connecter un Module Wi-Fi ESP8266 à une assiette Arduino. En plus de l'alimenter en 3V3, la broche de réinitialisation et la broche d'activation de l'intégré doivent être connectées à un niveau haut (enable). Bien entendu, la broche RX de l’un doit se connecter au TX de l’autre.

    Pour simplifier le schéma précédent, une plaque a été représentée Arduino alimenté en 3V3 et pour lequel une tension sur le port série est également supposée être de 3V3. Si vous utilisez un microcontrôleur avec un niveau de signal différent sur le port série (normalement 5 V) sera nécessaire, afin de ne pas endommager le ESP8266, utiliser un convertisseur de niveau comme ceux des schémas ci-dessous. Ce circuit se retrouve fréquemment dans de nombreuses implémentations de modules commerciaux.

    Convertisseur de niveau de signal 5V à 3V3 pour module WiFi ESP8266 et Arduino

    Mettre à jour le micrologiciel ESP8266

    Les Commandes AT ESP8266, sa terminaison, la vitesse par défaut du module... dépendent de la version du Micrologiciel ESP8266. Il est préférable de s'assurer que vous disposez de la même version dans tous les modules et, si possible, qu'il s'agisse de la dernière version.

    Malheureusement, la plupart des Modèles de modules Wi-Fi ESP8266 Ils ne disposent que de 4 Mbits, la version la plus récente ne peut donc pas y être installée. La dernière version (officielle) du firmware pouvant être installée sur Module Wi-Fi ESP8266 avec 4 Mbits (la plupart) est 0.9.4 qui inclut la version 0.2 du Commandes AT ESP8266.

    En résumé, pour mettre à jour le firmware il vous faut :

    1. Téléchargez la version du firmware correspondante. la dernière version (officielle) d'un module doté de 4 Mbits de mémoire se trouve dans le dossier Espressif sur github. Dans le Site Expressif Vous pouvez télécharger la version la plus récente du firmware, mais il est très important de vérifier que le module sur lequel il est installé dispose de suffisamment de mémoire.

    2. Téléchargez la dernière version de l'outil d'installation du micrologiciel. Mon favori est tremble qui est écrit dans Python, donc cela fonctionne sur n’importe quelle plateforme. En plus d'être téléchargé, il peut également être installé avec pip install esptool (o pip2 o python -m pip…). Bien sûr, expressif Il propose également son propre outil mais n'est actuellement disponible que pour Windows.

    3. Préparer les fichiers téléchargés; décompressez-les dans un dossier accessible et, si nécessaire, rendez l'outil exécutable tremble, dans mon cas, puisque GNU / Linuxavec chmod +x esptool

    4. Connectez le module à l'ordinateur à l'aide d'un convertisseur USB UART TTL ça marche en 3V3 ou utilisez un convertisseur de niveau s'il fonctionne à 5 V. En plus de l'alimentation, vous devrez connecter le TX au RX du convertisseur USB UART TTL, RX vers TX, GPIO0 à bas niveau (GND) et peut-être GPIO2 à haut niveau (dans mes tests, cela a fonctionné à la fois en le connectant à bas niveau et en le déconnectant). Si le module a la connexion GPIO15 libre (comme cela se produit dans l'ESP-12), il doit être connecté à un niveau bas. RESET, qui serait normalement à un niveau haut pendant le fonctionnement, peut être laissé non connecté ou connecté à un niveau haut au moyen d'une résistance (10K, par exemple), car avant de commencer l'enregistrement, il peut être nécessaire de réinitialiser l'appareil en le connectant. à un niveau bas.
      En allumant le module, il sera disponible pour la mise à jour mais, Si une erreur de connexion s’affiche, il faudra la réinitialiser connecter RESET à un niveau bas pendant un instant, puis le laisser à l'antenne (sans connexion) pour le processus de mise à jour.
      Le module a pics de consommation d'un demi-ampère (jusqu'à 600 mA, selon certains utilisateurs) il est donc important d'utiliser une alimentation capable de supporter cette consommation, notamment pour la mise à jour du firmware.

      Connexion module wifi ESP8266 ESP-01 vers USB UART TTL convertisseur mise à jour du firmware

    5. Exécutez l'outil pour mettre à jour le firmware. Dans mon cas, j'ai enregistré les documents de l'outil et du firmware à l'étape 3 dans le même dossier, je lance donc depuis la console :
      cd ~/Datos/firmwareESP8266 (passage au dossier contenant l'outil et le firmware)
      ./esptool.py --baud 115200 --port /dev/ttyUSB0 write_flash \
      0x00000 ./boot_v1.1.bin \
      0x01000 ./user1.bin \
      0x7C000 ./esp_init_data_default.bin \
      0x7E000 ./blank.bin

      --baud définit la vitesse du ESP8266 (115200 XNUMX bauds dans mon cas) et --port le port série auquel il se connecte (dans mon cas, émulé, le premier USB). Les différents documents qui composent le firmware suivent write_flash précédé de l'adresse, avec le document user1.bin contenant la charge utile de la mise à jour.

      wifi ESP8266 mise à jour du firmware capture de la console esptool

    Envoyer des commandes au module wifi ESP8266

    Pour contrôler la ESP8266 depuis un ordinateur, nous devrons commencer par configurer l'application pour lequel il suffira de ① choisir le port sur lequel le convertisseur est connecté USB UART TTL, quelque chose comme /dev/USB0 sous GNU/Linux et similaire ou quelque chose comme COM6 sous Windows, ② choisissez la vitesse à laquelle le ESP8266, probablement 115200 8 bauds, ③ définit XNUMX bits de données plus un bit d'arrêt, sans parité ni prise de contact, et ④ définit la fin de la ligne, en fonction du firmware, presque toujours CR+LF.

    Configurez CuteCom pour surveiller le module wifi ESP8266 à l'aide d'un convertisseur USB UART TTL

    Configurez PuTTY pour surveiller le module wifi ESP8266 avec un convertisseur USB UART TTL

    Une fois l'application configurée (ou, le cas échéant, stockée et sélectionnée), elle est ouvrir la connexion ("ouvrir l'appareil" et "ouvrir", respectivement, dans les captures d'écran des exemples ci-dessus avec MignonCom y PuTTY) et vous pouvez commencer à envoyer des commandes à ESP8266.

    Comme on peut le voir dans le Tableau des commandes AT ESP8266, le format pour activer, désactiver, définir une valeur et s'y référer est assez prévisible, mais en général il n'est pas facile de tous les retenir et vous aurez probablement besoin de l'avoir sous la main pour vous y référer.

    Comment étancher leurs soif ? ENVOYER Commandes AT al Module Wi-Fi ESP8266 dès Arduino C'est très simple : ① configurer les communications avec Serial.begin(115200); (ou Serial1, Serial2… sur les cartes avec plusieurs ports série matériels) et ② envoyez les commandes en utilisant le format Serial.print(orden+"\r\n");

    L'exemple ci-dessus montre comment envoyer le Module wifi ESP8266 aux commandes dès Arduino. Dans ce cas, il est illustré AT+CWJAP, qui est utilisé pour se connecter à un point d’accès. Cette commande utilise comme arguments l'identifiant du point d'accès (SSID) et la clé, toutes deux entre guillemets, pour qu'elles deviennent un objet Srtring et entouré de guillemets en utilisant le code d'échappement (\"). Pour finaliser la commande, utilisez \r\n ce qui correspond à CR y LF.

    Rappelons que le port série n'est pas toujours identifié avec Serial (sur certaines assiettes cela peut être Serial1, Serial2…) l'objet port utilisé a été défini en l'attribuant à la macro PUERTO_SERIE. La détection du type de carte utilisée pourrait ajouter un peu d'intelligence à la sélection du port série ; Nous verrons plus tard comment déterminer le type de Arduino. Le reste des définitions sont les définitions habituelles qui permettent de "nommer" les valeurs constantes pour éviter de les répéter (et de faire des erreurs) et faciliter leur modification.

    L'exemple ci-dessus est censé connecter le Module Wi-Fi ESP8266 au point d'accès indiqué mais était-il déjà connecté auparavant ? La connexion a-t-elle fonctionné ? Pour le savoir, nous devons « écouter » ce que disent les ESP8266

    Recevez des données du module wifi ESP8266

    En connectant le renifleur de données expliqué ci-dessus à l'ordinateur, vous pouvez voir ce qui Arduino a envoyé le ESP8266 et sa réponse. A lire depuis Arduino et traiter les informations qu'il contient, il faudra détecter avec Serial.available() si des données sont arrivées et si c'est le cas, chargez-les avec Serial.read(). L'exemple suivant montre comment lire la réponse de AT+CWJAP?, qui signalera s'il existe une connexion à un point d'accès.

    Comme dans une assiette Arduino Uno (et dans d'autres) l'ouverture du moniteur série réinitialise le programme, il peut être utilisé pour voir dans la console série Arduino les informations que vous envoyez à ESP8266 comme le montre la capture d'écran de l'image ci-dessous.

    Recevez les données du module wifi ESP8266 d'Arduino. Exemple de base

    Analyser la réponse envoyée par le module wifi ESP8266

    Nous avons déjà vu comment lire les informations qui parviennent Arduino de l' ESP8266. Le problème auquel vous devez faire face est que vous ne savez pas quand cela commencera à arriver, combien de temps cela prendra pour arriver, quelle sera la durée... et il n'est pas très efficace d'attendre la réponse du ESP8266 est reçu sans laisser le microcontrôleur effectuer d'autres tâches entre-temps.

    Un moyen simple de gérer cette situation est itérer sur les données reçues à la recherche de réponses concrètes avec lequel, par exemple, activez des indicateurs (drapeaux ou variables booléennes) qui détermineront s'il faut continuer la recherche dans le texte reçu et quelles actions doivent être effectuées en fonction des informations provenant du ESP8266. Pendant que la réponse arrive microcontrôleur peut se consacrer à d’autres tâches, par exemple, recevoir des données de capteurs et les traiter.

    Rechercher un texte dans les informations reçues de l'ESP8266

    Pour rechercher le texte provenant du ESP8266 peut être comparez chaque lettre reçue avec celle qui correspond au message que vous recherchez. Il faudra utiliser un compteur (ou un pointeur) qui pointe vers la lettre à comparer ; Si le personnage qui arrive du ESP8266 est le même que celui examiné dans le message, le compteur avance, s'il est différent il s'initialise.

    Pour savoir que la fin est atteinte, on consulte le caractère suivant du message recherché, qui sera zéro (\0) soit on mémorise la longueur du message pour, en la comparant avec le compteur, savoir si la comparaison est terminée et donc la Module Wi-Fi ESP8266 a envoyé le message recherché.

    L'exemple suivant utilise la commande AT+CWLAP qui renverra une liste de points d'accès et parmi ceux-ci, celui appelé "wifi polaridad.es" est recherché. Bien que nous ayons choisi de vérifier que le dernier caractère est zéro, comme le tampon Il stocke uniquement le texte recherché et sa longueur est connue, il peut également être vérifié si un tel nombre de lettres correctes ont été reçues. Avec un DEL connecté à la broche 2, il est signalé que le texte attendu a été trouvé.

    Dans le code de l'exemple précédent, vous pouvez également voir un moyen de choisir le port série en fonction du type de carte Arduino utilisé. Cet exemple suppose que vous disposez de trois types de tableaux pour le projet : un Arduino Unoune Arduino Mega 2560 et un Arduino Leonardo. Si vous travaillez avec un Arduino Uno il sera utilisé Serial et sinon Serial1.

    Si vous travaillez avec une assiette Arduino Leonardo Vous pouvez utiliser la même méthode pour arrêter le programme et attendre que la console (le port série associé à Serial) est disponible.

    Rechercher divers textes dans la réponse ESP8266

    Le code de l'exemple précédent permet de rechercher du texte dans les informations envoyées par le ESP8266 mais la réponse peut inclure des informations différentes selon l'opération. Supposons, pour commencer par un cas simple dans l'exemple suivant, que le texte envoyé par le MCU ESP8266 es OK lorsque l'opération est effectuée correctement et ERROR Sinon, comme pour la commande AT+CWJAP?, qui sert à vérifier si le Module Wi-Fi ESP8266 est déjà connecté à un point d’accès.

    Cette nouvelle implémentation de la même méthode, qui recherche une correspondance avec plusieurs messages possibles, permet de choisir entre différentes actions en fonction de la réponse reçue du ESP8266, allumez simplement le DEL cela correspond.

    Limitez le temps nécessaire pour recevoir une réponse

    Jusqu'à présent, aucune référence n'a été faite à une question pertinente : la temps d'attente maximum (timeout) avant de considérer qu'une opération a échoué. Si, pour une raison quelconque, la connexion avec le Module Wi-Fi ESP8266, le module avec le point d'accès, le point d'accès avec Internet ou, par exemple, un hypothétique serveur n'est pas disponible, le programme peut être bloqué à un moment donné en attendant indéfiniment, il faudra donc articuler une réponse à de telles circonstances. Le temps d'attente maximum peut être configuré pour l'ensemble de l'application, il sera généralement plus "généreux" dans ce cas, ou des temps d'attente individuels peuvent être programmés pour chaque opération.

    Pour vérifier qu'au moins un certain intervalle de temps s'est écoulé L'« heure » du moment où le compte est ouvert est généralement soustraite de l'« heure » actuelle et on vérifie que la différence est supérieure à la limite souhaitée.. Ce "temps" ne doit pas nécessairement être le temps réel, il correspond généralement à l'intervalle qui s'est écoulé depuis le MCU commencez à compter le temps ; Cela n'affecte pas le programme puisque ce qui est intéressant c'est le temps écoulé et non le temps absolu.

    Habituellement, pour vérifier si un certain intervalle s'est écoulé, une expression du type est utilisée :

    Laissez variable milisegundos_al_empezar contient la valeur de millis() d'un certain moment dans l'exécution à partir duquel il est chronométré, il n'est donc pas inhabituel que son nom fasse référence au mot « chronomètre ». La variable intervalo_de_tiempo contient le nombre maximum de millisecondes qui rendent l'expression précédente vraie, c'est-à-dire qu'elle représente le délai d'attente ; Il s'agit généralement d'une constante (ou d'une macro) et, comme dans le cas précédent, le mot "TIMEOUT" apparaît souvent dans son nom. Si vous travaillez avec des intervalles très courts, vous pouvez utiliser micros() au lieu de millis() (microsecondes au lieu de millisecondes) bien que ce soit beaucoup moins courant et beaucoup moins précis.

    Un entier long dans Arduino (unsigned long) occupe 4 octets (32 bits), donc la plus grande valeur qu'il peut représenter est 4294967295 (2 à la puissance 32 moins un, car il commence à zéro). sur une assiette Arduino Lorsqu'il fonctionne en continu, le compteur de millisecondes se réinitialise (revient à zéro) environ tous les 50 jours. Lors de la soustraction avec des types de données non signés, le même comportement est reproduit (retournement du compteur), il est donc viable de contrôler le délai d'attente indéfiniment.

    Le code ci-dessus montre un implémentation très basique de la limitation du délai d'attente incorporant les lignes marquées par rapport à l'exemple qui le précède. Étant donné que la vérification du délai d'attente est effectuée après le traitement des données provenant du Module Wi-Fi ESP8266, l'opération peut être considérée comme réussie même si la réception prend plus de temps que le temps d'attente imposé.

    Exécuter une opération complexe définie par plusieurs commandes AT

    Pour avoir un exemple de référence du but de l'application qui exploite le Module Wi-Fi ESP8266, supposons que ce soit stocker des informations dans une base de données accessible via un service Web pour suivre la température. Le code suivant lit un capteur connecté à une entrée analogique à intervalles de temps déterminés, calcule la valeur moyenne et, après un intervalle de temps plus long, l'envoie au serveur Web (style IdO) à travers un demander HTTP (POSTER, OBTENIR…).

    Dans cet exemple d'enregistrement de la température, un serveur Web est consulté toutes les cinq minutes. Bien que la disponibilité ne soit pas particulièrement élevée, on peut s'attendre à ce que la proposition fonctionne, mais si une fréquence d'enregistrement plus élevée était nécessaire, d'autres ressources devraient être mises en œuvre, par exemple un tampon de données en attente d'être envoyé, pour en envoyer plusieurs lorsque le serveur peut y assister et les stocker lorsqu'il n'est pas disponible. Si la fréquence à laquelle les données doivent être enregistrées était encore plus grande, d'autres types de protocoles devraient être proposés comme alternative au HTTP ou même remplacer TCP par UDP pouvoir envoyer la plupart des données à la vitesse requise, même au prix d'en perdre certaines.

    Les opérations qui composent la tâche à effectuer pour envoyer la température seraient :

    • Réinitialiser le module wifi
    • Se déconnecter du point d'accès actuel (dans le cas où une connexion par défaut existe)
    • Définissez les paramètres. Pour l'exemple, on suppose que le mode de connexion (simple) et le rôle dans les communications Wi-Fi (station) doivent être configurés.
    • Se connecter au point d'accès
    • Vérifiez que la connexion est correcte (en fait, c'est le point d'entrée) S'il n'y a pas de connexion, recommencez le processus depuis le début
    • Connecter au serveur
    • Envoyer la demande HTTP avec les données à stocker

    L'ordre des opérations ne doit pas nécessairement être exactement comme celui-ci (bien que l'opération le soit) et chaque étape peut nécessiter plusieurs étapes. Commandes AT ESP8266Par exemple, la configuration répertoriée ci-dessus en nécessiterait deux : AT+CIPMUX=0 y AT+CWMODE=1.

    Une structure de données pour représenter les opérations sur l'ESP8266

    Dans les exemples précédents, bien que de manière très basique, une solution générique au problème est déjà suggérée : utiliser une structure de données qui stocke les réponses possibles et les actions qui doivent être prises dans chaque cas; envoyez une action, attendez une réponse et procédez en fonction de ce que signifie la réponse. Puisque chaque opération complexe nécessitera plusieurs Commandes AT ESP8266, la structure de données doit relier une opération avec d'autres, ultérieures ou précédentes, qui doivent être effectuées dans chaque cas en fonction de la réponse du ESP8266.

    Dans les exemples précédents, un message a été recherché dans la réponse du ESP8266 et cela a été interprété comme un succès ou une erreur. Outre une réception (et analyse) de l'ensemble des textes reçus, Pour avoir un minimum générique, il convient de veiller également à la finalisation du message ou, en d'autres termes, à la disponibilité du Module Wi-Fi ESP8266 pour recevoir de nouvelles commandes. De cette façon, le passage à un état que nous pourrions appeler, par exemple, « wifi disponible », pourrait consister à recevoir le nom du point d'accès et à recevoir le texte ERROR ou le texte OK signifierait que le ESP8266 vous avez terminé la réponse et vous pouvez maintenant envoyer la suivante Commande AT vers ESP8266.

    Le code ci-dessus utilise un vecteur (operacion) pour stocker le texte des opérations successives qui constituent la tâche complète. Un tableau à deux dimensions est utilisé (mensaje) avec les trois réponses analysées. Comme expliqué ci-dessus, il faut rechercher les messages qui représentent la fin de la réponse en plus du message qui représente une réponse correcte ou incorrecte. Toutes les opérations n’auront pas le même nombre de réponses possibles ; Lorsqu'il y a moins de réponses, on peut utiliser un message vide qui consomme le moins de cycles possible dans son analyse (même si ce n'est pas la manière la plus optimale). Logiquement, il faudra que le nombre minimum de réponses recherchées (trois dans l'exemple) englobe toutes les possibilités de fonctionnement, même si elles ne sont pas toutes possibles.

    En parlant des réponses possibles, on peut déjà voir que cet exemple n'est pas très utile pour recevoir des données dans un format arbitraire depuis un Module Wi-Fi ESP8266, mais le problème est que, dans le cadre d'une utilisation avec microcontrôleurs ce n'est pas habituel ; Le plus courant est d'envoyer les données collectées par les capteurs qu'ils ont connectés et/ou de recevoir des informations sur ce qu'il faut faire avec les actionneurs qu'ils contrôlent. Des informations très précieuses, qui peuvent très bien être prédites.

    Dans la structure de données précédente, tout comme pour exprimer les réponses possibles analysées, une matrice bidimensionnelle est également utilisée pour déterminer l'opération qui doit être effectuée dans chaque cas (siguiente_operacion). Concrètement, nous avons choisi de répondre à trois types de messages : ① un texte arbitraire (LITERAL) pour vérifier s'il existe une connexion au point d'accès Wi-Fi et au serveur, ② un texte pour détecter les erreurs dans le processus (FALLO) et ③ un texte indiquant que l'opération s'est déroulée avec succès (ACIERTO).

    Enfin, il existe deux autres vecteurs pour définir le temps d'attente maximum avant d'abandonner (timeout) et précisez (configuracion) si l'opération se termine sans attendre de réponse (ESPERAR_RESPUESTA) et des messages indiquant la fin de la communication. Ce dernier vecteur, pour illustrer un exemple d'économie de mémoire, fonctionne avec les bits d'un octet de configuration pour indiquer les différents états.

    Les premières Commandes AT ESP8266 de la structure de données attendent toujours une réponse, qui peut être un message de réussite ou d'erreur. Lorsqu'une erreur se produit, le module est redémarré et il redémarre et si le message indique que l'opération est correcte, il passe au suivant.

    Une fois connecté au serveur, le modèle change. Dans ce cas il faut ① envoyer la longueur du paquet de données à transmettre et ② composer la requête HTTP avec un texte fixe plus la valeur (de la température) qui est envoyée pour être stockée sur le serveur. La préparation de ces données est effectuée à chaque envoi et il faut la diviser en deux (indiquer la longueur) ou trois (envoyer la demande HTTP) Pour Commande ESP8266 AT. Seule la dernière des parties qui composent l’opération attendra une réponse.

    Dans ce cas, cela fonctionnera sans problème (peut-être en avertissant que le module est occupé) mais lorsque la longueur des données est plus grande, il sera nécessaire de diviser les blocs de données en morceaux plus petits et il peut même être nécessaire d'implémenter une attente, car se fait avec la lecture de la température, pour donner au module le temps d'envoyer les données sans remplir son tampon.

    Avec d'autres macros déjà expliquées précédemment, l'exemple de code ci-dessus montre comment sont définis les différents états avec lesquels spécifier s'il faut attendre une réponse et, le cas échéant, quel message indique que l'opération est terminée.

    Comme à différents points du code une opération sera envoyée (quand il sera temps d'envoyer la température moyenne, si le temps d'attente d'une opération est dépassé, quand l'opération en cours est terminée avec succès...) mais comment faire est établi à l'échelle mondiale, il a été défini comme un macro ENVIAR_OPERACION qui regroupe les étapes impliquées dans l’expédition.

    Ce qui suit est le code du programme principal de l'exemple. La tâche la plus externe est celle chargée d'échantillonner la température pour calculer la moyenne et, à intervalles réguliers, elle est envoyée au serveur à l'aide du Module Wi-Fi ESP8266. Une fois chaque opération envoyée, la réponse est analysée pour déterminer laquelle est la suivante ou si la tâche d'envoi d'informations est terminée.

    Logiquement, plusieurs actions d'optimisation peuvent être réalisées sur le code précédent mais, comme il s'agit d'un exemple pour comprendre comment le ESP8266 De manière générique, il convient de se concentrer uniquement sur certains aspects, le premier étant la structure des données. Il semble que la chose logique est utiliser une structure de données de langage de programmation (struct) pour représenter les informations en cours de traitement: le Commandes AT ESP8266 et les messages analysés.

    Utiliser une structure (struct) pour stocker les données au lieu des exemples de tableaux (basés sur ceux-ci) est trivial et, bien que cela puisse donner lieu à un code plus élégant, cela n'implique aucune amélioration du résultat. La véritable alternative posée par l’utilisation de struct est de mettre en œuvre, comme expliqué ci-dessous, longueurs variables dans les structures qui contiennent des données « internes » auxquels ils font référence. De cette manière, par exemple, il ne serait pas nécessaire qu’une opération ait un nombre fixe de réponses à analyser.

    Cette approche suggère que c'est la meilleure façon de mettre en œuvre la solution mais l'inconvénient est qu'il faudrait utiliser l'allocation dynamique de mémoire, une pratique risquée en travaillant avec un microcontrôleur ce qui nécessite une mesure minutieuse de la quantité de mémoire qui sera utilisée au moment de l'exécution, puisque le compilateur pourra difficilement nous en avertir et qu'il existe une certaine possibilité d'épuiser la mémoire (ou la pile) avec des conséquences fatales pour l'exécution du programme.

    Dans le cadre de l'optimisation du code, il est intéressant de rappeler que, dans un programme de ce type, qui utilise une grande quantité de texte, peut économiser de l'espace mémoire SRAM stocker des chaînes de texte dans la mémoire du programme (flash) avec la macro F(). Dans les captures d'écran suivantes, vous pouvez voir les différents programmes et la distribution dynamique de la mémoire avec une utilisation normale du texte et l'utilisation de la macro. F().

    Exemple de code Arduino utilisant du texte stocké dans la mémoire du programme (flash)
    Exemple de code Arduino utilisant du texte dans SRAM

    En ce qui concerne les actions exécutées en fonction des informations provenant du Module Wi-Fi ESP8266, au lieu de vérifier le message à partir du code et d'exécuter l'un ou l'autre en fonction de ce qui est reçu, peut être stocké dans cette structure de données des pointeurs vers les fonctions qui exécutent chaque tâche au lieu d'indicateurs d'état (drapeaux) qui avertissent d'un certain état que l'application est chargée de gérer, par exemple, au sein de la boucle principale.

    Ce qui suit est un exemple de structures pour stocker les données des requêtes adressées au ESP8266 (le type de données operacion_esp8266) et leurs réponses (le type de données respuesta_esp8266).

    En tant que structure qui représente l'opération (les données envoyées au Module Wi-Fi ESP8266) fait référence à la structure avec laquelle les réponses sont définies, et la structure des réponses à la structure des opérations, il faut d'abord déclarer les deux, en définissant le nouveau type de données, puis en définissant son contenu.

    L'exemple précédent considère que le programme qui l'inclut a choisi d'utiliser un indicateur de statut, qui doit correspondre à une variable accessible depuis le code chargé d'effectuer l'une ou l'autre opération comme indiqué par ladite valeur. Si dans la réponse de ESP8266 Lorsqu'un certain texte est analysé, l'état prend la valeur qui indique la structure de la réponse correspondante.

    Comme dit précédemment, une autre alternative, soit pour remplacer ou compléter un indicateur d'état, serait stocker une fonction dans la structure de référence (un pointeur) qui serait appelé à rencontrer certains textes dans la réponse du Module Wi-Fi ESP8266.

    Dans l'exemple précédent, il a été ajouté à la structure de données utilisée pour traiter la réponse du Module Wi-Fi ESP8266 un pointeur vers une fonction (supposée) qui renvoie une donnée de type float (pourrait être la valeur pondérée d'une lecture analogique) et à laquelle deux octets sont fournis comme arguments (deux unsigned char qui pourrait être la broche à partir de laquelle l'entrée analogique est lue et celle qui active l'ENABLE d'un hypothétique intégré).

    En développement pour MCU, contrairement à ce qui se produit dans le style de développement des grands systèmes, il n'est pas si rare d'utiliser des variables globales lors de la définition du comportement (global) de l'application qui contrôle un assembly, il ne sera donc pas particulièrement rare de trouver ce type de définitions comme des fonctions sans paramètres et qui ne renvoient pas de valeurs, quelque chose comme void (*accion)();

    Si vous travaillez avec cette façon de représenter les données, en utilisant struct de données de longueur variable, il sera nécessaire d'allouer dynamiquement de la mémoire avec malloc() (o new(), si des objets sont utilisés), qui utilisera la quantité de mémoire allouée comme paramètre et renverra un pointeur vers le début de la zone mémoire réservée. Avec sizeof() Sur le type stocké, multiplié par le nombre d'éléments utilisés, vous pouvez obtenir la quantité de mémoire nécessaire. Un exemple avec et sans utilisation peut être vu dans les captures d'écran ci-dessous. malloc(); Attention à la mémoire utilisée par le programme dans le premier cas, vous devez charger la bibliothèque qui contient cette fonction.

    Exemple d'allocation de mémoire avec malloc sur Arduino

    Exemple d'affectation de texte sans malloc dans Arduino

    Si les opérations sur le Module Wi-Fi ESP8266 variera tout au long de l'exécution du programme, il faudra libérer la mémoire qui n'est pas utilisée avec free() (o delete(), dans le cas d'être des objets). Bien qu'il soit raisonnable de s'attendre à ce que le compilateur (GCC) optimisera le programme pour éviter le partitionnement de la mémoire, les performances ne seront sûrement pas aussi optimales que de travailler avec de la mémoire allouée statiquement.

    Bien que dans cet exemple (dans les deux implémentations) cela n'ait pas beaucoup de sens, afin de généraliser l'opération pour pouvoir l'appliquer à d'autres cas, il convient de noter que L'envoi de données répète toujours le même protocole : notifiez le nombre d'octets qui seront envoyés, attendez l'indicateur (>) et envoyez les données.

    Comme dans cet exemple il n'est utilisé qu'une seule fois (la requête entière est faite dans un seul paquet), cela ne semble pas très utile mais, en général, il peut être nécessaire d'effectuer plusieurs envois dans la même opération, y compris les cas où ils doivent être transmis des quantités importantes de données qui doivent être fragmentées pour éviter de déborder la mémoire du ESP8266.

    Pour mettre en œuvre ce comportement, les deux derniers éléments de la connexion peuvent être utilisés pour qu'à chaque envoi de données, les données soient remplies avec les valeurs correspondantes : dans le premier cas, le nombre d'octets envoyés et dans le second, le ( partie de la demande à transmettre.

    Pour répéter l'affectation et l'envoi des différents éléments qui doivent être transmis peuvent être stockés dans un vecteur. Ce nouveau vecteur sera celui qui déterminera la fin de l'opération complexe et non la dernière opération comme jusqu'à présent.

    1 commentaire

    commentaires utilisateur
    dubxls̄d

    Il y a certainement beaucoup à découvrir sur ce sujet. J'aime tous les points que vous avez soulevés

    Poster un commentaire

    Vous avez peut-être manqué