RisalDash RisalDash

Гайд · ESP32 · Советы

5 вещей, что твой ESP32 уже умеет

Большинство использует ESP32 как маленький Arduino с Wi-Fi и до остального не добирается. А в чипе уже встроены пять мощных возможностей — без доп-железа и без поиска библиотек. Вот что это, зачем оно нужно и готовый пример кода для каждой из пяти.

ESP32ESP-NOWГлубокий сонOTAPWM
Пять скрытых возможностей ESP32: ESP-NOW, touch GPIO, глубокий сон, OTA и PWM
Все пять уже внутри чипа — надо лишь включить.

1. ESP-NOW — говори с другим ESP32 без роутера

ESP-NOW позволяет двум (или многим) ESP-платам обмениваться маленькими пакетами напрямую, без Wi-Fi-роутера и без интернета — только по MAC-адресам. Быстро (~1 мс), энергоэффективно, идеально для пультов, сенсорных нод и связи робот-робот. Едет на Wi-Fi-радио, но минует весь стек TCP/IP; где оно рядом с Wi-Fi и BLE — в гайде по протоколам.

ESP-NOW: ESP32-отправитель говорит напрямую с ESP32-приёмником, без Wi-Fi-роутера
#include <esp_now.h>
#include <WiFi.h>

uint8_t peer[] = {0x24, 0x6F, 0x28, 0xAA, 0xBB, 0xCC};  // MAC приёмника
typedef struct { int id; float temp; } Msg;
Msg data;

void setup() {
  WiFi.mode(WIFI_STA);
  esp_now_init();
  esp_now_peer_info_t p = {};
  memcpy(p.peer_addr, peer, 6);
  esp_now_add_peer(&p);
}

void loop() {
  data.id = 1; data.temp = 24.5;
  esp_now_send(peer, (uint8_t *)&data, sizeof(data));  // без роутера, ~1 мс
  delay(2000);
}

2. Ёмкостный touch — любая площадка становится кнопкой

У классического ESP32 10 touch-совместимых GPIO. Подведи пин к площадке из меди, фольги или шляпке винта — и touchRead() вернёт число, что падает, когда палец рядом — без кнопки, без доп-чипа. Отлично для стильных панелей, скрытых органов управления и пробуждения по касанию. (У S2/S3 touch-API немного другой; классический ESP32 использует touchRead(T0..T9).)

Ёмкостный touch: touchRead падает с ~72 до ~18 при касании площадки
void setup() {
  Serial.begin(115200);
}

void loop() {
  int v = touchRead(T0);            // T0 = GPIO4 на классическом ESP32
  if (v < 40) Serial.println("touched!");   // меньше = палец рядом
  delay(100);
}

3. Глубокий сон — месяцы работы от батареи

Между всплесками работы ESP32 может уйти в глубокий сон на ~10 мкА и проснуться по таймеру или пину. Это разница между батарейной нодой на день и на год. Загвоздка: при пробуждении чип перезагружается и setup() выполняется заново, так что состояние храни в RTC-памяти. Подробно — в гайде по глубокому сну.

Ток глубокого сна во времени: короткие всплески активности, длинные провалы сна
#define uS_PER_S 1000000ULL

void setup() {
  Serial.begin(115200);
  Serial.println("проснулись — сделали дело, спим");
  // ... читаем датчик, отправляем ...
  esp_sleep_enable_timer_wakeup(10 * uS_PER_S);  // проснуться через 10 с
  esp_deep_sleep_start();                        // ~10 мкА до пробуждения
}

void loop() {}   // не выполняется — при каждом пробуждении заново setup()

4. OTA — обновляй прошивку по воздуху

Когда плата уже на стене, не хочется выдёргивать её ради перепрошивки. OTA заливает новую прошивку по Wi-Fi: добавь пару строк — и в Arduino IDE появится сетевой порт. Обязательно для развёрнутых устройств — а если хочешь совсем в одну строку, дашборд RisalDash даёт кнопку «Обновить прошивку» через dash.enableOTA().

OTA: ПК заливает .bin по Wi-Fi на ESP32 на стене, без USB
#include <WiFi.h>
#include <ArduinoOTA.h>

void setup() {
  WiFi.begin("your-ssid", "your-pass");
  while (WiFi.status() != WL_CONNECTED) delay(300);
  ArduinoOTA.begin();          // теперь плату можно прошивать по Wi-Fi
}

void loop() {
  ArduinoOTA.handle();         // сетевой порт появится в IDE
}

5. PWM (почти) на любом пине — яркость, скорость, серво

Периферия LEDC у ESP32 генерирует аппаратный PWM почти на любом GPIO — диммируй LED, задавай скорость мотора или позицию серво, всё без блокировки CPU. Выбираешь пин, частоту и разрешение, затем просто пишешь значение duty. В Arduino-ESP32 core 3.x это аккуратный API ledcAttach() ниже (в старом 2.x был ledcSetup() + ledcAttachPin()).

Скважность PWM и яркость LED: 0%, 50% и 100%
void setup() {
  ledcAttach(18, 5000, 8);     // пин 18, 5 кГц, 8 бит (0..255)  [core 3.x]
}

void loop() {
  for (int d = 0; d <= 255; d++) { ledcWrite(18, d); delay(4); }  // разгар
  for (int d = 255; d >= 0; d--) { ledcWrite(18, d); delay(4); }  // затухание
}

Собери всё вместе

Ничего из этого не требует шилда или списка покупок — это кремний, что у тебя уже есть. Батарейный датчик, который просыпается по касанию, читает, шлёт значение по ESP-NOW и уходит обратно в глубокий сон — обновляемый в поле по OTA, со статусным PWM-светодиодом — это пять «скрытых» фич и ноль лишних деталей. В этом и суть: твой ESP32 умеет куда больше, чем мигать.

Нужен UI сверху? Полный живой дашборд — с OTA внутри — в пару строк C++.