Добавить в корзинуПозвонить
Найти в Дзене

От мигающего светодиода к умному гаджету: Подключаем ESP32 к Wi-Fi с выводом на дисплей 128х64.

Привет! Если ты уже наигрался с мигающими светодиодами на Ардуино и ESP32 и хочешь сделать что-то по-настоящему полезное, этот материал для тебя. Сегодня мы создадим умное устройство с большими перспективами, которое подключается к Wi-Fi, показывает статус соединения на красивом OLED-дисплее и даже измеряет уровень сигнала. Устройство, которое: Как известно самое сложное в электронной самоделке это корпус, мы в моей молодости из чего только не делали корпуса, оргстекло, текстолит, дерево, получалось не очень, мягко говоря. Хорошо что сейчас с появлением 3д печати всё изменилось, сегодня я буду использовать ESP32 Mini вот в таком корпусе с дисплеем Такой корпус можно найти на озоне Подключение дисплея к ESP32 Mini для нашего проекта. ESP32-SuperMini → SSD1306
3.3V → VCC
GND → GND
GPIO8 → SDA
GPIO9 → SCL Это устройство ничего полезного не делает, показывает технические характеристики процессора, список доступных сетей и подключается к нашей домашнеё сети. В дальнейшем мы найдём ему б
Оглавление

Привет! Если ты уже наигрался с мигающими светодиодами на Ардуино и ESP32 и хочешь сделать что-то по-настоящему полезное, этот материал для тебя. Сегодня мы создадим умное устройство с большими перспективами, которое подключается к Wi-Fi, показывает статус соединения на красивом OLED-дисплее и даже измеряет уровень сигнала.

Что у нас получится

Устройство, которое:

  • 📶 Находит все доступные Wi-Fi сети
  • 📊 Показывает уровень сигнала твоей сети
  • 🔄 Отслеживает процесс подключения в реальном времени
  • 📟 Выводит всю информацию на дисплей
  • 🖥️ Показывает технические характеристики процессора

Нам понадобится

  • ESP32-SuperMini (или любая другая плата на ESP32)
  • OLED-дисплей SSD1306 128×64 (I2C)
  • Макетная плата и провода
  • USB-кабель для программирования

Как известно самое сложное в электронной самоделке это корпус, мы в моей молодости из чего только не делали корпуса, оргстекло, текстолит, дерево, получалось не очень, мягко говоря. Хорошо что сейчас с появлением 3д печати всё изменилось, сегодня я буду использовать ESP32 Mini вот в таком корпусе с дисплеем

Такой корпус можно найти на озоне

Подключение дисплея к ESP32 Mini для нашего проекта.

сборка в корпусе esp32 и oled дисплея
сборка в корпусе esp32 и oled дисплея
корпус для OLED 128*64 + ESP32 mini
корпус для OLED 128*64 + ESP32 mini
ESP32-SuperMini → SSD1306
3.3V → VCC
GND → GND
GPIO8 → SDA
GPIO9 → SCL
подключение ESP32 к WIFI с выводом на дисплей
подключение ESP32 к WIFI с выводом на дисплей

Это устройство ничего полезного не делает, показывает технические характеристики процессора, список доступных сетей и подключается к нашей домашнеё сети. В дальнейшем мы найдём ему более интересные применения. Думаю нет смысла описывать процесс установки ардуино и библиотеки 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();
}

Что здесь происходит:

  1. setCursor(0, line) — устанавливаем курсор в начало нужной строки
  2. print(" ") — очищаем строку пробелами
  3. print(text) — выводим новый текст
  4. 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);
}

Возможные проблемы и решения

  1. Сеть не находится — проверь правильность SSID, учитывай регистр
  2. Не подключается — убедись, что пароль правильный, попробуй подойти ближе к роутеру
  3. Дисплей не работает — проверь подключение SDA/SCL, адрес обычно 0x3C

Что дальше?

Этот проект — только начало! На его основе можно создать:

  • 📡 Wi-Fi сканер для анализа загруженности эфира
  • 🔔 Уведомитель о пропаже интернета
  • 📶 Монитор качества сигнала в реальном времени
  • 🌐 Веб-интерфейс для управления устройством

Ставь лайк, если было полезно! В комментариях пиши, что получилось, а с чем возникли трудности. В следующей статье сделаем отправку данных в интернет и создадим собственный веб-интерфейс!

P.S. Не забудь подписаться — впереди много интересного про ESP32, IoT и умные устройства!