Привет! Если ты уже наигрался с мигающими светодиодами на Ардуино и ESP32 и хочешь сделать что-то по-настоящему полезное, этот материал для тебя. Сегодня мы создадим умное устройство с большими перспективами, которое подключается к Wi-Fi, показывает статус соединения на красивом OLED-дисплее и даже измеряет уровень сигнала.
Что у нас получится
Устройство, которое:
- 📶 Находит все доступные Wi-Fi сети
- 📊 Показывает уровень сигнала твоей сети
- 🔄 Отслеживает процесс подключения в реальном времени
- 📟 Выводит всю информацию на дисплей
- 🖥️ Показывает технические характеристики процессора
Нам понадобится
- ESP32-SuperMini (или любая другая плата на ESP32)
- OLED-дисплей SSD1306 128×64 (I2C)
- Макетная плата и провода
- USB-кабель для программирования
Как известно самое сложное в электронной самоделке это корпус, мы в моей молодости из чего только не делали корпуса, оргстекло, текстолит, дерево, получалось не очень, мягко говоря. Хорошо что сейчас с появлением 3д печати всё изменилось, сегодня я буду использовать ESP32 Mini вот в таком корпусе с дисплеем
Такой корпус можно найти на озоне
Подключение дисплея к ESP32 Mini для нашего проекта.
ESP32-SuperMini → SSD1306
3.3V → VCC
GND → GND
GPIO8 → SDA
GPIO9 → SCL
Это устройство ничего полезного не делает, показывает технические характеристики процессора, список доступных сетей и подключается к нашей домашнеё сети. В дальнейшем мы найдём ему более интересные применения. Думаю нет смысла описывать процесс установки ардуино и библиотеки GyverOLED так как этого уже полно в интернете, начнём сразу с самого интересного, с кода.
Волшебство кода: разбираем по косточкам
А теперь самое интересное — посмотрим, как работает программа. Я буду объяснять каждый значимый фрагмент. Внизу статьи есть полный код, а пока пройдёмся по его кусочкам.
#include <GyverOLED.h>
#include <WiFi.h>
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
- GyverOLED — библиотека для работы с дисплеем (удобнее стандартной)
- WiFi.h — встроенная библиотека для Wi-Fi подключения
- Создаем объект oled для управления дисплеем
Вспомогательная функция для дисплея
void showScreen(int line, const String& text) {
oled.setCursor(0, line);
oled.print(" "); // Очистка строки
oled.setCursor(0, line);
oled.print(text);
oled.update();
}
Что здесь происходит:
- setCursor(0, line) — устанавливаем курсор в начало нужной строки
- print(" ") — очищаем строку пробелами
- print(text) — выводим новый текст
- update() — обновляем дисплей
Зачем это нужно: Без очистки старый текст мог бы накладываться на новый, создавая "кашу" на экране.
Показываем технические характеристики
void setup() {
oled.init();
oled.setContrast(255);
oled.clear();
oled.setScale(1);
oled.home();
oled.println("ESP32 Frequency");
oled.print("CPU: ");
oled.print(getCpuFrequencyMhz());
oled.println(" MHz");
- getCpuFrequencyMhz() — функция возвращает реальную частоту процессора
- getXtalFrequencyMhz() — частота кварцевого резонатора
- getApbFrequency() — частота шины периферии
Интересный факт: ESP32 может динамически менять частоту для экономии энергии!
Ищем Wi-Fi сети
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(500);
int n = WiFi.scanNetworks();
- WIFI_STA — режим станции (клиента), подключаемся к роутеру
- WiFi.disconnect() — отключаемся от предыдущих соединений
- WiFi.scanNetworks() — сканируем эфир и возвращаем количество найденных сетей
Простыми словами: ESP32 "прослушивает" эфир и составляет список всех видимых сетей.
Проверяем, видит ли ESP32 нашу сеть
for (int i = 0; i < n; i++) {
if (WiFi.SSID(i) == ssid) {
ourNetworkFound = true;
ourNetworkRSSI = WiFi.RSSI(i);
break;
}
}
- WiFi.SSID(i) — возвращает название i-й сети
- WiFi.RSSI(i) — уровень сигнала в dBm (децибел-милливатт)
Что такое RSSI:
- -30 dBm — отличный сигнал (рядом с роутером)
- -50 dBm — хороший сигнал
- -70 dBm — средний сигнал
- -90 dBm — плохой сигнал
Подключаемся к сети включив максимальную мощность нередатчика ESP32
WiFi.setTxPower(WIFI_POWER_19_5dBm); // Максимальная мощность
WiFi.setSleep(false); // Отключить энергосбережение
WiFi.begin(ssid, password);
- setTxPower() — устанавливаем максимальную мощность передатчика
- setSleep(false) — отключаем спящий режим для стабильности соединения
- begin() — начинаем процесс подключения
Важно: При слабом сигнале эти настройки могут решить проблему подключения!
Отслеживаем процесс подключения
while (millis() - startTime < 30000) {
int status = WiFi.status();
switch(status) {
case WL_CONNECTED:
showScreen(3, "Состояние: ПОДКЛЮЧЕНО!");
connected = true;
break;
// ... другие статусы
}
}
Статусы подключения:
- WL_IDLE_STATUS — подготовка к подключению
- WL_NO_SSID_AVAIL — сеть не найдена
- WL_CONNECT_FAILED — ошибка пароля
- WL_CONNECTED — успешное подключение ✅
Показываем результат
if (WiFi.status() == WL_CONNECTED) {
showScreen(0, "УСПЕШНО !!!");
showScreen(1, "IP: " + WiFi.localIP().toString());
showScreen(2, "Сигнал: " + String(WiFi.RSSI()) + " dBm");
}
- WiFi.localIP() — получаем IP-адрес, выданный роутером
- WiFi.RSSI() — текущий уровень сигнала подключенной сети
Полный код проекта
#include <GyverOLED.h>
#include <WiFi.h>
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
const char* ssid = "ВАШ_WIFI_SSID";
const char* password = "ВАШ_ПАРОЛЬ";
void showScreen(int line, const String& text) {
oled.setCursor(0, line);
oled.print(" ");
oled.setCursor(0, line);
oled.print(text);
oled.update();
}
void setup() {
oled.init();
oled.setContrast(255);
oled.clear();
oled.setScale(1);
// Показываем частоту процессора
oled.home();
oled.println("ESP32 Frequency");
oled.print("CPU: "); oled.print(getCpuFrequencyMhz()); oled.println(" MHz");
oled.print("XTAL: "); oled.print(getXtalFrequencyMhz()); oled.println(" MHz");
oled.update();
delay(2000);
// Сканируем Wi-Fi сети
showScreen(0, "Сканирование WiFi...");
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(500);
int n = WiFi.scanNetworks();
oled.clear();
if (n == 0) {
showScreen(0, "Сети не найдены!");
while(1) delay(1000);
}
// Ищем нашу сеть
bool ourNetworkFound = false;
int ourNetworkRSSI = 0;
for (int i = 0; i < n; i++) {
if (WiFi.SSID(i) == ssid) {
ourNetworkFound = true;
ourNetworkRSSI = WiFi.RSSI(i);
break;
}
}
if (ourNetworkFound) {
showScreen(0, "Найдено сетей: " + String(n));
showScreen(1, "Наша сеть: ЕСТЬ");
showScreen(2, "Сигнал: " + String(ourNetworkRSSI) + " dBm");
} else {
showScreen(1, "Наша сеть: НЕТ!");
showScreen(2, "Проверь имя сети");
while(1) delay(1000);
}
delay(3000);
// Подключаемся к Wi-Fi
oled.clear();
showScreen(0, "Подключение...");
showScreen(1, "Сеть: " + String(ssid));
WiFi.setTxPower(WIFI_POWER_19_5dBm);
WiFi.setSleep(false);
WiFi.begin(ssid, password);
// Ждем подключения
unsigned long startTime = millis();
bool connected = false;
int lastStatus = -1;
while (millis() - startTime < 30000) {
int status = WiFi.status();
if (status != lastStatus) {
lastStatus = status;
showScreen(2, "Статус: " + String(status));
switch(status) {
case WL_IDLE_STATUS: showScreen(3, "IDLE"); break;
case WL_NO_SSID_AVAIL: showScreen(3, "Сеть не найдена"); break;
case WL_CONNECT_FAILED: showScreen(3, "Ошибка пароля"); break;
case WL_CONNECTED:
showScreen(3, "ПОДКЛЮЧЕНО!");
connected = true;
break;
case WL_DISCONNECTED: showScreen(3, "Отключено"); break;
}
}
if (connected) break;
delay(1000);
}
// Показываем результат
oled.clear();
if (WiFi.status() == WL_CONNECTED) {
showScreen(0, "УСПЕШНО !!!");
showScreen(1, "IP: " + WiFi.localIP().toString());
showScreen(2, "Сигнал: " + String(WiFi.RSSI()) + " dBm");
} else {
showScreen(0, "ОШИБКА!");
showScreen(1, "Статус: " + String(WiFi.status()));
}
}
void loop() {
delay(1000);
}
Возможные проблемы и решения
- Сеть не находится — проверь правильность SSID, учитывай регистр
- Не подключается — убедись, что пароль правильный, попробуй подойти ближе к роутеру
- Дисплей не работает — проверь подключение SDA/SCL, адрес обычно 0x3C
Что дальше?
Этот проект — только начало! На его основе можно создать:
- 📡 Wi-Fi сканер для анализа загруженности эфира
- 🔔 Уведомитель о пропаже интернета
- 📶 Монитор качества сигнала в реальном времени
- 🌐 Веб-интерфейс для управления устройством
Ставь лайк, если было полезно! В комментариях пиши, что получилось, а с чем возникли трудности. В следующей статье сделаем отправку данных в интернет и создадим собственный веб-интерфейс!
P.S. Не забудь подписаться — впереди много интересного про ESP32, IoT и умные устройства!