Main Content

Diese Seite wurde mithilfe maschineller Übersetzung übersetzt. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

Signalstärke des drahtlosen Netzwerks mit ESP32 mit Arduino IDE

Dieses Beispiel zeigt, wie Sie die drahtlose Netzwerkfunktionalität von ESP32 nutzen, um Daten an ThingSpeak™ zu senden. Der ESP32 zeichnet die Signalstärke des drahtlosen Netzwerks auf, mit dem er verbunden ist, und veröffentlicht sie. Drücken Sie eine Taste auf der Platine, um drei Messungen der Signalstärke des drahtlosen Netzwerks durchzuführen und das Durchschnittsergebnis an einen ThingSpeak Kanal zu senden. Das Gerät sendet außerdem einen Zählerwert, sodass Sie Messungen verfolgen können.

Sie können ein Heatmap-Overlay-Bild erstellen, um die Stärke des drahtlosen Signals darzustellen. Dieses Bild zeigt die über einem Bürogrundriss überlagerten Funksignalstärken und die zur Erstellung der Heatmap verwendeten Daten. Informationen zum Generieren des Heatmap-Overlays finden Sie unter Create Heatmap Overlay Image.

Voraussetzungen

ESP32 Arduino Core und IDE Setup

Richten Sie zunächst Ihren Arduino Core für ESP32 ein. Anweisungen finden Sie unter Installation Instructions for Arduino Core for ESP32. Sie können Ihr Arduino®-Setup auf dem ESP32 anhand der Beispielskizze „Blink“ unter „Datei“ > „Beispiele“ > „01.Grundlagen“ testen. Definieren Sie den LED_BUILTIN- Pin als Pin 5, um die integrierte LED zu verwenden.

„ThingSpeak Setup“

Um ThingSpeak nutzen zu können, müssen Sie über ein Benutzerkonto und einen erstellten Kanal verfügen. Jeder Kanal verfügt über bis zu acht Datenfelder, drei Standortfelder und ein Statusfeld. Wenn Sie ein kostenloses Konto haben, können Sie alle 15 Sekunden Daten an ThingSpeak senden.

1) Eröffnen Sie ein neues Konto, wie in Sign up for ThingSpeak gezeigt.

2) Erstellen Sie einen Kanal, indem Sie „Kanäle“ > „Meine Kanäle“ > „Neuer Kanal“ auswählen.

3) Aktivieren Sie Feld 1 und Feld 2.

4) Geben Sie RSSI als Namen für Feld 1 und Counter als Namen für Feld 2 ein.

5) Benennen Sie den Kanal. Beispiel: ESP32 Signal Strength.

6) Speichern Sie Ihren Kanal.

7) Notieren Sie sich den Schreib-API-Schlüssel auf der Registerkarte „API-Schlüssel“.

Schema und Verbindungen

Um dieses Beispiel zu vervollständigen, benötigen Sie nur Geräte, die in das von Sparkfun bereitgestellte ESP32-Entwicklungskit integriert sind. Durch die Verwendung eines tragbaren Micro-USB-kompatiblen Akkus kann Ihr Gerät jedoch tragbar sein und Messungen einfacher machen.

Programmieren Sie den ESP32

Verwenden Sie die Arduino IDE, um eine Anwendung für Ihr Gerät zu erstellen.

1) Verbinden Sie den ESP32 über ein Micro-USB-Kabel mit Ihrem Computer und warten Sie, bis die Verbindung erfolgreich hergestellt wurde.

2) Wählen Sie in der Arduino IDE die ESP32 Dev Module-Karte und den richtigen COM-Port aus.

3) Erstellen Sie die Anwendung. Öffnen Sie ein neues Fenster in der Arduino IDE und speichern Sie die Datei. Fügen Sie den im Abschnitt „Code“ bereitgestellten Code hinzu. Bearbeiten Sie die SSID des drahtlosen Netzwerks, das Passwort und den Schreib-API-Schlüssel für Ihren Kanal.

Um Ihre Ergebnisse zu visualisieren, können Sie das Overlay-Bild einer Bürokarte erstellen, indem Sie die Stärken drahtloser Netzwerke mit ThingSpeak nutzen. Da die vereinfachte Hardware nur die Signalstärke aufzeichnet, müssen Sie die Koordinaten für jeden Punkt manuell aufzeichnen. Sie können die meisten Grafikbearbeitungsprogramme verwenden, um die Pixelkoordinaten in einem Bild zu ermitteln. Einzelheiten zum Generieren einer Heatmap finden Sie unter Create Heatmap Overlay Image.

Code

1) Beginnen Sie mit der Definition von Bibliotheken, Definitionen und globalen Variablen. Geben Sie die SSID und das Passwort Ihres drahtlosen Netzwerks sowie den Schreib-API-Schlüssel für Ihren Kanal ein.

#include <WiFi.h>

#define buttonPin 0 
#define LEDPin 5

