Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

M5Stack. WiFi

Так как M5Stack использует микроконтроллер ESP32, то следовательно имеет встроенный WiFi-модуль. Мы можем использовать примеры для ESP32, используя библиотеку WiFi.h.

Имея TFT-дисплей, мы можем вывести информацию не в монитор порта, а на экран. Напишем скетч для сканирования WiFi-сетей. Я немного переделал готовый пример, взятый с форума.


#include <M5Stack.h>
#include "WiFi.h"
#include <String.h>

int n;
int ssidLength = 12;
int thisPage = 0;
const int pageSize = 8;
bool on = false;
bool leftLocked = false;
bool rightLocked = false;

void setup()
{
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();

  M5.begin();
  M5.Lcd.setBrightness(100);
  M5.Lcd.setTextSize(3);
  M5.Lcd.setCursor(45, 110);
  M5.Lcd.printf("Wi-Fi scanner");
  drawMenu();
}

void drawMenu() {
  M5.Lcd.setTextSize(3);
  M5.Lcd.setTextColor(BLUE);

  if (on == true)
  {
    M5.Lcd.setCursor(110, 215);
    M5.Lcd.printf("RESCAN");
    if (thisPage != 0)
    {
      M5.Lcd.setCursor(60, 215);
      M5.Lcd.printf("<");
      leftLocked = false;
    }
    else
    {
      leftLocked = true;
    }
    if (thisPage < ((n - 1) / pageSize))
    {
      M5.Lcd.setCursor(250, 215);
      M5.Lcd.printf(">");
      rightLocked = false;
    }
    else
    {
      rightLocked = true;
    }
  }
  else
  {
    M5.Lcd.setCursor(128, 215);
    M5.Lcd.printf("SCAN");
  }
}

void clearScreen() {
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setTextSize(2);
}

void showRecords(int nav = 0) // -1 top, 1 bottom
{
  if (nav == -1)
  {
    if ((on == true) && (leftLocked == false))
    {
      thisPage--;
      if (thisPage < 0) thisPage = 0;
      showRecords();
    }
  }
  else if (nav == 1)
  {
    if ((on == true) && (rightLocked == false))
    {
      if ((thisPage) <= (n / pageSize)) thisPage++;
      showRecords();
    }
  }
  else
  {
    clearScreen();
    M5.Lcd.setCursor(100, 2);
    M5.Lcd.print("TOTAL: ");
    M5.Lcd.print(n);
    M5.Lcd.setCursor(0, 30);
    for (int i = (thisPage * pageSize); i < ((thisPage * pageSize) + pageSize); i++)
    {
      if (i >= n) break;
      M5.Lcd.print(i + 1);
      String ssid = (WiFi.SSID(i).length() > ssidLength) ? (WiFi.SSID(i).substring(0, ssidLength) + "...") : WiFi.SSID(i);
      M5.Lcd.print(" " + ssid + " (" + WiFi.RSSI(i) + ")\n");
    }
    drawMenu();
  }
}

void search() {
  on = true;
  clearScreen();
  M5.Lcd.setTextSize(3);
  M5.Lcd.setCursor(50, 90);
  M5.Lcd.printf("Please, wait.");
  M5.Lcd.setCursor(50, 120);
  M5.Lcd.printf("Searching...");
  n = WiFi.scanNetworks();
  showRecords();
}

void loop()
{
  if (M5.BtnA.wasPressed()) showRecords(-1);
  if (M5.BtnB.wasPressed()) search();
  if (M5.BtnC.wasPressed()) showRecords(1);
  M5.update();
}

Осталось запустить пример и нажать на среднюю кнопку. Запустится сканирование точек доступа WiFi. Если точки доступа будут обнаружены, то информация о них будет выведена на экран с указанием имени и силы сигнала. Если число точек будет превышать 8 штук, то появится прокрутка вперёд и назад через кнопки A и C.

Дополнительные материалы

Реклама