Hauptinhalt

Diese Seite wurde mithilfe maschineller Übersetzung übersetzt. Klicken Sie hier, um das englische Original zu sehen.

Signalstärke eines drahtlosen Netzwerks mit ESP32 mit Arduino IDE

Dieses Beispiel zeigt, wie Sie die drahtlose Netzwerkfunktionalität von ESP32 verwenden, 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 auf einem ThingSpeak-Kanal zu veröffentlichen. Das Gerät zeigt auch einen Zählerwert an, sodass Sie die Messungen verfolgen können.

Sie können ein Heatmap-Overlay-Bild generieren, um die Stärke des drahtlosen Signals darzustellen. Dieses Bild zeigt die Stärke des drahtlosen Signals, die über einen Bürogrundriss gelegt ist, und die Daten, die zum Generieren der Heatmap verwendet wurden. Informationen zum Generieren der Heatmap-Überlagerung finden Sie unter Heatmap-Überlagerungsbild erstellen.

Voraussetzungen

ESP32 Arduino Core und IDE-Setup

Richten Sie zunächst Ihren Arduino Core für ESP32 ein. Anweisungen finden Sie unter Installationsanweisungen für Arduino Core für ESP32. Sie können Ihr Arduino®-Setup auf dem ESP32 mit der Beispielskizze „Blink“ in File > Examples > 01.Basics testen. Definieren Sie den LED_BUILTIN-Pin als Pin 5, um die integrierte LED zu verwenden.

ThingSpeak Setup

Um ThingSpeak zu verwenden, 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) Melden Sie sich für ein neues Konto an, wie unter Für ThingSpeak anmelden 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) Beachten Sie den Write-API-Schlüssel auf der Registerkarte API Keys.

Schema und Anschlüsse

Um dieses Beispiel abzuschließen, 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 können Sie Ihr Gerät jedoch tragbar machen und so einfachere Messungen durchführen.

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 ist.

2) Wählen Sie in der Arduino IDE die ESP32 Dev Module-Platine 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 Kennwort und den Schreib-API-Schlüssel für Ihren Kanal.

Um Ihre Ergebnisse zu visualisieren, können Sie das Overlay-Bild einer Bürokarte generieren, indem Sie die Stärken des drahtlosen Netzwerks mit ThingSpeak verwenden. Da die vereinfachte Hardware nur die Signalstärke aufzeichnet, müssen Sie die Koordinaten für jeden Punkt manuell aufzeichnen. Mit den meisten Grafikbearbeitungsprogrammen können Sie die Pixelkoordinaten eines Bildes ermitteln. Einzelheiten zum Erstellen einer Heatmap finden Sie unter Heatmap-Overlay-Bild erstellen.

Code

1) Beginnen Sie mit der Definition von Bibliotheken, Definitionen und globalen Variablen. Geben Sie die SSID und das Kennwort 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 eine Taste gedrückt wird. Wenn die Schaltfläche gedrückt wird, prüfen Sie, ob genügend Zeit zum Posten der Daten vergangen ist. 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 mithilfe 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 httpRequest-Funktion.

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) Verwenden Sie abschließend die Funktion blinkX, um die Geräte-LED blinken zu lassen. Durch das Blinken kann die Karte mit Ihnen kommunizieren, wenn sie 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

|