// Network information
char* ssid = "WIFINAME";
const char* password = "PPPPPPPPP";

// ThingSpeak settings
char server[] = "api.thingspeak.com";
String writeAPIKey = "XXXXXXXXXXXXXXXX";

// Constants
const unsigned long postingInterval = 15L * 1000L;

// Global variables
unsigned long lastConnectionTime = 0;
int measurementNumber = 0;

2) Starten Sie im Setup die serielle Ausgabe, initialisieren Sie die Eingangs- und Ausgangspins und stellen Sie eine Verbindung zum drahtlosen Netzwerk her.

void setup(){
  
    Serial.begin(115200);
    pinMode(buttonPin,INPUT);
    pinMode(LEDPin, OUTPUT);
    connectWiFi();
    
}

3) Stellen Sie in der Hauptschleife zunächst sicher, dass eine drahtlose Verbindung besteht, und prüfen Sie dann, ob ein Tastendruck erfolgt. Wenn die Schaltfläche gedrückt wird, prüfen Sie, ob genügend Zeit verstrichen ist, um Daten zu veröffentlichen. Nachdem Sie einen Tastendruck erkannt haben, messen Sie die Stärke des drahtlosen Netzwerks und rufen Sie dann die HTTP-Posting-Funktion auf.

void loop(){
const int numberPoints = 7;
float wifiStrength;

  // In each loop, make sure there is an Internet connection.
    if (WiFi.status() != WL_CONNECTED) { 
        connectWiFi();
    }

    // If a button press is detected, write the data to ThingSpeak.
    if (digitalRead(buttonPin) == LOW){
        if (millis() - lastConnectionTime > postingInterval) {
            blinkX(2,250); // Verify the button press.
            wifiStrength = getStrength(numberPoints); 
            httpRequest(wifiStrength, measurementNumber);
            blinkX(measurementNumber,200);  // Verify that the httpRequest is complete.
            measurementNumber++;
        }
        
    }
}

4) Verbinden Sie Ihr Gerät mit der Funktion connectWiFi mit dem drahtlosen Netzwerk. Nach erfolgreicher Verbindung mit dem Netzwerk blinkt das Gerät fünfmal schnell.

void connectWiFi(){

    while (WiFi.status() != WL_CONNECTED){
        WiFi.begin(ssid, password);
        delay(3000);
    }

    // Display a notification that the connection is successful. 
    Serial.println("Connected");
    blinkX(5,50);  
}

5) Stellen Sie eine Verbindung zum ThingSpeak Server her und erstellen Sie die Datenzeichenfolgen für den HTTP-POST-Befehl mithilfe der Funktion httpRequest .

void httpRequest(float field1Data, int field2Data) {

    WiFiClient client;
    
    if (!client.connect(server, 80)){
      
        Serial.println("Connection failed");
        lastConnectionTime = millis();
        client.stop();
        return;     
    }
    
    else{
        
        // Create data string to send to ThingSpeak.
        String data = "field1=" + String(field1Data) + "&field2=" + String(field2Data); //shows how to include additional field data in http post
        
        // POST data to ThingSpeak.
        if (client.connect(server, 80)) {
          
            client.println("POST /update HTTP/1.1");
            client.println("Host: api.thingspeak.com");
            client.println("Connection: close");
            client.println("User-Agent: ESP32WiFi/1.1");
            client.println("X-THINGSPEAKAPIKEY: "+writeAPIKey);
            client.println("Content-Type: application/x-www-form-urlencoded");
            client.print("Content-Length: ");
            client.print(data.length());
            client.print("\n\n");
            client.print(data);
            
            Serial.println("RSSI = " + String(field1Data));
            lastConnectionTime = millis();   
            delay(250);
        }
    }
    client.stop();
}

6) Nehmen Sie mehrere Messungen vor und geben Sie den Durchschnittswert mit getStrength an die Hauptschleife zurück.

// Take measurements of the Wi-Fi strength and return the average result.
int getStrength(int points){
    long rssi = 0;
    long averageRSSI = 0;
    
    for (int i=0;i < points;i++){
        rssi += WiFi.RSSI();
        delay(20);
    }

   averageRSSI = rssi/points;
    return averageRSSI;
}

7) Abschließend verwenden Sie die Funktion blinkX , um die Geräte-LED zum Blinken zu bringen. Durch das Blinken kann das Board mit Ihnen kommunizieren, wenn es nicht über USB mit dem Computer verbunden ist.

// Make the LED blink a variable number of times with a variable delay.
void blinkX(int numTimes, int delayTime){ 
    for (int g=0;g < numTimes;g++){

        // Turn the LED on and wait.
        digitalWrite(LEDPin, HIGH);  
        delay(delayTime);

        // Turn the LED off and wait.
        digitalWrite(LEDPin, LOW);
        delay(delayTime);
        
    }
}

Siehe auch

|