You are on page 1of 13

Лекція 10.

WiFi пристрої на основі ESP8266


План.

1. Різновиди МК серії ESP і їх плат


2. Як працювати з ESP8266?
3. Режими роботи esp8266
4. Опис основних функцій бібліотеки.

ESP8266 —мікроконтролер (далі МК) від виробника Espressif з підтримкою WiFi -


інтерфейсу. Часто цей МК позиціонують тільки як WiFi -модуль, який працює в зв'язці з
іншими МК. Проте вбудованих можливостей МК серії ESP досить для реалізації великої
кількості проектів.

У більшості випадків цей МК застосовують в системах автоматизації побуту і IoT (Internet of


Things — Інтернеті речей). Управляти усім цим можна не лише з браузеру, але і з додатків на
Android/iOS/Desktop, хоча перший варіант має більше «кросплатформенності», т. до. зараз
браузер є майже на усьому — від годинника до телевізорів. Якщо МК застосовуватиметься
там, куди не дістає WiFi -мережа, або її там просто і не повинно бути (дачі, теплиці), то
ESP8266 може працювати в режимі точки доступу. У цього МК вже існує потужніший і
просунутий брат — ESP32.

У цього МК немає вбудованої flash -пам'яті, тому він працює із зовнішньою flash-пам'ятю по
інтерфейсу SPI. У більшості популярних версій МК її об'єм варіюється від 512 Кбайт до 4
Мбайт.

10.1 Різновиди МК серії ESP і їх плат


Існує близько півтора десятка версій МК серії ESP і величезна кількість плат з ними.
Розглянемо найпопулярніші з них.

ESP - 01

Мікроконтролер ESP - 01.

Вважається найпопулярнішим з серії. Має 8 контактів (VCC, GND, UTXD, URXD, CH_PD,
GPIO0, GPIO2, GPIO6) і PCB -антенну (друкований провідник на самій платі). З виводів тут є
присутніми тільки 3 GPIO, але не варто бачити в цьому одні мінуси. Якщо треба буде
управляти одним реле або отримувати дані з датчика температури, вам не знадобляться усі
виводи МК, досить буде лише пари. До того ж, існують плати і шилди з можливістю простої
комутації саме до цієї версії МК. Наприклад така:

Плата WiFi -реле. Плата ESP - 03.

В ESP-03 з'являється керамічна антена. Вона вважається трохи ефективніше за свого


друкованого побратима. Також на платі розведені усі доступні виводи GPIO. У цій статті
описана різниця між типами антен.

ESP - 07

Плата ESP - 07.

У цій версії у вічі відразу впадає металевий екран (який перед цим з'являється на ESP - 06).
На борту керамічна антена і роз'єм для зовнішньої антени.
ESP – 12

Різні варіанти мікроконтролера ESP - 12.

У свою чергу, існує декілька варіантів цієї версії : ESP - 12S, ESP - 12F, ESP - 12E. Друга і
третя версії мають на торці додаткові 6 розведених контактів.

Плати

WeMos D1 mini

Має розпайку дев'яти GPIO -контактів. На платі є досить відомий міст CH34x (такі часто
ставлять на клони Arduino). Встановлений МК з 4 Мбайт flash -пам'яті. Недолік для деяких
— доведеться самому паяти контакти на плату (йдуть в комплекті). Конструкційно сумісна з
різними шилдами реле/, що випускаються, датчиками.

NodeMCU v0.9/v1

Плата NodeMCU v0.9. Плата NodeMCU v3.


Перше покоління плат серії NodeMCU. На ній розпаяні усі 11 GPIO -портов. Деякі з них
мають додаткові функції (UART, I2C, SPI, PWM, ADC). Хоча на платі упаяні контакти, вона
займає усю ширину безпайної макетної плати, що утрудняє роботу на ній. МК має 4 Мбайт
flash -пам'яті. Також є міст CH340.

Фінальна версія плати цієї серії. Існує і v2 «Amica», яка менше по габаритах. v3 носить назву
«LoLin» і відрізняється від попередньої версії тільки розмірами і незначними деталями
(наприклад додатковою розпайкой шини живлення). Окрім традиційного моста
CH340/CH341 на плати ставлять чіп CP2102, так що уважніше з вибором драйвера на них.

