Zápisník experimentátora
Hierarchy: ESP8266
V tomto článku budeme skenovať WiFi siete pomocou ESP8266. Budeme vychádzať zo vzorového príkladu, ktorý upravíme tak, aby výsledky zobrazoval na OLED displeji 0.96. V minulosti som napísal podobný článok o skenovaní WiFi, v ktorom som využíval dosku Arduino MKR1000. Správanie tohto programu bude identické, iba sa zobrazenie prispôsobí možnostiam displeja.
V článku sú použité nasledovné diely:
Prepojenie medzi pinmi je nasledovné.
NodeMCU | OLED |
---|---|
D0 | D0 |
D1 | D1 |
D2 | RES |
D3 | DC |
D4 | CS |
GND | GND |
3V3 | VCC |
Pretože toto zapojenie používa softvérové ovládanie SPI, použil som nasledovný konštruktor z knižnice U8g2. Knižnicu si nainštalujete prostredníctvom správcu knižníc.
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ D0, /* data=*/ D1, /* cs=*/ D4, /* dc=*/ D3, /* reset=*/ D2);
Celé zapojenie som testoval v IDE 1.8.2. ESP8266 je nainštalované vo verzii 2.3.0.
Program som mierne upravil z originálnho programu WifiScan.ino
. Ten vypisoval nájdené siete na sériový port. To všetko som zachoval, iba som doplnil OLED displej a doplnil som lepšie rozlíšenie šifrovania. Kód na rozoznanie šifrovania je identický s verziou programu pre MKR1000. Kompletnú verziu kódu nájdete na GitHub.
Vo funkcii setup
sa inicializuje grafika pre OLED displej, na displej sa vypíše informácia o programe a nastaví sa vhodný režim práce s WiFi.
void setup() {
u8g2.begin();
u8g2.setFont(u8g2_font_ncenB10_tr);
u8g2.clearBuffer();
u8g2.drawStr(0, 12, "Arduino Slovakia");
u8g2.drawStr(0, 26, "WiFi Scanner");
u8g2.sendBuffer();
Serial.begin(115200);
// Set WiFi to station mode and disconnect from an AP if it was previously connected
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(1000);
Serial.println("Setup done");
}
Funkcia messageBox
slúži na pohodlnejšie zobrazenie informačných textov na sériový port a displej.
void messageBox(const char *message)
{
Serial.println(message);
u8g2.clearBuffer();
u8g2.drawStr(0, 12, message);
u8g2.sendBuffer();
}
Vo funkcii loop
sa periodický skenuje zoznam prístupových bodov WiFi a postupne sa zobrazujú na displeji. Displej má rozlíšenie 128x64, preto môžeme používať font s väčším rozlíšením. Môžete si porovnať tento displej s displejom Nokia 5110, ktorý som použil v programe pre Arduino MKR1000.
void loop() {
messageBox("scan start");
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks(false,true); // false - async, true - hidden networks
messageBox("scan done");
if (n == 0)
messageBox("no networks found");
else
{
sprintf(draw, "%d netw. found", n);
messageBox(draw);
for (int i = 0; i < n; ++i)
{
// Print SSID and RSSI for each network found
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(") ");
Serial.println(getEncryptionType(WiFi.encryptionType(i)));
// oled
strcpy(ssid,WiFi.SSID(i).c_str());
int dl=strlen(ssid);
if(dl>2) { // hide some details
ssid[dl-2]='?';
ssid[dl-1]='?';
}
u8g2.clearBuffer();
sprintf(draw,"Net: %d/%d",i+1,n);
u8g2.drawStr(0, 12, draw);
u8g2.drawStr(0, 26, ssid);
sprintf(draw,"Sig: %d dBm",WiFi.RSSI(i));
u8g2.drawStr(0, 40, draw);
sprintf(draw,"Enc: %s",getEncryptionType(WiFi.encryptionType(i)));
u8g2.drawStr(0, 54, draw);
u8g2.sendBuffer();
delay(2000);
}
}
Serial.println("");
}
Zdrojový kód sa nachádza na GitHub.
Video sa nachádza na YouTube.
08.07.2017