Zápisník experimentátora
Hierarchy: ESP8266
V tomto článku budeme skenovat WiFi sítě pomocí ESP8266. Budeme vycházet ze vzorového příkladu, který upravíme tak, aby výsledky zobrazoval na OLED displeji 0.96. V minulosti jsem napsal podobný článek o skenování WiFi, ve kterém jsem využíval desku Arduino MKR1000. Chování tohoto programu bude identické, pouze se zobrazení přizpůsobí možnostem displeje.
V článku jsou použity následující díly:
Propojení mezi piny je následující.
NodeMCU | OLED |
---|---|
D0 | D0 |
D1 | D1 |
D2 | RES |
D3 | DC |
D4 | CS |
GND | GND |
3V3 | VCC |
Protože toto zapojení používá softwarové ovládání SPI, použil jsem následující konstruktor z knihovny U8g2
. Knihovnu si nainstalujete prostřednictvím správce knihoven.
#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é zapojení jsem testoval v IDE 1.8.2. ESP8266 je nainstalované ve verzi 2.3.0.
Program jsem mírně upravil z originálního programu WifiScan.ino
. Ten vypisoval nalezené sítě na sériový port. To vše jsem zachoval, pouze jsem doplnil OLED displej a doplnil jsem lepší rozlišení šifrování. Kód na rozeznání šifrování je identický s verzí programu pro MKR1000. Kompletní verzi kódu naleznete na GitHub.
Ve funkci setup se inicializuje grafika pro OLED displej, na displej se vypíše informace o programu a nastaví se 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");
}
Funkce messageBox
slouží k pohodlnější zobrazení informačních textů na sériový port a displej.
void messageBox(const char *message)
{
Serial.println(message);
u8g2.clearBuffer();
u8g2.drawStr(0, 12, message);
u8g2.sendBuffer();
}
Ve funkci loop
se periodický skenuje seznam přístupových bodů WiFi a postupně se zobrazují na displeji. Displej má rozlišení 128x64, proto můžeme používat font s větším rozlišením. Můžete si porovnat tento displej s displejem Nokia 5110, který jsem použil v programu pro 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 se nachází na GitHub.
Video sa nachází na YouTube.
11.07.2017