Характеристики
Усі ці (і не лише ці) мікроконтролери виконані на чіпсеті ESP8266EX, а отже,
характеристики у них однакові:

• Протоколи: 802.11 b/g/n/e/i.


• Діапазон частот : 2.4 ГГц - 2.5 ГГц.
• Процесорне ядро: Tensilica L106 32 розряди.
• Діапазон напруги живлення : 2.5 В - 3.6 В.
• Середнє споживання струму : 80 мA.
• Режими WiFi : Station/SoftAP/SoftAP+Station.
• Безпека: WPA/WPA2.
• Шифрування: WEP/TKIP/AES.
• Оновлення прошивки : через UART, по радіоканалу (OTA — Other The Air).
• Мережеві протоколи: IPv4, TCP/UDP/HTTP/FTP.
• Підтримка WiFi Direct (P2P), P2P Discovery, P2P GO (Group Owner) mode, GC (Group
Client) mode, P2P Power Management.
• Вбудовані апаратні прискорювачі: CCMP (CBC - MAC, режим лічильника), TKIP
(MIC, RC4), WAPI (SMS4), WEP (RC4), CRC.
• Підтримка LUA -скриптів.

10.2 Як працювати з ESP8266?


Є два способи роботи з ним: управління через AT -команди і автономна робота зі своєю
прошивкою. У першому випадку ESP8266 працює тільки в парі з іншими МК, в другому —
може працювати незалежно (хоча ніхто не забороняє приєднати її до іншого МК).

«З коробки« МК поставляється з прошивкою для роботи через AT -команди. Для цього


ESP8266 підключається до будь-кого іншому МК по UART -інтерфейсу. Для демонстрації
роботи AT -команд ESP8266 можна підключити до комп'ютера через USB - UART
перехідник і запустити монітор послідовного порту (наприклад з Arduino IDE). Про те, як
працювати з цими командами, можна прочитати в цій статті.

Прошивка
У більшості випадків набагато зручніше прошивати МК і працювати з ним зі своєю
прошивкою. Проте тут теж є свої нюанси. Ось 3 варіанти подій :
• У вас «голий» ESP8266, наприклад ESP - 01. Вам знадобиться USB - UART
перехідник, який треба підключити до МК. Цей перехідник обов'язково має бути на
логіці 3-вольта, т. до. інакше можна легко зіпсувати.
• Другий випадок ідентичний першому, крім того, що замість перехідника можна
використати будь-яку плату Arduino. Досить спеціальним чином підключити ESP8266
до UART -контактам Arduino, а її саму «відключити», замкнувши контакт апаратного
скидання (RESET) на землю. Природно, живити ESP8266 треба буде від шини
живлення 3.3 В. В цьому випадку в якості перехідника USB - UART виступатиме міст
(частіше усього CH340) на самій платі Arduino. Цей процес також описаний в статті
вище.
• Кращий варіант — це плата з USB — UART мостом на борту (як NodeMCU, WeMos і
інші). В цьому випадку нічого додаткового робити не треба — просто підключайте
плату через USB.

У чому прошивається?
Існує декілька софтверів для прошивки МК. Наприклад NodeMCU Flasher (яка підходить не
лише для плат NodeMCU) або ESPTool (потрібний Python).

Проте в цій статті робота з МК і процес прошивки будуть розглянуті в Arduino IDE.

Спочатку середовище Arduino IDE не призначене для роботи з МК серії ESP. Щоб це
виправити, йдемо у Файл → Налаштування і в полі Додаткові посилання для Менеджера
плат вставляємо це посилання:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Потім відкриваємо Інструменти → Плата → Менеджер плат і в списку, що відкрився, в


самому низу знаходимо плату «esp 8266 by ESP8266 Community» (якщо з цим виникли
труднощі — використовуємо пошук вверху вікна). Встановлюємо останню версію плати
(близько 150 Мбайт).

Після установки в списку плат з'явиться чимала кількість плат. Якщо не знайшли свою плату
або не знаєте її назви — вибирайте Generic ESP8266 Module. Тепер можна вибрати свій МК в
списку COM -портов.

Тепер що стосується швидкості передачі. У ESP8266 дві швидкості передачі : основна — її


