Main Content

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

Force du signal du réseau sans fil avec ESP32 avec Arduino IDE

Cet exemple montre comment utiliser la fonctionnalité de réseau sans fil d'ESP32 pour publier des données sur ThingSpeak™. L'ESP32 enregistre et publie la puissance du signal du réseau sans fil auquel il est connecté. Appuyez sur un bouton du tableau pour prendre trois mesures de la puissance du signal du réseau sans fil et publier le résultat moyen sur un canal ThingSpeak . L' appareil affiche également une valeur de compteur afin que vous puissiez suivre les mesures.

Vous pouvez générer une image de superposition de carte thermique pour représenter les forces du signal sans fil. Cette image montre les forces du signal sans fil superposées sur un plan d'étage de bureau et les données utilisées pour générer la carte thermique. Pour générer la superposition de carte thermique, voir Create Heatmap Overlay Image.

"Conditions préalables"

 Configuration du noyau ESP32 Arduino et de l'IDE 

Tout d'abord, configurez votre Arduino Core pour ESP32. Pour obtenir des instructions, voir Installation Instructions for Arduino Core for ESP32. Vous pouvez tester votre configuration Arduino® sur l'ESP32 en utilisant l'exemple de figure Blink dans Fichier > Exemples > 01.Basics . Définissez la broche LED_BUILTIN comme broche 5 pour utiliser la LED intégrée.

Configuration de ThingSpeak

Pour utiliser ThingSpeak , vous devez disposer d'un compte utilisateur et d'une canal créée. Chaque canal comporte jusqu'à huit champs de données, trois champs d'emplacement et un champ d'état. Si vous avez un compte gratuit, vous pouvez envoyer des données à ThingSpeak toutes les 15 secondes.

1) Créez un nouveau compte comme indiqué dans Sign up for ThingSpeak.

2) Créez une canal en sélectionnant Canaux > Mes canaux > Nouveau canal .

3) Activez le champ 1 et le champ 2.

4) Entrez RSSI comme nom du champ 1 et Counter comme nom du champ 2.

5) Nommez le canal. Par exemple, ESP32 Signal Strength.

6) Enregistrez votre canal.

7) Notez la clé d'API en écriture sur l'ongletClés API.

 Schéma et connexions 

Pour compléter cet exemple, vous n'avez besoin que des appareils intégrés au kit de développement ESP32 fourni par Sparkfun. Cependant, l'utilisation d'une batterie portable compatible micro-USB peut rendre votre appareil portable pour des mesures plus faciles.

Programmer l'ESP32

Utilisez l'IDE Arduino pour créer une application pour votre appareil.

1) Connectez l'ESP32 à votre ordinateur à l'aide d'un câble micro-USB et attendez qu'il se connecte avec succès.

2) Dans l'IDE Arduino, sélectionnez la carte ESP32 Dev Module et le bon port COM.

3) Créez l'application. Ouvrez une nouvelle fenêtre dans l'IDE Arduino et enregistrez le fichier. Ajoutez le code fourni dans la section Code. Modifiez le SSID, le mot de passe et la clé d'API en écriture du réseau sans fil pour votre canal.

Pour visualiser vos résultats, vous pouvez générer l'image superposée d'un plan de bureau en utilisant les forces du réseau sans fil avec ThingSpeak. Étant donné que le hardware simplifié n'enregistre que l'intensité du signal, vous devez enregistrer manuellement les coordonnées de chaque point. Vous pouvez utiliser la plupart des programmes d'édition graphique pour trouver les coordonnées des pixels sur une image. Pour plus de détails sur la génération d'une carte thermique, voir Create Heatmap Overlay Image.

Code

1) Commencez par définir des bibliothèques, des définitions et des variables globales. Saisissez le SSID et le mot de passe de votre réseau sans fil ainsi que la clé d'API en écriture de votre canal.

#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) Dans la configuration, démarrez la sortie série, initialisez les broches d'entrée et de sortie et connectez-vous au réseau sans fil.

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

3) Dans la boucle principale, assurez-vous d'abord qu'il existe une connexion sans fil, puis vérifiez si un bouton a été enfoncé. Si le bouton est enfoncé, vérifiez si suffisamment de temps s'est écoulé pour publier les données. Après avoir détecté une pression sur un bouton, mesurez la force du réseau sans fil, puis appelez la fonction de publication HTTP.

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) Connectez votre appareil au réseau sans fil à l'aide de la fonction connectWiFi. Après s'être connecté avec succès au réseau, l' appareil clignote cinq fois rapidement.

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) Connectez-vous au serveur ThingSpeak et créez les chaînes de données pour la commande HTTP POST à ​​l'aide de la fonction 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) Prenez plusieurs mesures et renvoyez la valeur moyenne à la boucle principale avec getStrength.

// 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) Enfin, utilisez la fonction blinkX pour faire clignoter la LED de appareil . Les clignotements permettent à la carte de communiquer avec vous lorsqu'elle n'est pas connectée à l'ordinateur via USB.

// 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);
        
    }
}

Voir aussi

|