Grundlegende Operationen auf einem ESP8266-WLAN-Modul von Arduino

Grundlegende Operationen auf einem ESP8266-WLAN-Modul von Arduino

Grundlegende Operationen auf einem ESP8266-WLAN-Modul von Arduino

wenn Espressiv brachte die ersten Module auf den Markt Wi-Fi mit der integrierten ESP8266 und Firmware Um es mit AT-Befehlen handhaben zu können, waren wir Benutzer daran interessiert, es in Baugruppen zu integrieren Mikrocontroller und die Probleme reduzierten sich darauf, das (ehemals) Dunkle zu kennen ESP8266 AT-Befehlstabelle, Futterbedarf bzw ESP8266-Firmware-Update.

Inhaltsverzeichnis

    Dann kamen schnell Alternativen, um das zu programmieren ESP8266 und Modulimplementierungen Wi-Fi sehr unterschiedlicher Formate, die andere Bedenken aufkommen ließen: welches ESP8266-WLAN-Modul Sie wählen sollen abhängig von der Reichweite der verschiedenen Antennen (auch externe) oder der physischen Integration dieser neuen Module in unsere Baugruppen.

    Aufgrund all dieser Veränderungen wurde der Schwerpunkt sicherlich nicht auf die grundlegendsten Aspekte, die grundlegendste Verwaltung des Unternehmens gelegt ESP8266 WLAN-Modul. Obwohl polarität.es Informationen zur Nutzung finden Sie hier ESP8266 und es gibt einige Anwendungen, die die Funktionsweise des erklären sollen ESP8266 WLAN-Modul Verwendung von AT-Befehlen, insbesondere im Artikel über Bibliothek zum Durchführen von HTTP-Anfragen von Arduino mit dem ESP8266-WLAN-ModulDie Eindrücke der Leser deuten darauf hin, dass es nützlich wäre, einige weitere grundlegende Informationen hinzuzufügen, um den Benutzern zu helfen ESP8266 eigene Implementierungen durchzuführen.

    Besprechen Sie die grundlegenden Vorgänge für die Arbeit mit dem ESP8266 und das Vorschlagen allgemeiner Lösungen ist ein Ziel, das aus mehreren sehr unterschiedlichen Teilen besteht; Um den Inhalt des Artikels nachvollziehen zu können, kann der folgende Index als Orientierung dienen:

    Steuern Sie das WLAN-Modul ESP8266 vom Computer aus über die serielle Schnittstelle

    Von einem Teller Arduino und mit Ihrem IDE Es ist möglich, den Betrieb eines zu überwachen ESP8266 WLAN-Modul, Sende das ESP8266 AT-Befehle und sehen Sie sich die Antwort an, aber es ist viel bequemer, dies von einem Computer mit einer Terminalanwendung aus zu tun.

    Verwendung von CuteCom zum Testen des ESP8266-WLAN-Moduls über die serielle Schnittstelle

    Je nachdem welches Board Arduino Bei Verwendung ist möglicherweise nur ein serieller Hardware-Port verfügbar, was das Senden und Empfangen etwas umständlicher macht. Das Ändern der Kommunikationsgeschwindigkeit ist in einer seriellen Kommunikationsanwendung von einem Computer und einigen Motherboards aus viel komfortabler. Arduino (und unter bestimmten Umständen) unterstützen die höheren Geschwindigkeiten der seriellen Kommunikation nicht gut, insbesondere 115200 Baud, was die Standardgeschwindigkeit der neuesten Versionen von ist Firmware.

    Über Welches Programm soll zur Überwachung verwendet werden? ESP8266 über die serielle Schnittstelle, es gibt viele zur Auswahl, je nach Bedarf und Vorlieben; In letzter Zeit verwende ich mehr den Klassiker CuteCom (das im Screenshot oben), weil es für mich sehr bequem ist, bestimmte Dinge zu wiederholen ESP8266 WLAN-Modul bei Bestellungen bei Projekttests.

    Zu Programmen, die als serielle Konsole fungieren, wurden hier bereits einige Empfehlungen gegeben; Zum Beispiel, wenn man darüber redet PuTTY zur Steuerung serieller UART-Geräte vom Computer aus. PuTTYEs ist nicht nur eine hervorragende Anwendung, sondern ist auch für die meisten Desktop-Betriebssysteme verfügbar. Darüber hinaus als PuTTY kann sowohl mit der seriellen Schnittstelle als auch als Konsole verwendet werden Internetprotokollfamilie (TCP/IP), einschließlich derjenigen, die darauf operieren TLSwird zu einem gängigen Tool, das die (geringe) Zeit, die für die Konfiguration und die Eingewöhnung in die Verwendung aufgewendet wurde, mehr als wettmacht.

    Verwenden Sie PuTTY, um das ESP8266-WLAN-Modul über die serielle Schnittstelle zu testen

    Zusätzlich zur seriellen Kommunikationssoftware um die ESP8266 WLAN-Modul zum Hafen USB Auch ein Computer benötigt einen Konverter USB zur Serie TTL. Wie bei der Software gibt es mehrere Versionen, von denen sie nur der Konvertierung des Ports dienen USB an einer seriellen Schnittstelle TTL (die ab einem Euro erhältlich sind) bis hin zu solchen, die verschiedene Protokolle emulieren können (z. B SPI o I2C).

    Genau wie ein Programm, das als serielle Konsole fungiert, die Hardware, über die der Computer kommuniziert USB mit einer Logikschaltung (nicht nur der ESP8266) ein gängiges Werkzeug bei der Arbeit eines mikrogesteuerten Anwendungsentwicklers sein wird, lohnt es sich, es so schnell wie möglich in der Toolbox zu haben und damit zu arbeiten ESP8266 WLAN-Modul Es ist eine ausgezeichnete Gelegenheit, einen zu bekommen.

    Hardware für die serielle USB-UART-Kommunikation zur Überwachung des ESP8266-WLAN-Moduls

    Der Konverter USB a UART TTL Es kann auch verwendet werden, um das Verhalten einer Schaltung zu überwachen, die das verwendet ESP8266Dazu werden die Ausgänge, die Sie überwachen möchten, mit einer schnellen Diode (die.) in Reihe mit dem Dateneingang (RX) des Konverters verbunden 1N4148, z. B.) und einem Widerstand (z. B. 2K2) parallel zueinander geschaltet. Ein solches Setup funktioniert wie ein serieller Hardware-Sniffer.

    Sniffer-Beispiel für ESP8266, verbunden mit Arduino über einen USB-UART-TTL-Konverter

    Obwohl der Sniffer im Bild oben sicherlich rudimentär ist (unter anderem nicht). puffern) reicht aus, um den Betrieb einer Baugruppe zu überwachen Arduino und ESP8266.

    Entfernen des Sniffers aus dem vorherigen Schema, dem Schematische Darstellung des Anschlusses von a ESP8266 WLAN-Modul auf einen Teller Arduino. Zusätzlich zur Speisung mit 3V3 müssen der Reset-Pin und der Aktivierungspin des Integrierten mit einem High-Pegel (Enable) verbunden werden. Natürlich muss der RX-Pin des einen mit dem TX-Pin des anderen verbunden sein.

    Um das vorherige Diagramm zu vereinfachen, wurde eine Platte dargestellt Arduino mit 3V3 betrieben wird und für die eine Spannung am seriellen Port ebenfalls mit 3V3 angenommen wird. Wenn Sie a verwenden Mikrocontroller mit einem anderen Signalpegel am seriellen Port (typischerweise 5 V) erforderlich sein, um das Gerät nicht zu beschädigen ESP8266, benutze einen Pegelwandler wie die in den Diagrammen unten. Diese Schaltung ist häufig in vielen kommerziellen Standardmodulimplementierungen zu finden.

    5V zu 3V3 Signalpegelwandler für ESP8266 WiFi-Modul und Arduino

    Aktualisieren Sie die ESP8266-Firmware

    Die ESP8266 AT-Befehle, seine Terminierung, die Standardgeschwindigkeit des Moduls... hängen von der Version des ab ESP8266-Firmware. Stellen Sie am besten sicher, dass Sie in allen Modulen die gleiche Version haben und es sich nach Möglichkeit um die aktuellste Version handelt.

    Leider sind die meisten ESP8266-WLAN-Modulmodelle Sie verfügen nur über 4 Mbit, daher kann die neueste Version nicht darauf installiert werden. Die neueste (offizielle) Firmware-Version, auf der installiert werden kann ESP8266 WLAN-Module mit 4 Mbit (meistens) ist 0.9.4, einschließlich Version 0.2 des ESP8266 AT-Befehle.

    Zusammenfassend benötigen Sie zum Aktualisieren der Firmware Folgendes:

    1. Laden Sie die entsprechende Firmware-Version herunterzu verbessern. neueste (offizielle) Version für ein Modul mit 4 Mbit Speicher, gefunden im Espressif-Ordner auf Github. Im Espressif-Website Sie können die neueste Version der Firmware herunterladen, es ist jedoch sehr wichtig zu überprüfen, ob das Modul, auf dem sie installiert ist, über genügend Speicher verfügt.

    2. Laden Sie die neueste Version des Firmware-Installationstools herunter. Mein Liebling ist Espenwerkzeug was geschrieben steht Python, sodass es auf jeder Plattform funktioniert. Es kann nicht nur heruntergeladen, sondern auch mit installiert werden pip install esptool (o pip2 o python -m pip…). Natürlich, Espressiv Es bietet auch ein eigenes Tool an, ist jedoch derzeit nur für Windows verfügbar.

    3. Bereiten Sie heruntergeladene Dateien vor; Entpacken Sie diese in einen zugänglichen Ordner und machen Sie das Tool ggf. ausführbar Espenwerkzeug, in meinem Fall, seit GNU / Linuxmit chmod +x esptool

    4. Verbinden Sie das Modul über einen Konverter mit dem Computer USB UART TTL das funktioniert bei 3V3 oder verwenden Sie einen Pegelwandler, wenn dieser mit 5 V arbeitet. Zusätzlich zur Stromversorgung müssen Sie TX mit RX des Konverters verbinden USB UART TTL, RX zu TX, GPIO0 auf niedrigem Pegel (GND) und möglicherweise GPIO2 auf hohem Pegel (in meinen Tests hat es sowohl beim Verbinden auf niedrigem Pegel als auch beim Trennen funktioniert). Wenn das Modul über einen freien GPIO15-Anschluss verfügt (wie es beim ESP-12 der Fall ist), muss dieser mit einem Low-Pegel verbunden werden. RESET, das im Betrieb normalerweise auf einem hohen Pegel liegt, kann unbeschaltet bleiben oder über einen Widerstand (z. B. 10K) auf einen hohen Pegel gelegt werden, da vor Beginn der Aufzeichnung möglicherweise ein Reset des Geräts durch Anschließen erforderlich ist auf ein niedriges Niveau.
      Wenn Sie das Modul einschalten, kann es aktualisiert werden. Wenn ein Verbindungsfehler angezeigt wird, muss dieser zurückgesetzt werden Schließen Sie RESET für einen Moment auf einem niedrigen Pegel an und lassen Sie es dann für den Aktualisierungsvorgang auf Sendung (ohne Verbindung).
      Das Modul hat Verbrauchsspitzen von einem halben Ampere (nach Angaben einiger Benutzer bis zu 600 mA), daher ist es wichtig, ein Netzteil zu verwenden, das diesen Verbrauch unterstützen kann, insbesondere für die Aktualisierung der Firmware.

      Verbindung WLAN-Modul ESP8266 ESP-01 zu USB UART TTL-Konverter-Update-Firmware

    5. Führen Sie das Tool aus, um die Firmware zu aktualisieren. In meinem Fall habe ich die Tool- und Firmware-Dokumente in Schritt 3 im selben Ordner gespeichert, also führe ich von der Konsole aus Folgendes aus:
      cd ~/Datos/firmwareESP8266 (wechseln Sie in den Ordner, der das Tool und die Firmware enthält)
      ./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 stellt die Geschwindigkeit des ein ESP8266 (115200 Baud in meinem Fall) und --port der serielle Port, an den es angeschlossen ist (in meinem Fall emuliert, der erste USB). Die verschiedenen Dokumente, aus denen die Firmware besteht, liegen dahinter write_flash mit vorangestellter Adresse, wobei das Dokument user1.bin die Update-Payload enthält.

      WLAN-ESP8266-Firmware-Update, Esptool-Konsolenerfassung

    Senden Sie Befehle an das WLAN-Modul ESP8266

    Zur Kontrolle der ESP8266 Von einem Computer aus müssen wir beginnen Konfigurieren Sie die App Dazu reicht es aus, ① den Port auszuwählen, an den der Konverter angeschlossen ist USB UART TTL, etwas wie /dev/USB0 in GNU/Linux und ähnlichem oder so ähnlich COM6 Wählen Sie in Windows ② die Geschwindigkeit aus, mit der die ESP8266, wahrscheinlich 115200 Baud, ③ 8 Datenbits plus ein Stoppbit setzen, ohne Parität oder Handshake, und ④ Zeilenende einstellen, je nach Firmware, fast immer CR+LF.

    Konfigurieren Sie CuteCom für die Überwachung des ESP8266-WLAN-Moduls mithilfe eines USB-UART-TTL-Konverters

    Konfigurieren Sie PuTTY für die Überwachung des ESP8266-WLAN-Moduls mit einem USB-UART-TTL-Konverter

    Sobald die Anwendung konfiguriert (oder gegebenenfalls gespeichert und ausgewählt) ist, ist sie es Öffnen Sie die Verbindung („open device“ bzw. „open“ in den Screenshots der obigen Beispiele mit CuteCom y PuTTY) und Sie können damit beginnen, Bestellungen an zu senden ESP8266.

    Wie in der zu sehen ist ESP8266 AT-Befehlstabelle, das Format zum Aktivieren, Deaktivieren, Festlegen eines Werts und Verweisen darauf ist ziemlich vorhersehbar, aber im Allgemeinen ist es nicht einfach, sich alle zu merken, und Sie müssen es wahrscheinlich zur Hand haben, um darauf zu verweisen.

    Der Weg von SENDEN Bei Bestellungen al ESP8266 WLAN-Modul von Arduino ist ganz einfach: ① Kommunikation mit konfigurieren Serial.begin(115200); (oder Serial1, Serial2… auf Platinen mit mehreren seriellen Hardware-Ports) und ② Senden Sie die Befehle im Format Serial.print(orden+"\r\n");

    Das obige Beispiel zeigt, wie das gesendet wird ESP8266 WLAN-Modul bei Bestellungen von Arduino. In diesem Fall ist es illustriert AT+CWJAP, mit dem eine Verbindung zu einem Zugangspunkt hergestellt wird. Dieser Befehl verwendet als Argumente die Zugangspunktkennung (SSID) und der Schlüssel, beide in Anführungszeichen, sodass sie zu einem Objekt werden Srtring und in Anführungszeichen mit dem Escape-Code (\"). Um die Bestellung abzuschließen, verwenden Sie \r\n was entspricht CR y LF.

    Denken Sie daran, dass die serielle Schnittstelle nicht immer mit identifiziert wird Serial (Auf bestimmten Tellern kann es sein Serial1, Serial2…) Das verwendete Portobjekt wurde durch Zuweisung zum Makro definiert PUERTO_SERIE. Das Erkennen des verwendeten Kartentyps könnte die Auswahl der seriellen Schnittstelle etwas intelligenter machen; Später gehen wir darauf ein, wie Sie die Art herausfinden können Arduino. Bei den übrigen Definitionen handelt es sich um die üblichen, die es Ihnen ermöglichen, die konstanten Werte zu „benennen“, um Wiederholungen (und Fehler) zu vermeiden und es einfacher zu machen, sie zu ändern.

    Das obige Beispiel soll die Verbindung herstellen ESP8266 WLAN-Modul zum angegebenen Zugangspunkt, war dieser aber schon vorher verbunden? Hat die Verbindung funktioniert? Um das zu wissen, müssen wir „zuhören“. ESP8266

    Empfangen Sie Daten vom WLAN-Modul ESP8266

    Indem Sie den oben erläuterten Datenschnüffler an den Computer anschließen, können Sie sehen, was Arduino hat die gesendet ESP8266 und seine Antwort. Zum Vorlesen Arduino und verarbeiten Sie die darin enthaltenen Informationen, die zur Erkennung erforderlich sind Serial.available() ob Daten angekommen sind und wenn ja, laden Sie diese mit Serial.read(). Das folgende Beispiel zeigt, wie die Antwort gelesen wird AT+CWJAP?, das meldet, ob eine Verbindung zu einem Zugangspunkt besteht.

    Wie auf einem Teller Arduino Uno (und in anderen Fällen) Durch Öffnen des seriellen Monitors wird das Programm zurückgesetzt. Es kann zur Anzeige in der seriellen Konsole verwendet werden Arduino die Informationen, an die Sie senden ESP8266 wie der Screenshot des Bildes unten zeigt.

    Empfangen Sie Daten vom WLAN-Modul ESP8266 von Arduino. Einfaches Beispiel

    Analysieren Sie die vom WLAN-Modul ESP8266 gesendete Antwort

    Wir haben bereits gesehen, wie man die Informationen liest, die ankommen Arduino aus dem ESP8266. Das Problem, mit dem Sie zu kämpfen haben, besteht darin, dass Sie nicht wissen, wann die Nachricht ankommt, wie lange es dauern wird, bis sie ankommt, wie lange sie dauern wird ... und es ist nicht sehr effizient, auf die Antwort von zu warten ESP8266 wird empfangen, ohne das zuzulassen Mikrocontroller in der Zwischenzeit andere Aufgaben erledigen.

    Eine einfache Möglichkeit, diesen Umstand zu bewältigen, ist Iterieren Sie die erhaltenen Daten und suchen Sie nach konkreten Antworten mit denen beispielsweise Indikatoren (Flags oder boolesche Variablen) aktiviert werden, die bestimmen, ob die Suche im empfangenen Text fortgesetzt werden soll und welche Aktionen basierend auf den vom empfangenen Text ausgeführt werden sollen ESP8266. Während die Antwort eintrifft Mikrocontroller kann sich anderen Aufgaben widmen, zum Beispiel Daten von Sensoren empfangen und verarbeiten.

    Suchen Sie in den vom ESP8266 empfangenen Informationen nach einem Text

    Um den Text zu durchsuchen, der aus dem stammt ESP8266 kann Vergleichen Sie jeden erhaltenen Brief mit dem Brief, der der gesuchten Nachricht entspricht. Es ist notwendig, einen Zähler (oder einen Zeiger) zu verwenden, der auf den zu vergleichenden Buchstaben zeigt; Wenn das Zeichen, das aus dem kommt ESP8266 derselbe ist wie der, der in der Nachricht untersucht wird, schreitet der Zähler voran, wenn er unterschiedlich ist, wird er initialisiert.

    Um zu wissen, dass das Ende erreicht wurde, wird das nächste Zeichen der gesuchten Nachricht herangezogen, das Null sein wird (\0) oder die Länge der Nachricht wird gespeichert, um durch Vergleich mit dem Zähler zu erfahren, ob der Vergleich abgeschlossen ist und daher die ESP8266 WLAN-Modul hat die gewünschte Nachricht gesendet.

    Im folgenden Beispiel wird der Befehl verwendet AT+CWLAP Dadurch wird eine Liste der Zugangspunkte zurückgegeben und darin wird nach einem mit dem Namen „wifi polaridad.es“ gesucht. Obwohl wir uns dafür entschieden haben, zu überprüfen, ob das letzte Zeichen Null ist, da das puffern Es speichert nur den gesuchten Text und seine Länge ist bekannt, es könnte auch überprüft werden, ob so viele richtige Buchstaben eingegangen sind. Mit einem LED Bei Anschluss an Pin 2 wird gemeldet, dass der erwartete Text gefunden wurde.

    Im Code des vorherigen Beispiels können Sie auch einen Weg dazu sehen Wählen Sie je nach Kartentyp den seriellen Anschluss Arduino gebraucht. In diesem Beispiel wird davon ausgegangen, dass Sie drei Arten von Platinen für das Projekt haben: eine Arduino Unoeinem Arduino Mega 2560 und Arduino Leonardo. Wenn Sie mit einem arbeiten Arduino Uno es wird genutzt Serial und ansonsten Serial1.

    Wenn Sie mit einer Platte arbeiten Arduino Leonardo Sie können die gleiche Methode verwenden, um das Programm zu stoppen und auf die Konsole (den damit verknüpften seriellen Port) zu warten Serial) ist verfügbar.

    Durchsuchen Sie verschiedene Texte in der ESP8266-Antwort

    Der Code im vorherigen Beispiel wird verwendet, um in den von gesendeten Informationen nach Text zu suchen ESP8266 Die Antwort kann jedoch je nach Vorgang unterschiedliche Informationen enthalten. Nehmen wir im nächsten Beispiel zunächst einen einfachen Fall an, bei dem der vom gesendete Text gesendet wird MCU ESP8266 es OK wenn die Operation korrekt durchgeführt wird und ERROR Ansonsten wie bei der Bestellung AT+CWJAP?, was dazu dient, zu überprüfen, ob die ESP8266 WLAN-Modul bereits mit einem Access Point verbunden ist.

    Diese neue Implementierung derselben Methode, die nach einer Übereinstimmung mit mehreren möglichen Nachrichten sucht, ermöglicht es Ihnen, je nach der von Ihnen erhaltenen Antwort zwischen verschiedenen Aktionen zu wählen ESP8266, schalten Sie einfach das ein LED das entspricht.

    Begrenzen Sie die Zeit, die bis zum Erhalt einer Antwort benötigt wird

    Bisher gab es keinen Hinweis auf ein relevantes Thema: die Maximale Wartezeit (Timeout), bevor ein Vorgang als fehlgeschlagen betrachtet wird. Wenn aus irgendeinem Grund die Verbindung mit dem ESP8266 WLAN-ModulWenn das Modul mit dem Zugangspunkt, der Zugangspunkt mit Internet oder beispielsweise ein hypothetischer Server nicht verfügbar ist, kann das Programm an einer Stelle blockiert sein und auf unbestimmte Zeit warten, sodass auf solche Umstände eine Reaktion erfolgen muss. Die maximale Wartezeit kann für die gesamte Anwendung konfiguriert werden, meist ist sie dann „großzügiger“ oder es können für jeden Vorgang individuelle Wartezeiten programmiert werden.

    Um zu überprüfen, ob (mindestens) ein bestimmtes Zeitintervall verstrichen ist Normalerweise wird die „Zeit“ des Zeitpunkts der Kontoeröffnung von der aktuellen „Zeit“ abgezogen und überprüft, ob die Differenz größer als das gewünschte Limit ist. Diese „Zeit“ muss keine Echtzeit sein, sie entspricht normalerweise dem Intervall, das seit dem vergangen ist MCU Beginnen Sie mit dem Zählen der Zeit; Dies hat keine Auswirkungen auf das Programm, da die verstrichene Zeit und nicht die absolute Zeit von Interesse ist.

    Um zu überprüfen, ob ein bestimmtes Intervall abgelaufen ist, wird normalerweise ein Ausdruck des Typs verwendet:

    Variabel milisegundos_al_empezar enthält den Wert von millis() eines bestimmten Zeitpunkts in der Ausführung, von dem aus die Zeit gemessen wird, daher ist es nicht ungewöhnlich, dass sich sein Name auf das Wort „Chronometer“ bezieht. Die Variable intervalo_de_tiempo enthält die maximale Anzahl von Millisekunden, die den vorherigen Ausdruck wahr macht, d. h. es stellt die Zeitüberschreitung dar; Es handelt sich normalerweise um eine Konstante (oder ein Makro) und wie im vorherigen Fall kommt häufig das Wort „TIMEOUT“ in seinem Namen vor. Wenn Sie mit sehr kurzen Intervallen arbeiten, können Sie verwenden micros() statt millis() (Mikrosekunden statt Millisekunden), obwohl es viel seltener und viel ungenauer ist.

    Eine lange Ganzzahl in Arduino (unsigned long) belegt 4 Bytes (32 Bits), daher ist der größte Wert, den es darstellen kann, 4294967295 (2 hoch 32 minus eins, weil es bei Null beginnt). auf einem Teller Arduino Bei Dauerbetrieb wird der Millisekundenzähler etwa alle 50 Tage zurückgesetzt (auf Null zurückgesetzt). Beim Subtrahieren mit vorzeichenlosen Datentypen wird das gleiche Verhalten reproduziert (Umdrehen des Zählers), sodass es sinnvoll ist, das Timeout auf unbestimmte Zeit zu steuern.

    Der obige Code zeigt a Sehr einfache Implementierung der Timeout-Begrenzung unter Einbeziehung der im vorangehenden Beispiel markierten Zeilen. Da die Timeout-Überprüfung nach der Verarbeitung der von der empfangenen Daten durchgeführt wird ESP8266 WLAN-Modul, kann die Operation auch dann als erfolgreich angesehen werden, wenn der Empfang länger dauert als die vorgeschriebene Wartezeit.

    Führen Sie eine komplexe Operation aus, die durch mehrere AT-Befehle definiert ist

    Um eine Beispielreferenz für den Zweck der Anwendung zu haben, die das ausnutzt ESP8266 WLAN-Modul, nehmen wir an, es ist so Informationen in einer Datenbank speichern, auf die über einen Webdienst zugegriffen wird um die Temperatur im Auge zu behalten. Der folgende Code liest in bestimmten Zeitintervallen einen an einen Analogeingang angeschlossenen Sensor, berechnet den Durchschnittswert und sendet ihn nach einem längeren Zeitintervall an den Webserver (style IoT) durch ein anfordern HTTP (POST, GET…).

    In diesem Beispiel zur Temperaturaufzeichnung wird alle fünf Minuten auf einen Webserver zugegriffen. Obwohl die Verfügbarkeit nicht besonders hoch ist, ist davon auszugehen, dass der Vorschlag funktionieren würde. Wenn jedoch eine höhere Aufzeichnungsfrequenz erforderlich wäre, müssten andere Ressourcen implementiert werden, z. B. a Datenpuffer warten darauf, verschickt zu werden, um mehrere zu senden, wenn der Server anwesend sein kann, und sie für den Fall zu speichern, wenn er nicht verfügbar ist. Wäre die Häufigkeit, mit der Daten aufgezeichnet werden müssen, noch größer, müssten alternativ andere Protokolltypen vorgeschlagen werden HTTP oder sogar ersetzen TCP von UDP um die meisten Daten mit der erforderlichen Geschwindigkeit senden zu können, auch wenn einige davon verloren gehen.

    Die Operationen, aus denen sich die auszuführende Aufgabe zum Senden der Temperatur zusammensetzt, wären:

    • Setzen Sie das WLAN-Modul zurück
    • Trennen Sie die Verbindung zum aktuellen Zugangspunkt (falls eine Standardverbindung vorhanden ist).
    • Legen Sie die Einstellungen fest. Für das Beispiel wird davon ausgegangen, dass der Verbindungsmodus (einfach) und die Rolle in der WLAN-Kommunikation (Station) konfiguriert werden müssen.
    • Stellen Sie eine Verbindung zum Zugangspunkt her
    • Überprüfen Sie, ob die Verbindung korrekt ist (tatsächlich ist dies der Einstiegspunkt). Wenn keine Verbindung besteht, beginnen Sie den Vorgang von vorne
    • Verbinden zum Server
    • Senden Sie die Anfrage HTTP mit den zu speichernden Daten

    Die Reihenfolge der Vorgänge muss nicht genau so sein (obwohl dies bei der Operation der Fall ist) und jeder Schritt kann mehrere Schritte erfordern ESP8266 AT-BefehleFür die oben aufgeführte Konfiguration wären beispielsweise zwei erforderlich: AT+CIPMUX=0 y AT+CWMODE=1.

    Eine Datenstruktur zur Darstellung von Vorgängen auf dem ESP8266

    In den vorherigen Beispielen wird, wenn auch auf sehr einfache Weise, bereits eine generische Lösung des Problems vorgeschlagen: Verwenden Sie eine Datenstruktur, die die möglichen Reaktionen und die jeweils durchzuführenden Aktionen speichert; Senden Sie eine Aktion, warten Sie auf eine Antwort und fahren Sie entsprechend der Bedeutung der Antwort fort. Da jeder komplexe Vorgang mehrere erfordert ESP8266 AT-Befehle, muss die Datenstruktur eine Operation mit weiteren, nachfolgenden oder vorherigen verknüpfen, die jeweils abhängig von der Antwort des ausgeführt werden müssen ESP8266.

    In den vorherigen Beispielen wurde eine Nachricht innerhalb der Antwort des gesucht ESP8266 und es wurde als Erfolg oder Fehler interpretiert. Neben einer Rezeption (und Analyse) aller eingegangenen Texte, Um ein generisches Minimum zu gewährleisten, empfiehlt es sich, auch auf die Vervollständigung der Nachricht zu achten oder, mit anderen Worten, auf die Verfügbarkeit der ESP8266 WLAN-Modul um neue Aufträge zu erhalten. Auf diese Weise könnte der Wechsel in einen Zustand, den wir beispielsweise „WLAN verfügbar“ nennen könnten, darin bestehen, den Namen des Zugangspunkts und den Text zu erhalten ERROR oder der Text OK würde bedeuten, dass die ESP8266 Sie haben die Antwort fertiggestellt und können nun die nächste senden AT-Befehl an ESP8266.

    Der obige Code verwendet einen Vektor (operacion), um den Text der aufeinanderfolgenden Vorgänge zu speichern, die die vollständige Aufgabe bilden. Es wird ein zweidimensionales Array verwendet (mensaje) mit den drei Antworten, die analysiert werden. Wie oben erläutert, muss zusätzlich zu der Nachricht, die eine richtige oder falsche Antwort darstellt, auch nach den Nachrichten gesucht werden, die das Ende der Antwort darstellen. Nicht alle Operationen haben die gleiche Anzahl möglicher Antworten; Wenn es weniger Antworten gibt, kann eine leere Nachricht verwendet werden, die die kleinstmögliche Anzahl von Zyklen für ihre Analyse benötigt (obwohl dies nicht die optimalste Methode ist). Logischerweise muss die Mindestanzahl der gesuchten Antworten (im Beispiel drei) alle Bedienmöglichkeiten umfassen, auch wenn nicht alle möglich sind.

    Wenn man über die möglichen Antworten spricht, erkennt man bereits, dass dieses Beispiel nicht sehr nützlich ist, um Daten mit einem beliebigen Format von a zu empfangen ESP8266 WLAN-Modul, aber die Sache ist die, im Kontext der Verwendung mit Mikrocontroller es ist nicht üblich; Am häufigsten werden die von den angeschlossenen Sensoren gesammelten Daten gesendet und/oder Informationen darüber empfangen, was mit den von ihnen gesteuerten Aktoren geschehen soll. Sehr wertvolle Informationen, die sich sehr gut vorhersagen lassen.

    In der vorherigen Datenstruktur wird ebenso wie zum Ausdrücken der möglichen Antworten, die analysiert werden, auch eine zweidimensionale Matrix verwendet, um die Operation zu bestimmen, die jeweils ausgeführt werden muss (siguiente_operacion). Konkret haben wir uns entschieden, auf drei Arten von Nachrichten zu antworten: ① einen beliebigen Text (LITERAL), um zu überprüfen, ob eine Verbindung zum WLAN-Zugangspunkt und zum Server besteht, ② ein Text zur Erkennung von Fehlern im Prozess (FALLO) und ③ ein Text, der angibt, dass der Vorgang erfolgreich abgeschlossen wurde (ACIERTO).

    Schließlich gibt es noch zwei weitere Vektoren, um die maximale Wartezeit vor dem Aufgeben festzulegen (timeout) und geben Sie an (configuracion), wenn der Vorgang endet, ohne auf eine Antwort zu warten (ESPERAR_RESPUESTA) und Nachrichten, die das Ende der Kommunikation anzeigen. Dieser letzte Vektor soll ein Beispiel dafür darstellen, wie Speicher eingespart werden könnte. Er arbeitet mit den Bits eines Konfigurationsbytes, um die verschiedenen Zustände anzuzeigen.

    Der erste ESP8266 AT-Befehle der Datenstruktur erwarten immer eine Antwort, die eine Erfolgs- oder Fehlermeldung sein kann. Wenn ein Fehler auftritt, wird das Modul neu gestartet und startet erneut. Wenn die Meldung anzeigt, dass der Vorgang korrekt ist, wird mit dem nächsten Schritt fortgefahren.

    Wenn Sie eine Verbindung zum Server hergestellt haben, ändert sich das Muster. In diesem Fall ist es notwendig, ① die Länge des zu übertragenden Datenpakets zu senden und ② die Anfrage zu verfassen HTTP mit einem festen Text plus dem Wert (der Temperatur), der zur Speicherung auf dem Server gesendet wird. Die Aufbereitung dieser Daten erfolgt bei jeder Sendung und es ist notwendig, sie in zwei (Länge mitteilen) oder drei (Anfrage senden) aufzuteilen HTTP) Um ESP8266 AT-Bestellung. Nur der letzte Teil, in den die Operation unterteilt ist, wartet auf eine Antwort.

    In diesem Fall wird es ohne Probleme funktionieren (vielleicht Warnung, dass das Modul ausgelastet ist), aber wenn die Länge der Daten größer ist, ist es notwendig, die Datenblöcke in kleinere Teile zu unterteilen, und es kann sogar notwendig sein, eine Wartezeit zu implementieren, wie z wird mit der Temperaturmessung durchgeführt, um dem Modul Zeit zu geben, die Daten zu senden, ohne es zu füllen puffern.

    Zusammen mit anderen Makros, die bereits zuvor erläutert wurden, zeigt der obige Beispielcode, wie die verschiedenen Zustände definiert werden, mit denen angegeben wird, ob auf eine Antwort gewartet werden soll und ggf. welche Meldung den Abschluss anzeigt.

    Wie an verschiedenen Stellen im Code ein Vorgang gesendet wird (wenn es Zeit ist, die Durchschnittstemperatur zu senden, wenn die Wartezeit eines Vorgangs überschritten wird, wenn der aktuelle Vorgang erfolgreich abgeschlossen wurde ...), aber wie das geht, erfahren Sie hier Global etabliert, wurde ein Makro definiert ENVIAR_OPERACION Hier werden die Schritte des Versands zusammengefasst.

    Das Folgende ist der Code des Hauptprogramms des Beispiels. Die externste Aufgabe besteht darin, die Temperatur zu messen, um den Durchschnitt zu berechnen und diesen in jedem bestimmten Zeitraum mithilfe von an den Server zu senden ESP8266 WLAN-Modul. Sobald jeder Vorgang gesendet wurde, wird die Antwort analysiert, um festzustellen, welcher als nächstes erfolgt oder ob die Aufgabe des Sendens von Informationen abgeschlossen wurde.

    Logischerweise können am vorherigen Code mehrere Optimierungsaktionen durchgeführt werden, da dies jedoch ein Beispiel ist, um zu verstehen, wie das funktioniert ESP8266 Generell lohnt es sich nur, sich auf einige Aspekte zu konzentrieren, der erste ist die Datenstruktur. Das scheint logisch zu sein Verwenden Sie eine Programmiersprachen-Datenstruktur (struct), um die verarbeiteten Informationen darzustellen: die ESP8266 AT-Befehle und die Nachrichten, die analysiert werden.

    Verwenden Sie eine Struktur (struct), die Daten anstelle der (auf ihnen basierenden) Beispielarrays zu speichern, ist trivial und führt zwar möglicherweise zu eleganterem Code, bedeutet aber keine Verbesserung des Ergebnisses. Die wahre Alternative durch die Verwendung von struct ist, wie unten erläutert, zu implementieren, variable Längen in Strukturen, die „innere“ Daten enthalten auf die sie sich beziehen. Auf diese Weise wäre es beispielsweise nicht erforderlich, dass für einen Vorgang eine feste Anzahl von Antworten analysiert werden müsste.

    Dieser Ansatz legt nahe, dass dies der beste Weg ist, die Lösung zu implementieren, der Nachteil besteht jedoch darin, dass dies notwendig wäre Verwenden Sie die dynamische Speicherzuweisung, eine riskante Vorgehensweise bei der Arbeit mit a Mikrocontroller Dies erfordert eine sorgfältige Messung, wie viel Speicher zur Laufzeit verwendet wird, da der Compiler uns hierüber kaum warnen kann und die Gefahr einer Erschöpfung des Speichers (bzw. des Stacks) mit fatalen Folgen für die Programmausführung besteht.

    Im Hinblick auf die Optimierung des Codes ist es interessant, sich daran zu erinnern, dass in einem Programm dieser Art, das eine große Textmenge verwendet, kann Speicherplatz sparen SRAM Speichern von Textzeichenfolgen im Programmspeicher (Blitz) mit dem Makro F(). In den folgenden Screenshots sehen Sie die unterschiedliche Programm- und dynamische Speicherverteilung bei normaler Verwendung von Text und Verwendung des Makros F().

    Arduino-Codebeispiel mit im Programmspeicher (Flash) gespeichertem Text
    Arduino-Codebeispiel mit Text im SRAM

    In Bezug auf die Aktionen, die gemäß den von der erhaltenen Informationen ausgeführt werden ESP8266 WLAN-Modul, als Alternative zum Überprüfen der Nachricht anhand des Codes und zum Ausführen des einen oder anderen, je nach dem, was empfangen wird, kann in dieser Datenstruktur gespeichert werden Zeiger auf Funktionen, die jede Aufgabe ausführen, anstelle von Statusindikatoren (Flags), die vor einem bestimmten Zustand warnen, für dessen Verwaltung die Anwendung verantwortlich ist, beispielsweise innerhalb der Hauptschleife.

    Im Folgenden finden Sie ein Beispiel für Strukturen zum Speichern der Daten der Anfragen an die ESP8266 (der Datentyp operacion_esp8266) und ihre Antworten (der Datentyp respuesta_esp8266).

    Als Struktur, die den Vorgang darstellt (die Daten, die an gesendet werden). ESP8266 WLAN-Modul) bezieht sich auf die Struktur, mit der die Antworten definiert werden, und die Struktur der Antworten auf die Struktur der Operationen, Es ist notwendig, beides zuerst zu deklarieren, indem Sie den neuen Datentyp und dann seinen Inhalt definieren.

    Im vorherigen Beispiel wird davon ausgegangen, dass das Programm, das es enthält, sich für die Verwendung von a entschieden hat Statusanzeige, die einer Variablen entsprechen muss, auf die über den Code zugegriffen werden kann, der für die Ausführung der einen oder anderen Operation verantwortlich ist, die durch den Wert angegeben wird. Wenn in der Antwort von ESP8266 Wenn ein bestimmter Text analysiert wird, nimmt der Status den Wert an, der die Struktur der entsprechenden Antwort angibt.

    Wie bereits erwähnt, wäre eine weitere Alternative, entweder eine Statusanzeige zu ersetzen oder zu ergänzen Speichern Sie eine Funktion in der Referenzstruktur (ein Zeiger), der aufgerufen wird, wenn in der Antwort von auf einen bestimmten Text gestoßen wird ESP8266 WLAN-Modul.

    Im vorherigen Beispiel wurde es der Datenstruktur hinzugefügt, die zum Verarbeiten der Antwort von verwendet wird ESP8266 WLAN-Modul ein Zeiger auf eine (vermeintliche) Funktion, die Daten vom Typ zurückgibt float (könnte der gewichtete Wert eines analogen Messwerts sein) und dem zwei Bytes als Argumente zur Verfügung gestellt werden (zwei unsigned char Dies könnte der Pin sein, von dem der analoge Eingang gelesen wird, und der Pin, der ENABLE eines hypothetischen integrierten Signals aktiviert.

    In Entwicklung für MCUIm Gegensatz zu dem, was im Entwicklungsstil für größere Systeme üblich ist, ist es nicht so ungewöhnlich, globale Variablen zu verwenden, wenn das (globale) Verhalten der Anwendung definiert wird, die eine Assembly steuert, sodass es nicht besonders selten sein wird, diese Art von Definitionen zu finden als Funktionen ohne Parameter und die keine Werte zurückgeben, so etwas wie void (*accion)();

    Wenn Sie mit dieser Art der Datendarstellung arbeiten, verwenden Sie struct Bei Daten variabler Länge ist eine dynamische Speicherzuweisung erforderlich malloc() (o new(), wenn Objekte verwendet werden), die die Menge des zugewiesenen Speichers als Parameter verwendet und einen Zeiger auf den Anfang des reservierten Speicherbereichs zurückgibt. Mit sizeof() Anhand des gespeicherten Typs multipliziert mit der Anzahl der verwendeten Elemente können Sie die benötigte Speichermenge ermitteln. Ein Beispiel mit und ohne Verwendung ist in den Screenshots unten zu sehen. malloc(); Seien Sie vorsichtig mit dem vom Programm verwendeten Speicher. Im ersten Fall müssen Sie die Bibliothek laden, die diese Funktion enthält.

    Beispiel für die Speicherzuweisung mit malloc auf Arduino

    Beispiel für Textzuweisung ohne Malloc in Arduino

    Wenn die Operationen auf der ESP8266 WLAN-Modul Während der Ausführung des Programms variieren wird, muss der nicht verwendete Speicher freigegeben werden free() (o delete(), im Fall von Objekten). Obwohl es vernünftig ist zu erwarten, dass der Compiler (GCC) optimiert das Programm, um eine Speicherpartitionierung zu vermeiden. Die Leistung wird jedoch sicherlich nicht so optimal sein wie bei der Arbeit mit statisch zugewiesenem Speicher.

    Obwohl es in diesem Beispiel (in beiden Implementierungen) nicht viel Sinn macht, sollte beachtet werden, dass die Operation verallgemeinert werden kann, um sie auf andere Fälle anwenden zu können Das Senden von Daten wiederholt immer das gleiche Protokoll: Geben Sie die Anzahl der zu sendenden Bytes an, warten Sie auf die Anzeige (>) und senden Sie die Daten.

    Da es in diesem Beispiel nur einmal verwendet wird (die gesamte Anfrage wird in einem Paket gestellt), scheint es nicht sehr nützlich zu sein, aber im Allgemeinen kann es notwendig sein, mehrere Sendungen im selben Vorgang durchzuführen, auch in Fällen, in denen Es müssen erhebliche Datenmengen übertragen werden, die fragmentiert werden müssen, um ein Überlaufen des Speichers zu vermeiden ESP8266.

    Um dieses Verhalten zu implementieren, können die letzten beiden Elemente der Verbindung verwendet werden, sodass bei jedem Senden der Daten die Daten mit den entsprechenden Werten gefüllt werden: im ersten Fall die Anzahl der gesendeten Bytes und im zweiten Fall die ( Teil der) Anfrage. übermittelt werden.

    Um die Zuordnung und das Senden der verschiedenen zu übertragenden Elemente zu wiederholen, können diese in einem Vektor gespeichert werden. Dieser neue Vektor bestimmt das Ende der komplexen Operation und nicht wie bisher die letzte Operation.

    1 Kommentar

    Kommentare Benutzer
    Sehen Sie sich Live-Fußball an

    Zu diesem Thema gibt es auf jeden Fall viel zu erfahren. Ich mag alle Punkte, die Sie gemacht haben

    Geben Sie Anmerkung

    Sie können vermisst haben