ви вказуєте при ініціалізації послідовного порту, і швидкість, на якій передається
налагоджувальна інформація. Вона передається відразу після подання живлення на МК.
Звичайно це швидкості 115200 бод і 74800 бод 0 відповідно.

Після скачування плати ESP8266 за допомогою менеджера, в прикладах з'явиться велика


кількість скетчів. Розглянемо один з них (Файл → Приклади → ESP8266WebServer →
HelloServer) :

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char* ssid = ".......".; // Вказуємо ім'я існуючої точки доступу


const char* password = ".......".; // Вказуємо пароль існуючої точки доступу

ESP8266WebServer server(80);

void handleRoot(){ // Обробник запиту клієнта за кореневою адресою


// Відправляємо клієнтові
server.send(200, "text/plain", "Привіт від ESP8266"!);
}

void handleNotFound(){ // Обробляємо досить відому помилку 404


String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod : ";
message += (server.method() == HTTP_GET)? "GET": "POST";
message += "\nArguments : ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}

void setup(void){
Serial.begin(115200);

WiFi.mode(WIFI_STA); // Встановлюємо Wi - Fi модуль в режим клієнта (STA)


WiFi.begin(ssid, password); // Встановлюємо ssid і пароль від мережі,
підключаємося

while (WiFi.status()!= WL_CONNECTED){ // Чекаємо підключення до Wi - Fi


delay(500);
Serial.print("".);
}

// Виводимо інформацію про підключення


Serial.println("");
Serial.print("Підключено до ");
Serial.println(ssid);
Serial.print("IP адреса: ");
Serial.println(WiFi.localIP());

// Встановлюємо обробники. Можна зробити двома способами:


server.on("/"handleRoot);

server.on("/inline", []() {
server.send(200, "text/plain", "Відмінна робота"!);
});

server.onNotFound(handleNotFound); // Викликається, коли обробник не


призначений

// Запускаємо сервер
server.begin();
Serial.println("HTTP-сервер запущений");
}

void loop(void){
server.handleClient();
}

Що робить цей скетч? МК підключається до вашій WiFi -мережі і запускає сервер. У монітор
послідовного порту виведеться локальний IP -адрес (приміром, 192.168.0.105). Забиваємо
цей IP в адресний рядок браузеру, після чого в нім повинен відобразитися рядок «Привіт від
ESP8266»!.

Розподіл пам'яті
Як вже говорилося — вбудованої пам'яті чіпсет не має, а тому використовується зовнішня —
від 512 Кбайт до 4 Мбайт. Ця пам'ять розподілена на наступні розділи:

• скетчі (пам'ять для прошивки);


• файлова система SPIFFS;
• OTA - Update (прошивка, передана «по повітрю»);
• EEPROM (так-так, її у МК теж немає, тому вона імітується на flash -пам'яті);
• конфігурація WiFi.

Файлова система SPIFFS

У зовнішній flash -пам'яті явно є свої «плюшки». Одна з них — файлова система. Як це не
дивно, в неї можна з легкістю записати файли (як на який-небудь накопичувач). На
апаратному рівні це можна було б реалізувати підключивши до МК модуль SD -карт. Проте
це рішення вимагає вільних портів (яких іноді може не бути). Тому SPIFFS є дуже корисним
в цьому плані.

Для чого? На МК часто заливаються веб-сторіночки, медіа-файли і інше. Якщо HTML -


сторінку в 20 рядків ще прийнятно зберігати в коді, то що робити з великими сайтами? При
кожній зміні міняти в коді? А із зображеннями як? Серіалізувати (буває і таке) і теж
вставляти в код? Ось в таких випадках і рятує файлова система.

Розмір файлової системи (від 32 Кбайт до 15 Мбайт) залежить від самого об'єму flash -пам'яті
і від конфігурації, виставленої в Інстурменти → Flash size. Наприклад, конфігурація 4M (2M
SPIFFS) призначена для МК із загальним об'ємом flash -пам'яті 4 Мбайт, 2 Мбайт з яких
будуть виділені під файлову систему.

SPIFFS не працює з теками — вона містить тільки список файлів. Відповідно, якщо
завантажити в неї теку style, в якій буде файл header.css, то у файлову систему систему
запишеться файл з ім'ям /style/header.css. Про це варто пам'ятати, тому що довжина
файлового імені не повинна перевищувати 31 символ (читається 32, але символ з кодом 0
відведений під завершення рядка). У цей 31 символ, природно, входять усі слэши, точки
перед розширенням і саме розширення. Тому доведеться утриматися від багаторівневих
структур і довгих імен файлів/тек.

Для завантаження файлів у файлову систему МК знадобиться інструмент ESP8266FS, який


інтегрується в Arduino IDE. Інструкція по установці:

1. Гойдаємо інструмент по посиланню вище.


2. У теці Arduino IDE створіть теку tools (якщо її там ще немає).
3. У теку tools розпакуйте викачаний архів. Повинно бути так:
4. …/Arduino/tools/ESP8266FS/tool/esp8266fs.jar.
5. Після запуску середовища в теці скетчу (Скетч → Показати теку скетчу) треба
створити теку data. Її вміст безпосередньо завантажуватиметься у файлову систему.
6. Після клікаємо в Інструменти → ESP8266 Sketch Data Upload, щоб завантажити дані
у файлову систему. Після успішного завантаження в панелі статусу висвітиться
«SPIFFS Image Uploaded». Перед процесом завантаження у файлову систему звернете
увагу: якщо відкритий монітор послідовного порту — закриваємо його.

Як працювати з SPIFFS і файлами в ній, можна дізнатися в цій статті.

Енергонезалежна пам'ять EEPROM


Вже згадувалося, що сам чіпсет не має енергонезалежної пам'яті, тому вона імітується через
зовнішню flash -память. Через це робота з нею трохи відрізняється від стандартної. Перед
прочитуванням або записом даних треба ініціалізувати EEPROM, вказавши пам'ять (від 4 до
4096 байт), що при цьому виділяється під неї, функцією EEPROM.begin(size). Звична
функція EEPROM.write(addr, value) записує дані не на саму енергонезалежну пам'ять,
а в оперативну. Щоб внесені дані записалися в пам'ять, потрібна функція
EEPROM.commit() (або ж EEPROM.end(), щоб заразом очистити дані з оперативної
пам'яті). Метод EEPROM.read(addr) повертає байт з пам'яті за адресою.

Прошивка «по повітрю» OTA - Update

ESP8266 має можливість оновлення прошивки по мережі WiFi. Це зручно, якщо МК


знаходиться у важкодоступному місці. Крім того, прошивки «по повітрю» найчастіше
швидше, ніж по дроту.

Вам знадобиться встановлений Python.

Потім в скетч треба додати файл: #include <ArduinoOTA.h>. Ініціалізували і настроюємо


OTA наступними рядками:

ArduinoOTA.setHostname("Host-ESP");// Ім'я хоста


ArduinoOTA.setPassword((const char *)"password");// Пароль для підключення до
хосту. Якщо не потрібний — коментуємо цей рядок
ArduinoOTA.begin();// Ініціалізація

Після цього досить в метод loop() додати рядок: ArduinoOTA.handle().

Прошиваємо МК по дроту. У разі успішного завантаження в списку портів з'явиться новий


хост з ім'ям «esp 8266 — xxxxxx», де esp8266 — вказане вище ім'я хоста, а xxxxxx — локальний
IP -адрес МК. Вибираємо його.

Тепер МК можна прошивати «по повітрю».

10.3 Режими роботи esp8266

Пристрої, що підключаються до WiFi -мережі, називаються станціями (STA).


Підключення до WiFi пропонує точка доступу (AP, що означає «access point»), яка служить
хабом для однієї або декількох станцій. Сама точка підключена до проводової мережі. Точка
доступу, як правило, інтегрована з роутером, що забезпечує доступ з WiFi-мережі до
інтернету. Кожна точка доступу має SSID (що означає «Service Set IDentifier», що можна
перевести як «ідентифікатор службового пристрою»), який являється, по суті, назвою мережі,
яку ви вибрали при підключенні пристрою (станції) до WiFi.

По-перше, ESP8266 може працювати станцією, тобто може підключатися до WiFi -


мереж. По-друге, ESP8266 також може працювати програмною точкою доступу (soft - AP), сам
стаючи WiFi -мережею, до якої можуть підключатися інші пристрої (станції). І по третє,
ESP8266 може працювати одночасно в режимах станції і програмної точки доступу. Це
дозволяє створювати, мережі з комірчастою топологією.
Рисунок 9.1

Бібліотека ESP8266WiFi містить великий набір функцій і властивостей мови C++,


використовуваних для налаштування і підтримки ESP8266 в режимі станції і/або програмної
точки доступу. Усі вони будуть описані нижче.

Режим станції

Режим станції (STA) використовується для підключення ESP8266 до WiFi-мережі, яку


роздає деяка точка доступу.

Цей клас оснащений декількома функціями для управління WiFi -соединением. Якщо
з'єднання буде втрачено, ESP8266 автоматично перепідключиться до робочої точки доступу,
коли вона знову буде доступна. Те ж саме відбувається і після перезавантаження модуля. Це
можливо завдяки тому, що ESP зберігає дані про останню робочу точку доступу в flash –
пам’яті, яка при відключенні живлення не стирається. Крім того, збереження даних також
дозволяє ESP8266 перепідключитися до мережі, якщо ви завантажили інший скетч, але WiFi -
мережа і пароль до неї залишилися тими ж.

Рисунок 9.2

Режим програмної точки доступу

Точка доступу (AP) - цей пристрій, який забезпечує доступ до WiFi - мережі для інших
пристроїв (станцій), а потім підключає їх до дротяної мережі. ESP8266 теж може працювати в
режимі точки доступу, але за тим виключенням, що у нього немає інтерфейсу для підключення
до дротяної мережі. Такий режим називають «програмною точкою доступу» або soft - AP.
Максимальна кількість станцій, які можуть бути підключені до ESP8266 в режимі програмної
точки доступу, - п'ять.

Рисунок 9.3

Цей режим часто використовується як проміжний крок для підключення ESP8266 до


WiFi- мережі в стаціонарному режимі - за ситуації, коли ESP8266 не знає SSID і пароль до
мережі. В цьому випадку ESP8266 спочатку завантажується в режимі точки доступу, щоб ми
могли підключитися до нього за допомогою ноутбука або смартфону, а потім задати SSID і
пароль. Після цього ESP8266 перемикається в режим станції і може під'єднатися до заданої
WiFi- мережі.

Ще один варіант використання режиму програмної точки доступу - це мережі з


комірчастою топологією. ESP8266 може бути і станцією, і точкою доступу, завдяки чому може
виступати вузлом такої мережі.

Сканування

Щоб підключити мобільний телефон до точки доступу, ви, як правило, відкриваєте


меню WiFi -налаштувань, бачите список доступних WiFi -мереж, а потім вибираєте ту, до якої
хочете підключитися. Далі ви вводите пароль (чи не вводите, якщо мережа відкрита) і усе - ви
в мережі. Те ж саме можна робити і за допомогою ESP8266. Функціонал для сканування і
виведення списку доступних мереж реалізований саме в цьому класі - класі для сканування.

Клієнт

Цей клас створює клієнтів, здатних отримати доступ до сервісів, що надаються


серверами. Підключившись до сервера, клієнт може передавати/отримувати від нього дані, а
також дістає доступ до функціонала, який надає сервер (наприклад, до обробки даних).
Рисунок 9.4

Захищений клієнт

Цей клас - розширення класу клієнта. У нім підключення і обмін даними з серверами
здійснюється за допомогою захисного протоколу TLS. Версія TLS 1.1 підтримується, версія
TLS 1.2 не підтримується.

Рисунок 9.5

Деякі проекти забезпечені додатковими пам'яттю і обчислювальними ресурсами,


необхідними для роботи криптографічних алгоритмів. Чим сильніше ключ сертифікату, тим
більше треба «надбавки». На практиці запустити одночасно більше одного захищеного клієнта
неможливо. Проблема в RAM -памяти, яку ми додати не можемо, а розмір flash -памяти
проблемою, як правило, не являється. Якщо вам цікаво, як розроблявся клас захищеного
клієнта, доступ до яких серверів тестувався і як розробникам вдалося обійти обмеження
пам'яті, то про це можна почитати в цьому звіті про проблеми.

Сервер

Цей клас створює сервери, що надають функціонал іншим програмам на пристроях,


що іменуються клієнтами.
Рисунок 9.6

Клієнти підключаються до серверів, щоб отримувати/відправляти їм дані, а також щоб


отримати доступ до функціонала, який пропонують ці сервери.

UDP

Цей клас дозволяє відправляти і отримувати UDP-повідомлення (від «user datagram


protocol», що означає «протокол призначених для користувача датаграм»). Протокол UDP
використовує дуже простий принцип, який можна описати як «відправив і забув». Він не
гарантує стовідсоткову доставку, правильний порядок присланих повідомлень і захист від
дублікатів. Для забезпечення цілісності даних в UDP використовується контрольна сума.
Також підтримуються номери портів - для звернення до різних функцій в пункті призначення.

Generic

У бібліотеці ESP8266WiFi є декілька функцій з SDK ESP8266, яких немає в


оригінальній WiFi -библиотеці для IDE Arduino. Якщо функція з SDK не підходить ні до
одного з класів, описаних вище, то вона, швидше за все, відноситься до класу Generic. Серед
них, приміром, обробник для управління WiFi-подіями на зразок підключення, відключення,
отримання IP -адреси і зміни WiFi -режиму, а також функції для управління сплячим режимом
ESP8266, перетворення імені хоста в IP -адрес і так далі.

Опис класів

Бібліотека ESP8266WiFi розбита на декілька класів. Як правило, при написанні коду


програмістові ця класифікація не потрібна. Ми скористаємося нею, щоб розбити опис
бібліотеки на окремі шматочки - для зручності сприйняття.
10.4 Опис основних функцій бібліотеки.
Функції бібліотеки WiFi ESP8266 дуже схожі з функціями бібліотеки для звичайного
WiFi шилда.

Основні з них:

WiFiServer() - створює сервер, який прослуховує підключення, що входять, по


вказаному порту. Синтаксис: server(port)

begin() - наказує серверу почати прослуховування підключень, що входять.


Синтаксис: server.begin()

available() - виловлює клієнта, що підключеного до сервера і має дані, доступні для


прочитування. З'єднання зберігається, навіть якщо клієнт зник з поля зору. Проте з'єднання
завжди можна закрити викликом функції client.stop(). Повертає об'єкт Client. Якщо у клієнта
немає даних, доступних для прочитування, то в операторові if (див. приклад нижче), повернене
значення. Синтаксис: server.available()

write() - Записує дані на усі клієнти, підключені до сервера. Синтаксис:


server.write(data). Параметри: data - значення, які треба записати. Тип даних - byte або char.

print() - Виводить дані на монітор порту у усіх клієнтів, підключених до сервера.


Числа відображаються у вигляді послідовності цифр, кожна з яких являється ASCII -символом.
Приміром, число «123» буде відправлено, як три символи - «1», «2» і «3». Синтаксис:
server.print(data) або server.print(data, BASE). Параметри: data - дані, які треба вивести. Типи
даних - char, byte, int, long і string; BASE - система числення (опционально). BIN - для
двійкової, DEC - для десяткової, OCT - для вісімкової, HEX - для шістнадцятиричної. Повертає
кількість виведених байтів (тип даних - byte). Прочитувати це необов'язково.

println() - аналогічно print(), від функції print() відрізняється тим, що після даних, що
виводяться, повинен стояти символ нового рядка.

Функції, які вдрізняються від стандартного шилда:

• WiFi.mode(m) : вибрати режим WIFI_AP (точка доступу), WIFI_STA (клієнт),


або WIFI_AP_STA (обидва режими одночасно).
• WiFi.softAP(ssid) створює відкриту точку доступу
• WiFi.softAP(ssid, password) створює точку доступу з WPA2 - PSK шифруванням,
пароль має бути не менше 8 символів
• WiFi.macAddress(mac) дозволяє отримати MAC адреса в режимі клієнта
• WiFi.softAPmacAddress(mac) дозволяє отримати MAC адреса в режимі точки
доступу
• WiFi.localIP() дозволяє отримати IP адреса в режимі клієнта
• WiFi.softAPIP() дозволяє отримати IP адреса в режимі точки доступу
• WiFi.RSSI() доки не реалізована
• WiFi.printDiag(Serial); виводить діагностичну інформацію

You might also like