Dans ce projet, nous allons développer un scanner WiFi portable avec un écran OLED à base d’un ESP8266 (Wemos D1 mini). Il est très facile et très économique de fabriquer ses propres capteurs et objets connectés à base d’ESP8266. Seul petit problème, on se pose toujours la question si la qualité du signal WiFi va être suffisante dans la zone ou va se trouver l’objet connecté. On a tous le reflex de dégainer son téléphone portable pour vérifier le signal WiFi. C’est une très bonne solution mais le matériel utilisé ne va pas forcément fonctionner à l’identique. Avec ce scanner (qui tient dans la main), on pourra tester en situation réelle la réception du signal. Un petit serveur fonctionnant sous Nodejs permettra également de tester si la communication est possible.
Matériel utilisé
Dans ce projet, nous allons fabriquer un petit scanner WiFi portable à base de Wemos D1 mini. La Wemos sera alimentée à l’aide d’une batterie LiPo (ici une 3,7 Volts – 150 mAh) à l’aide du Shield Battery présenté ici. On viendra terminé l’empilage avec le Shield OLED SSD1306 (64×48 pixels) présenté précédemment dans cet article. Si votre batterie n’est pas équipée d’un connecteur JST XH2-2.54mm, vous pouvez modifier le câble ou utiliser des connecteurs Dupont à sertir.
Circuit
Ce qui est magique avec la Wemos…c’est qu’il n’y a pas de circuit ! On empile simplement les modules les uns au dessus des autres et ça fonctionne. J’ai simplement soudé une résistance de 1,5MΩ entre la broche positive de la batterie et l’entrée analogique A0 pour suivre le niveau de charge de la batterie. La méthode a déjà été présentée dans cet article.
Voici l’empilage obtenu. De bas en haut, on trouve la Wemos puis le Shield Battery et enfin on termine la pile avec le Shield OLED. J’ai utilisé une petite batterie LiPo de 150 mAh que j’ai glissé entre la Wemos et le Shield Battery.
Attention. Vérifiez ou isolez les composants que vous intercalez entre les Shields. Vous risquez de provoquer des courts-circuits
Code Arduino du scanner WiFi
Pour pouvoir utiliser l’écran OLED 64×48 pixels, le plus simple est d’utiliser la librairie Adafruit_ssd1306 modifiée par Mike Causer . Elle est disponiblesur Github ici. Le programme est très simple :
- On récupère dans un premier temps la liste des réseaux (SSID) disponibles.
- Pour chaque réseau de la liste
- On récupère la force du signal et on détermine le nombre de barres à afficher (de 0 à 5).
- On envoi une requête au serveur de test. Le serveur doit répondre dans un délai imposé par la fonction http.setTimeout(duree).
#include #include #include #include "Adafruit_SSD1306.h" #include #include // SSID et mot de passe des réseaux à tester - SSID and password of the networks to check // Ajoutez autant de réseau que désiré - Add as network as desired String ssids[3] = {"yourSSID1","yourSSID2","yourSSID3"}; String passwords[3] = {"pwdSSID1","pwdSSID2","pwdSSID3"}; // IP du serveur de test - Test server IP const char* host = "xxx.xxx.xxx.xxx"; // Port du serveur - Server Port const int port = 8080; #define OLED_RESET 0 // GPIO0 Adafruit_SSD1306 display(OLED_RESET); // Initialisation des Objets - Init objects WiFiClient wifi; HTTPClient http; // Fonction de connexion au réseau WiFi void setup_wifi(String ssid, String password) { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); // Il faut convertir la String en char* - need to convert String to char* WiFi.begin(ssid.c_str(), password.c_str()); // Connexion au réseau WiFi - connecting to WiFi network int count = 0; while (WiFi.status() != WL_CONNECTED) { count++; delay(500); Serial.print("."); if ( count > 10 ) { return; } } Serial.print("IP Address: "); Serial.println(WiFi.localIP()); } void setup() { pinMode(A0, INPUT); // Le convertisseur A/N A0 sera utilisé pour mesurer la tension de la batterie - Set A0 converter as input to measure the battery tension Serial.begin(115200); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 64x48) display.display(); } float getLevel(){ float raw = analogRead(A0); int level = map(raw, 140, 227, 0, 100); // Avec une résistance 1M5 - With a 1M5 resistor Serial.print("A0 "); Serial.println(raw); if ( level < 0 ) { level = 0; } if ( level > 100 ) { level = 100; } Serial.print("Level: "); Serial.println(level); return level; } float getVoltage(){ float raw = analogRead(A0); float volt = map(raw, 140, 227, 338, 511); // Avec une résistance 1M5 - With a 1M5 resistor volt = volt / 100; Serial.print("A0 "); Serial.println(raw); Serial.print("Voltage "); Serial.println(volt); return volt; } void loop() { byte available_networks = WiFi.scanNetworks(); if ( available_networks > 0 ) { for (int network = 0; network < available_networks; network++) { //delay(1000); int level = getLevel(); long rssi = WiFi.RSSI(network); int bars = getBarsSignal(rssi); Serial.print("RSSI:"); Serial.println(rssi); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); // Affiche le nom du réseau, la qualité du signal et le niveau de la batteri - display network name, signal Strength and battery level display.print("SSID "); display.println(WiFi.SSID(network)); display.print("RSSI:"); display.println(rssi); display.print("Bat."); display.print(level); display.println("%"); // Affiche les barres de réception du signal - display signal quality bars for (int b=0; b -55) { bars = 5; } else if (rssi < -55 & rssi > -65) { bars = 4; } else if (rssi < -65 & rssi > -75) { bars = 3; } else if (rssi < -75 & rssi > -85) { bars = 2; } else if (rssi < -85 & rssi > -96) { bars = 1; } else { bars = 0; } return bars; }
Voici un petit serveur de test développé avec Nodejs. Il démarre un serveur qui écoute les requêtes en provenance de la route /checkconnexion sur le port 8080. Si le port 8080 est déjà utilisé sur votre ordinateur, il suffit de le modifier à la fin du programme. Le serveur répond juste au client en renvoyant un statut 200 (OK).
Suivez ce tutoriel pour installer Nodejs sur votre ordinateur et découvrir quelques notions. Vous aurez besoin d’installer le package expressjs pour faire fonctionner le serveur
npm install express --save
Ouvrez un éditeur de texte et collez le code ci-dessous.
/* * Serveur de test pour scanner WiFi portable à base d'ESP8266 * Test server for portable ESP8266 WiFi Scanner * http://www.projetsdiy.fr - 2017 */ var express = require('express'); var app = express(); app.get('/', function(req, res) { res.send('Test Server for ESP8266 WiFi scanner'); }); app.use('/checkconnexion', function (req, res, next) { console.log("check server connexion received"); res.sendStatus(200); }); // Port du serveur - Server Port app.listen(8080);
Enregistrez le fichier en lui donnant le nom de serveur.js par exemple.
Ouvrez un Terminal (macOS, Linux), Power Shell ou l’invite de commande (sous Windows). Placez vous dans le répertoire dans lequel le serveur a été enregistré et exécutez la commande suivante pour le démarrer.
node server.js
A chaque requête du scanner WiFi, un nouveau message sera affiché
check server connexion received
Vous pouvez partir à la chasse au réseau WiFi !
Essai du scanner WiFi
Un fois le serveur démarré et le programme Arduino téléverser dans l’ESP8266, vous êtes prêt pour cartographier la réception WiFi dans votre domicile et votre jardin. Les réseaux sont testés les uns après les autres.
Dès qu’un réseau correspond à un réseau privé, le programme tente de s’y connecter puis envoi une requête au serveur
Si le serveur a répondu dans le délai, la qualité de réception est suffisante pour y placer un objet connecté fonctionnant en WiFi
Sinon, c’est que le réseau n’offre pas une qualité suffisante. Dans ce cas, vous pouvez installer un répéteur WiFi qui se branche sur une prise de courant. Pour l’extérieur, il existe des répéteurs étanches à longue portée.
Une petite vidéo de démonstration
|
- ESP32, broches GPIO et fonctions associées. I/O, PWM, RTC, I2C, SPI, ADC, DAC
- ESP32-CAM. Broches et équipements ESP-EYE, AI Thinker, TTGO T-Camera, M5Stack Timer Camera…
- ESP32-CAM. Quel modèle choisir ? ESP-EYE, AI Thinker, TTGO T-Camera, M5Stack Timer Camera…
- M5Stack Atomic GPS. Tracker ESP32 TinyGPS++, export GPX sur carte SD, visualisation sur Google Maps ou VSCode
- Home Assistant. Installer le snap sur NAS Synology sur une machine virtuelle Ubuntu
- ESP32-CAM. Souder l’antenne externe pour améliorer la portée et la stabilité du flux vidéo
Avez-vous aimé cet article ?