|
// Setup WiFi To own Network
|
|
// Setup WiFi To own Network
|
|
// Send Data from ESP32 over MQTT to PC with Node-red
|
|
// Send Data from ESP32 over MQTT to PC with Node-red
|
|
// Wokwi
|
|
// Wokwi
|
|
|
|
# Self-Learning Make the ESP32 an IoT-Device
|
|
|
|
|
|
**Goal**
|
|
**Goal**
|
|
Ziel dieses Abschnitts ist es vom ESP32 zyklisch (1s) Daten über einen öffentlichen Mqtt-Broker zu Senden. Zusätzlich wollen wir das gesendete Datenpaket von eurem PC aus abonnieren und visualisieren.
|
|
The goal of this section is to send data cyclically (every 1 second) from the ESP32 to a public MQTT broker. Additionally, we aim to subscribe to the sent data packet from your PC and visualize it.
|
|
|
|
|
|
**1.Step-Verbindung des simulierten ESP32 zu eurem WLAN-Router**
|
|
## Establishing WiFi Connection with the ESP32
|
|
Es gibt zahlreiche Libraries welche euch helfen schnell eine Verbindung zu eurem Router herzustellen.
|
|
|
|
Damit wir eine consistente Lösung im Workshop zusammen entwickeln können, einigen wir uns schon in dieser Vorbereitung auf eine Library.
|
|
|
|
|
|
|
|
Library: AsyncTCP -> https://github.com/me-no-dev/AsyncTCP
|
|
There are numerous libraries available that help quickly establish a connection to your router. To develop a consistent solution during the workshop, we will use a specific library.
|
|
|
|
The ESP32 has a built-in WiFi antenna. Using the WiFi.h library, a WiFi connection can be established in a few steps.
|
|
|
|
|
|
Um eine Library in VSCode zu integrieren gibt es 2 Möglichkeiten.
|
|
## Define your WiFi-Network
|
|
1. Download den zip Folder von Github, entpacke und kopiere diesen in den lib Ordner.
|
|
|
|
|
|
|
|
# WiFi Verbindung mit dem ESP32 herstellen
|
|
|
|
|
|
|
|
Der ESP32 besitzt eine eingebaute WiFi Antenne.
|
|
|
|
|
|
|
|
Mit Hilfe der WiFi.h Biblithek lässt sich in nur wenigen Schritten eine WiFi verbindung aufbauen.
|
|
|
|
|
|
|
|
## Bibliothek und die Konstanten
|
|
|
|
|
|
|
|
```C++
|
|
```C++
|
|
#include <WiFi.h>
|
|
#include <WiFi.h>
|
|
|
|
|
|
const char *SSID = "BaristaBandwidth"; //<-- Achten Sie auf die Anweisungen der Praktikumsbetreuung
|
|
const char *SSID = "BaristaBandwidth"; //This is the name of Your Router
|
|
const char *PWD = "oneEspressoPLEASE"; //<-- Achten Sie auf die Anweisungen der Praktikumsbetreuung
|
|
const char *PWD = "oneEspressoPLEASE"; //This is the password of Your WiFi-Network
|
|
|
|
|
|
const unsigned long INTERVAL = 5000;
|
|
|
|
|
|
|
|
|
|
TimeHandle_t wifiReconnectTimer; //Never mind!
|
|
```
|
|
```
|
|
|
|
|
|
- Die ``SSID`` bezeichnet den Namen des WiFi Netzwerkes, mit dem Sie Ihren ESP32 verbinden wollen.
|
|
- The `SSID` refers to the name of the WiFi network you want to connect your ESP32 to.
|
|
- ``PWD`` ist dabei das Passwort für das WiFi Netzwerk.
|
|
- `PWD` is the password for the WiFi network.
|
|
|
|
|
|
|
|
|
|
> :bulb: :exclamation: Laut Konvention werden KONSTANTEN in Großbuchstaben geschrieben.
|
|
> :bulb: :exclamation: By convention, CONSTANTS are written in uppercase letters.
|
|
|
|
|
|
## Verbinden mit WiFi.begin()
|
|
## Verbinden mit WiFi.begin()
|
|
|
|
|
|
Um den Code übersichtlicher zu gestalten wird eine Funktion ``wifiConnect()`` definiert:
|
|
Um den Code übersichtlicher zu gestalten wird eine Funktion ``wifiConnect()`` definiert:
|
|
|
|
|
|
```C++
|
|
```C++
|
|
void wifiConnect() {
|
|
void initWiFi() {
|
|
WiFi.begin(<name des wifi>, <pwd des wifi>); // <-- Variablen anpassen!
|
|
WiFi.mode(WIFI_STA);
|
|
Serial.println("");
|
|
WiFi.begin(ssid, password);
|
|
|
|
Serial.print("Connecting to WiFi ..");
|
|
|
|
|
|
// Wait for connection
|
|
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
delay(500);
|
|
Serial.print('.');
|
|
Serial.print(".");
|
|
delay(1000);
|
|
}
|
|
}
|
|
|
|
|
|
Serial.println("");
|
|
|
|
Serial.print("Connected to ");
|
|
|
|
Serial.println(<name des wifi);
|
|
|
|
Serial.print("IP address: ");
|
|
|
|
Serial.println(WiFi.localIP());
|
|
Serial.println(WiFi.localIP());
|
|
}
|
|
}
|
|
```
|
|
|
|
|
|
|
|
> :exclamation: :books: Übernehmen Sie diese Funktion in Ihren Code um Ihren ESP mit dem WiFi zu verbinden. Diese Funktion muss außerhalb und über der setup() Funktion stehen.
|
|
|
|
|
|
|
|
> :zap: Denken Sie daran die oben definierten Variablen richtig einzusetzen.
|
|
```
|
|
|
|
|
|
> :question: Was passiert in der ``while`` Schleife?
|
|
> :exclamation: :books: Include this function in your code to connect your ESP with the WiFi. This function must be placed outside and above the 'setup()' function
|
|
|
|
|
|
> :books: Rufen Sie diese Funktion ``wifiConnect()`` in der ``setup()`` Ihres Programmcodes auf!
|
|
> :books: Rufen Sie diese Funktion ``wifiConnect()`` in der ``setup()`` Ihres Programmcodes auf!
|
|
> Damit die Ausgabe über den seriellen Monitor funktioniert, müssen Sie in der ``setup()`` außerdem die Funktion ``Serial.begin(115200)`` aufrufen!
|
|
> Damit die Ausgabe über den seriellen Monitor funktioniert, müssen Sie in der ``setup()`` außerdem die Funktion ``Serial.begin(115200)`` aufrufen!
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
## Verbindung überwachen
|
|
## Monitoring the Connection
|
|
|
|
|
|
Während dem Betrieb kann es zu Fluktuationen in der Signalstärke des WiFi Netzes kommen. Die kann dazu führen, dass die Verbindung zwischen Netzwerk und ESP32 abbricht.
|
|
|
|
|
|
|
|
Um dieses Verhalten abzufangen definiert man eine Funktion ``checkWiFiConnection()``:
|
|
During operation, fluctuations in the WiFi signal strength can cause the connection between the network and the ESP32 to drop. To handle this behavior, define a function wifiCheckConnection()
|
|
|
|
|
|
```C++
|
|
```C++
|
|
void wifiCheckConnection() {
|
|
void wifiCheckConnection() {
|
|
if (WiFi.status() != WL_CONNECTED) { //Wenn die Verbindung nicht mehr "WL_CONNECTED" ist, dann...
|
|
if (WiFi.status() != WL_CONNECTED) {
|
|
wifiConnect(); //wieder mit dem WiFi verbinden
|
|
wifiConnect();
|
|
}
|
|
}
|
|
|
|
yield(); //
|
|
yield(); // give stack time to work
|
|
|
|
}
|
|
}
|
|
```
|
|
```
|
|
|
|
## Complete Code
|
|
|
|
```C++
|
|
|
|
#include <WiFi.h>
|
|
|
|
|
|
|
|
const char* SSID = "iaAM_Manualworkstation_1";
|
|
|
|
const char* PWD = "iaAM_Manualworkstation_1_pw";
|
|
|
|
|
|
> :exclamation: :books: Fügen Sie den nötigen Funktionsaufruf in der ``if``-Bedingung ein!
|
|
const unsigned long RECON_INTERVAL = 5000;
|
|
|
|
|
|
> :question: :books: Wo muss diese Funktion ``wifiCheckConnection`` aufgerufen werden?
|
|
void wifiConnect() {
|
|
|
|
WiFi.begin(SSID, PWD);
|
|
|
|
Serial.println("");
|
|
|
|
// Wait for connection
|
|
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
|
|
delay(500);
|
|
|
|
Serial.print(".");
|
|
|
|
}
|
|
|
|
Serial.println("");
|
|
|
|
Serial.print("Connected to ");
|
|
|
|
Serial.println(SSID);
|
|
|
|
Serial.print("IP address: ");
|
|
|
|
Serial.println(WiFi.localIP());
|
|
|
|
}
|
|
|
|
|
|
|
|
void wifiCheckConnection() {
|
|
|
|
if (WiFi.status() != WL_CONNECTED) {
|
|
|
|
wifiConnect();
|
|
|
|
}
|
|
|
|
yield();
|
|
|
|
}
|
|
|
|
|
|
|
|
void setup() {
|
|
|
|
// put your setup code here, to run once:
|
|
|
|
Serial.begin(115200);
|
|
|
|
wifiConnect();
|
|
|
|
Serial.println("Hello, ESP32!");
|
|
|
|
}
|
|
|
|
|
|
|
|
void loop() {
|
|
|
|
// put your main code here, to run repeatedly:
|
|
|
|
wifiCheckConnection(); // Check connection status and reconnect if necessary
|
|
|
|
delay(10000); // Adjust delay as needed
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
> :question: :bulb: Was macht die ``yield()`` Funktion?
|
|
|
|
|
|
|
|
|
|
|
|
Für andere Libraries werden wir eine andere Möglichkeit ausprobieren.
|
|
|
|
Libraries sind nichts anderes als Code-Module, die wir in unserem Projekt verwenden, um den Aufwand zu verringern.
|
|
|
|
|
|
|
|
# JSON
|
|
# JSON
|
|
|
|
|
... | | ... | |