Inhaltsverzeichnis:
- Schritt 1: Erstellen einer Build-Umgebung
- Schritt 2: Quellcode abrufen, konfigurieren und erstellen
- Schritt 3: Hardwarekomponenten anschließen
- Schritt 4: Flashen und ausführen
- Schritt 5: Interaktion
- Schritt 6: Implementierungsdetails
Video: WiFi-LED-Streifen + Temperatursensor mit ESP8266 - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:19
In diesem Tutorial werden die Schritte beschrieben, um einen ESP8266 einzurichten und ihn sowohl mit einem Temperatursensor als auch mit einem LED-Streifen in Verbindung zu bringen und gleichzeitig mit MQTT über WLAN Eingaben zu empfangen und Ausgaben zu senden. Das Projekt wurde für einen Kurs entwickelt, der im Herbst 2016 an der Cal Poly San Luis Obispo durchgeführt wurde – CPE 439: Real Time Embedded Systems. Das übergeordnete Ziel war es, zu demonstrieren, wie einfach es ist, mit billiger Hardware ein mit dem Internet verbundenes "Ding" zu erstellen.
Benötigte Vorräte/Ausrüstung:
- NodeMCU ESP8266-Entwicklungsplatine
- WS2812B LED-Streifen
- MAX31820 Temperatursensor
- Steckbrett
- 4,7K Ohm Widerstand
- 220 Ohm Widerstand
- Überbrückungsdrähte
- Micro-USB-Kabel
- PC (oder VM) mit Linux (z. B. Ubuntu)
Annahmen/Voraussetzungen:
- Erfahrung mit der Verwendung von Befehlszeilentools und der Installation von Paketen auf einer debian-basierten Distribution
- Grundverständnis der Makefile-Syntax
- Anschlussdrähte
Schritt 1: Erstellen einer Build-Umgebung
Um das Projekt zu erstellen, müssen Sie esp-open-sdk auf Ihrem Computer installieren. Folgen Sie dem Link und lesen Sie die Bauanleitung. Kurz gesagt, Sie werden einige sudo apt-get-Befehle ausführen, um Abhängigkeiten zu installieren, einen git clone --recursive zum Klonen/Herunterladen von esp-open-sdk und schließlich einen make-Befehl zum Erstellen von esp-open-sdk.
Schau mir zu
Schritt 2: Quellcode abrufen, konfigurieren und erstellen
Nachdem esp-open-sdk erstellt wurde, klonen Sie das Projekt-Repository.
git-Klon
Wechseln Sie in das Projektverzeichnis, erstellen Sie einen.local-Ordner und kopieren Sie die Beispieleinstellungen.
cd esp-rtos-tests
mkdir -p.local cp settings.example.mk.local/settings.mk
Öffnen Sie nun.local/settings.mk mit einem beliebigen Texteditor und ändern Sie die folgenden Einstellungen:
- OPENSDK_ROOT: Der absolute Pfad für den Speicherort von esp-open-sdk, das Sie in Schritt 1 erstellt haben
- WIFI_SSID: Die SSID Ihres WLAN-Netzwerks
- WIFI_PASS: Das Passwort Ihres WLAN-Netzwerks
- PIXEL_COUNT: Die Anzahl der Pixel auf Ihrem WS2812B LED-Streifen
Hinweis: Da dieses Projekt SPI zum Ansteuern der LEDs verwendet und die NodeMCU 3.3v verwendet, um sie zu versorgen, können Sie wahrscheinlich nicht mehr als ~ 60 LEDs ansteuern.
Hinweis: Die anderen Einstellungen müssen nicht geändert werden, können aber auf Wunsch geändert werden. Es wird empfohlen, die Reihenfolge der Aufgabenprioritäten beizubehalten. Je niedriger die Prioritätsnummer, desto niedriger die Priorität der Aufgabe.
Erstellen Sie nun das Projekt:
make -C Beispiele/cpe439
Wenn alles richtig eingerichtet ist, sollte es mit der Kompilierung beginnen. Am Ende sollten Sie sehen:
'firmware/cpe439.bin' erfolgreich erstellt
Schau mir zu
Schritt 3: Hardwarekomponenten anschließen
Nachdem der Code kompiliert ist, ist es an der Zeit, unsere Peripheriegeräte anzuschließen.
Kleben Sie zuerst die NodeMCU auf das Steckbrett und verwenden Sie dann Überbrückungsdrähte, um die Verbindungen wie im Diagramm gezeigt herzustellen.
Ein paar Dinge, die Sie beachten sollten:
- Wichtig: Die Datenleitung WS2812B ist nicht bidirektional. Wenn Sie sich die Markierungen auf der LED-Seite des Streifens genau ansehen, sollten Sie kleine Pfeile sehen, die in eine Richtung zeigen. Der Ausgang von D7 der NodeMCU muss genauso in den WS2812B gehen wie die Richtungsmarkierung, die Sie bei genauerem Hinsehen im Diagramm sehen können.
- Je nachdem, mit welcher Art von Anschlüssen Ihr WS2812B geliefert wird, müssen Sie möglicherweise einige Änderungen vornehmen, damit sie sicher mit dem Steckbrett verbunden sind. Sie können auch Krokodilklemmen verwenden, um sie mit Steckbrett-fähigen Überbrückungskabeln zu verbinden.
- Die Pins des MAX31820 haben ein kleineres Rastermaß und sind dünner als herkömmliche 0,1"/2,54-mm-Jumper, wodurch sie schwierig zu verbinden sind. Eine Möglichkeit, dies zu umgehen, besteht darin, Buchse-zu-Stecker-Überbrückungsdrähte zu verwenden, das Kunststoffgehäuse von der Buchsenseite abzunehmen, Verwenden Sie dann eine Zange, um die weiblichen Jumper-Enden fest um die kleineren MAX31820-Pins zu crimpen.
Überprüfen Sie die Verbindungen, bevor Sie die NodeMCU einschalten, um die Komponenten nicht zu beschädigen.
Schritt 4: Flashen und ausführen
Blinken
Wenn die gesamte Hardware angeschlossen ist, schließen Sie Ihre NodeMCU an und flashen Sie mit dem folgenden Befehl:
make flash -C Beispiele/cpe439 ESPPORT=/dev/ttyUSB0
/dev/ttyUSB0 ist die serielle com, unter der die NodeMCU angezeigt werden soll. Wenn Sie andere serielle Geräte angeschlossen haben, wird diese möglicherweise als /dev/ttyUSB1 oder eine andere Nummer angezeigt. Zur Überprüfung können Sie diesen Befehl zweimal ausführen, einmal mit ausgestecktem NodeMCU und einmal mit eingestecktem, und den Unterschied vergleichen:
ls /dev/ttyUSB*
Ein weiteres Problem, auf das Sie möglicherweise stoßen, besteht darin, keine Berechtigung zum Zugriff auf das Gerät zu haben. Zwei Möglichkeiten, dies zu beheben, sind:
-
Fügen Sie Ihren Benutzer zur Dialout-Gruppe hinzu:
sudo adduser $(whoami) dialout
- chmod oder chown das Gerät:
sudo chmod 666 /dev/ttyUSB0 sudo chown $(whoami):$(whoami) /dev/ttyUSB0Das erste Verfahren wird bevorzugt, da es eine dauerhafte Lösung ist.
Laufen
Nach erfolgreicher Ausführung des Flash-Befehls startet das Gerät sofort und beginnt mit der Ausführung des kompilierten Codes. Nach dem Flashen können Sie jederzeit den folgenden Befehl ausführen, um die serielle Ausgabe zu beobachten:
python3 -m serial.tools.miniterm --eol CRLF --exit-char 003 /dev/ttyUSB0 500000 --raw -q
Um Zeit zu sparen, können Sie dies zu Ihrer ~/.bashrc-Datei hinzufügen:
alias nodemcu='python3 -m serial.tools.miniterm --eol CRLF --exit-char 003 /dev/ttyUSB0 500000 --raw -q'
..womit Sie einfach "nodemcu" als Alias für diesen Befehl eingeben können.
Wenn alles richtig konfiguriert ist, sollte Ihr LED-Streifen grün leuchten, und auf der seriellen Seite sollten Sie WiFi-Verbindung sehen, eine IP-Adresse erhalten, eine Verbindung zu MQTT herstellen und Nachrichten darüber erhalten, dass Temperaturdaten übertragen werden.
verbunden mit MyWiFiSSID, Kanal 1dhcp client start…wifi_task: status = 1wifi_task: status = 1ip:192.168.2.23, mask:255.255.255.0, gw:192.168.2.1ws2812_spi_init okRequest temp OKwifi_task: status = 5xQueue ConnectReceive +25.43xqoktask: status = 5xQueue ConnectReceive +25.43xqok: (Wieder)Verbindung zum MQTT-Server test.mosquitto.org …xQueueReceive +25.50xQueueSend ok doneSend MQTT connect … MQTTv311donexQueueReceive +25.56 xQueueSend ok
Schritt 5: Interaktion
Vorausgesetzt, Ihr Gerät hat sich erfolgreich mit WLAN und dem MQTT-Broker verbunden, können Sie mit MQTT Daten von der NodeMCU senden und empfangen. Falls noch nicht geschehen, installieren Sie das Mosquitto-Client-Paket:
sudo apt-get install mosquitto-clients
Sie sollten jetzt in der Lage sein, die Programme mosquitto_pub und mosquitto_sub von Ihrer Shell aus zu verwenden.
Empfangen von Temperatur-Updates
Um Temperaturdaten zu erhalten, möchten wir den Befehl mosquitto_sub verwenden, um das Thema zu abonnieren, zu dem die NodeMCU veröffentlicht.
mosquitto_sub -h test.mosquitto.org -t /cpe439/temp
Sie sollten Temperaturdaten (in Celsius) sehen, die im Terminal ankommen.
+25.87+25.93+25.68…
Einstellen der Farbe des LED-Streifens aus der Ferne
Ein einfaches Nachrichtenformat wird verwendet, um RGB-Werte über MQTT an die NodeMCU zu senden. Das Befehlsformat sieht wie folgt aus:
r:RRRg:GGGb:BBB~
Dabei entsprechen RRR, GGG, BBB den RGB-Werten (0-255) der Farbe, die Sie senden möchten. Um unseren Befehl zu senden, verwenden wir den Befehl mosquitto_pub. Hier sind einige Beispiele:
mosquitto_pub -h test.mosquitto.org -t /cpe439/rgb -m 'r:255g:0b:0~' # redmosquitto_pub -h test.mosquitto.org -t /cpe439/rgb -m 'r:0g:255b: 0~' # greenmosquitto_pub -h test.mosquitto.org -t /cpe439/rgb -m 'r:0g:0b:255~' # blau
Wenn Sie kreativ werden möchten, finden Sie online einen Farbwähler wie diesen und bearbeiten Sie den Befehl mit dem von Ihnen gewählten RGB-Wert.
Achtung
Die Themen in diesem Projekt sind auf einem öffentlichen MQTT-Broker auf /cpe439/rgb und /cpe439/temp festgelegt, was bedeutet, dass niemand anderes daran hindert, dieselben Themen wie Sie zu veröffentlichen oder zu abonnieren. Um Dinge auszuprobieren, ist die Verwendung eines öffentlichen Brokers in Ordnung, aber für ernsthaftere Projekte sollten Sie sich mit einem Passwortschutz verbinden oder Ihren eigenen Broker auf dem Server ausführen.
Schritt 6: Implementierungsdetails
Eindraht
Der ESP8266 hat nur 1 Kern, so dass lange Blockierungsaufgaben wie das Warten von 750 ms, bis der Temperatursensor eine Temperaturmessung durchführt, normalerweise dazu führen würden, dass WLAN nicht gut funktioniert und möglicherweise sogar abstürzt. Im FreeRTOS-Paradigma rufen Sie vTaskDelay() auf, um diese langen Wartezeiten zu verarbeiten, aber es sind auch viele kürzere Wartezeiten zwischen Lese- und Schreibvorgängen erforderlich, die kürzer als der FreeRTOS-Systemtick sind und daher mit vTaskDelay() nicht vermieden werden können. Um diese auch zu umgehen, wurde der Onewire-Treiber in diesem Projekt so geschrieben, dass er von einer Zustandsmaschine abläuft, die vom Hardware-Timer des ESP8266 gesteuert wird und Ereignisse bis zu alle 10 Mikrosekunden auslösen kann, was zufällig der kürzeste ist erforderliche Zeit zwischen Eindraht-Lese-/Schreibvorgängen. Die meisten anderen Implementierungen verwenden einen blockierenden Aufruf von delay_us() oder ähnlichem, um dies zu handhaben, aber wenn Sie ständig Temperaturaktualisierungen vornehmen, addieren sich all diese Verzögerungen, was zu einer weniger reaktionsschnellen Anwendung führt. Die Quelle für diesen Codeabschnitt befindet sich im Ordner extras/onewire.
WS2812B
Der ESP8266 verfügt über keine Standard-Hardwareoptionen für PWM, die schnell genug sind, um LED-Streifen mit 800 kHz anzusteuern. Um dies zu umgehen, verwendet dieses Projekt den SPI MOSI-Pin zum Ansteuern der LEDs. Durch Anpassen der Taktrate von SPI und Ändern der SPI-Nutzlast können Sie eine ziemlich zuverlässige Steuerung jeder einzelnen LED erreichen. Diese Methode ist nicht ohne Fehler - zum einen sollten die LEDs mit einer 5V-Quelle versorgt werden und ein Pegelumsetzer sollte dem Ausgang des SPI-Pins hinzugefügt werden. Aber 3,3V funktionieren. Zweitens gibt es Störimpulse, die aufgrund eines unvollkommenen Timings bei der SPI-Methode auftreten. Und drittens können Sie SPI jetzt für nichts anderes verwenden. Weitere Hintergrundinformationen zu dieser Methode finden Sie hier, und die Quelle für diesen Codeabschnitt befindet sich im Ordner extras/ws2812.
Eine zuverlässigere Methode zum Ansteuern von LED-Streifen ist die Verwendung von i2s. Diese Methode enthält jedoch viele chipspezifische Hacks, sodass SPI als Lernübung die bessere Wahl zu sein schien.
Empfohlen:
Temperatursensor (Arduino): 8 Schritte
Temperatursensor (Arduino): Dieses Projekt ist perfekt für Fortgeschrittene und Anfänger. Die Einrichtung ist sehr einfach. Es gibt einen Chip namens LM35 (Link für zusätzliche Erklärung), der es dem Arduino ermöglicht, die Temperatur der Umgebung zu bestimmen