ESP32 WROOM DevKit v1: распиновка, схема подключения и программирование
ESP32 DevKit — это универсальная платформа для разработки IoT-решений.
Программирование на C++
Для начала работы с платформой ESP32 DevKit на языке C++ скачайте и установите на компьютер интегрированную среду разработки Arduino IDE.
По умолчанию среда IDE настроена только на AVR-платы. Для платформы ESP32 DevKit добавьте в менеджере плат поддержку платформ на модуле ESP32.
Выберите платформу ESP32 DevKit: Инструменты → Плата → DOIT ESP32 DEVKIT V1.
После выполненных действий плата ESP32 DevKit готова к программированию через Arduino IDE.
Подробности о функциях и методах работы ESP32 на языке C++ читайте на ESP32 Arduino Core.
Примеры работы для Arduino
ESP32 может подключиться к Wi-Fi сети, создать собственную точку доступа, представляться сервером и клиентом, формировать GET и POST запросы. Также микроконтроллер имеет два АЦП и датчик Хола.
Пример WebClient
GET-запрос по URL-адресу в Интернете.
webClient.ino
// библиотека для работы с HTTP-протоколом
#include <HTTPClient.h>
// вводим имя и пароль точки доступа
const char* ssid = "WIFINAME";
const char* password = "WIFIPASSWORD";
void setup() {
// иницилизируем монитор порта
Serial.begin(115200);
// запас времени на открытие монитора порта — 5 секунд
delay(5000);
// подключаемся к Wi-Fi сети
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to Wi-Fi..");
}
Serial.println("Connected to the Wi-Fi network");
}
void loop() {
// выполняем проверку подключения к беспроводной сети
if ((WiFi.status() == WL_CONNECTED)) {
// создаем объект для работы с HTTP
HTTPClient http;
// подключаемся к тестовому серверу с помощью HTTP
http.begin("http://httpbin.org/");
// делаем GET запрос
int httpCode = http.GET();
// проверяем успешность запроса
if (httpCode > 0) {
// выводим ответ сервера
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
}
else {
Serial.println("Error on HTTP request");
}
// освобождаем ресурсы микроконтроллера
http.end();
}
delay(10000);
}
После подключения к Wi-Fi микроконтроллер напишет в COM порт ответ от сервера.
Пример Analog WebServer
ESP32 имеет 15 аналоговых пинов. Выведем через веб-интерфейс значения с 36, 39 и 34 пина.
analogWebServer.ino
// подключяем библиотеку для работы с Wi-Fi server
#include <WiFi.h>
// вводим имя и пароль точки доступа
const char* ssid = "WIFINAME";
const char* password = "WIFIPASSWORD";
// инициализируем сервер на 80 порте
WiFiServer server(80);
// заводим буфер и счетчик для буфера
char lineBuf[80];
int charCount = 0;
void setup() {
// инициализируем монитор порта
Serial.begin(115200);
// запас времени на открытие монитора порта — 5 секунд
delay(5000);
// инициализируем аналоговые пины
pinMode(36, INPUT);
pinMode(39, INPUT);
pinMode(34, INPUT);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
// подключаем микроконтроллер к Wi-Fi сети
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Wi-Fi connected");
Serial.println("IP-address: ");
Serial.println(WiFi.localIP());
// запускаем сервер
server.begin();
}
void loop() {
// анализируем канал связи на наличие входящих клиентов
WiFiClient client = server.available();
if (client) {
Serial.println("New client");
memset(lineBuf, 0, sizeof(lineBuf));
charCount = 0;
// HTTP-запрос заканчивается пустой строкой
boolean currentLineIsBlank = true;
while (client.connected()) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// формируем веб-страницу
String webPage = "<!DOCTYPE HTML>";
webPage += "<html>";
webPage += " <head>";
webPage += " <meta name=\"viewport\" content=\"width=device-width,";
webPage += " initial-scale=1\">";
webPage += " </head>";
webPage += " <h1>ESP32 - Web Server</h1>";
webPage += " <p>";
webPage += " AnalogPin 36 = ";
webPage += analogRead(36);
webPage += " <br>";
webPage += " AnalogPin 39 = ";
webPage += analogRead(39);
webPage += " <br>";
webPage += " AnalogPin 34 = ";
webPage += analogRead(34);
webPage += " <br>";
webPage += " </p>";
webPage += "</html>";
client.println(webPage);
break;
}
// даем веб-браузеру время для получения данных
delay(1);
// закрываем соединение
client.stop();
Serial.println("client disconnected");
}
}
Когда микроконтроллер подключится к Wi-Fi сети, в монитор порта будет выведен IP-адрес веб-страницы с данными. Получить к ней доступ можно из локальной сети, перейдя по указанному IP-адресу.
Скопируйте IP-адрес из монитора порта и вставьте в адресную строку браузера. Если вы подключены к той же локальной сети, что и ESP32, то вы увидите веб-интерфейс.
Пример blink WebServer
Создадим WEB-сервер на порту 80. С помощью веб-интерфейса будем мигать светодиодами на 16 и 17 пинах.
blinkWebServer.ino
// подключяем библиотеку для работы с Wi-Fi server
#include <WiFi.h>
// указываем пины, к которым подключены светодиоды
#define LED_GREEN 16
#define LED_RED 17
// вводим имя и пароль точки доступа
const char* ssid = "WIFINAME";
const char* password = "WIFIPASSWORD";
// инициализируем сервер на 80 порте
WiFiServer server(80);
// создаем буфер и счетчик для буфера
char lineBuf[80];
int charCount = 0;
void setup() {
// запас времени на открытие монитора порта — 5 секунд
delay(5000);
// инициализируем контакты для светодиодов
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
// инициализируем монитор порта
Serial.begin(115200);
// подключаемся к Wi-Fi сети
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Wi-Fi connected");
Serial.println("IP-address: ");
// пишем IP-адрес в монитор порта
Serial.println(WiFi.localIP());
server.begin();
}
void loop() {
// анализируем канал связи на наличие входящих клиентов
WiFiClient client = server.available();
if (client) {
Serial.println("New client");
memset(lineBuf, 0, sizeof(lineBuf));
charCount = 0;
// HTTP-запрос заканчивается пустой строкой
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// считываем HTTP-запрос
lineBuf[charCount] = c;
if (charCount < sizeof(lineBuf) - 1) {
charCount++;
}
// на символ конца строки отправляем ответ
if (c == '\n' && currentLineIsBlank) {
// отправляем стандартный заголовок HTTP-ответа
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
// тип контента: text/html
client.println("Connection: close");
// после отправки ответа связь будет отключена
client.println();
// формируем веб-страницу
String webPage = "<!DOCTYPE HTML>";
webPage +="<html>";
webPage +=" <head>";
webPage +=" <meta name=\"viewport\" content=\"width=device-width,";
webPage +=" initial-scale=1\">";
webPage +=" </head>";
webPage +=" <h1>ESP32 - Web Server</h1>";
webPage +=" <p>LED #1";
webPage +=" <a href=\"on1\">";
webPage +=" <button>ON</button>";
webPage +=" </a> ";
webPage +=" <a href=\"off1\">";
webPage +=" <button>OFF</button>";
webPage +=" </a>";
webPage +=" </p>";
webPage +=" <p>LED #2";
webPage +=" <a href=\"on2\">";
webPage +=" <button>ON</button>";
webPage +=" </a> ";
webPage +=" <a href=\"off2\">";
webPage +=" <button>OFF</button>";
webPage +=" </a>";
webPage +=" </p>";
webPage +="</html>";
client.println(webPage);
break;
}
if (c == '\n') {
// анализируем буфер на наличие запросов
// если есть запрос, меняем состояние светодиода
currentLineIsBlank = true;
if (strstr(lineBuf, "GET /on1") > 0) {
Serial.println("LED 1 ON");
digitalWrite(LED_GREEN, HIGH);
} else if (strstr(lineBuf, "GET /off1") > 0) {
Serial.println("LED 1 OFF");
digitalWrite(LED_GREEN, LOW);
} else if (strstr(lineBuf, "GET /on2") > 0) {
Serial.println("LED 2 ON");
digitalWrite(LED_RED, HIGH);
} else if (strstr(lineBuf, "GET /off2") > 0) {
Serial.println("LED 2 OFF");
digitalWrite(LED_RED, LOW);
}
// начинаем новую строку
currentLineIsBlank = true;
memset(lineBuf, 0, sizeof(lineBuf));
charCount = 0;
} else if (c != '\r') {
// в строке попался новый символ
currentLineIsBlank = false;
}
}
}
// даем веб-браузеру время, чтобы получить данные
delay(1);
// закрываем соединение
client.stop();
Serial.println("client disconnected");
}
}
При переходе по IP-адресу из монитора порта, выводится веб-страница с кнопками.
Программирование на JavaScript
Для старта с платформой Wi-Fi Slot на языке JavaScript скачайте и установите интегрированную среду разработки — Espruino Web IDE.
Установите прошивку интерпретатор JavaScript на ESP32.
Подробнее о функциях и методах работы ESP32 на языке JavaScript читайте документацию на Espruino.
Элементы платы
Мозг платформы
Платформа для разработки ESP32 DevKit основана на модуле ESP32-WROOM с чипом ESP32-D0WDQ6 от Espressif.
Чип ESP32-D0WDQ6
Чип ESP32-D0WDQ6 — выполнен по технологии SoC (англ. System-on-a-Chip — система на кристалле), в которую входит 2-ядерный 32-битный процессор Tensilica Xtensa LX6 с блоками памяти ROM на 448 КБ и SRAM на 520 КБ. В кристалле также расположены беспроводные технологии Wi-Fi/Bluetooth, радио-модуль, датчик Холла и сенсор температуры.
Для работы с чипом необходима внешняя Flash-память и другая электронная обвязка. Кристалл ESP32-D0WDQ6 является основой на базе которой выпускаются модули с необходимой периферией: например ESP32-WROOM или ESP32-WROVER.
Модуль ESP32-WROOM
ESP32-WROOM — модуль с чипом ESP32-D0WDQ6, Flash-памятью на 4 МБ и всей необходимой обвязкой, которые спрятаны под металлическим кожухом. Pins SCK/CLK, SDO/SD0, SDI/SD1, SHD/SD2, SWP/SD3 and SCS/CMD, namely, GPIO6 to GPIO11 are connected to the integrated SPI flash integrated on the module and are not recommended for other uses.
Рядом с кожухом расположена миниатюрная антенна из дорожки на верхнем слое печатной платы в виде змейки. Металлический кожух экранирует компоненты модуля и тем самым улучшает электромагнитные свойства.
Модуль является основной, на которой выполняются промышленные устройства или отладочные платы, например: ESP32 DevKit или ESP32-Sense Kit.
USB-UART преобразователь
Преобразователь USB-UART на микросхеме CP2102 обеспечивает связь модуля ESP32-WROOM с USB-портом компьютера. При подключении к ПК — платформа ESP32 DevKit определяется как виртуальный COM-порт.
Разъём micro-USB
Разъём micro-USB предназначен для прошивки и питания платформы ESP32 DevKit с помощью компьютера.
Светодиодная индикация
Светодиод |
Назначение |
|---|---|
ON |
Индикатор питания платформы. |
LED |
Пользовательский светодиод на |
Кнопка EN
Кнопка предназначена для ручного сброса программы — аналог кнопки RESET обычного компьютера.
Кнопка BOOT
Кнопка служит для ручного перевода модуля в режим прошивки:
Зажмите кнопку
BOOT;Нажмите и отпустите кнопку
EN;Отпустите кнопку
BOOT
Регулятор напряжения
Линейный понижающий регулятор напряжение AMS1117-3.3 обеспечивает питание микроконтроллера. Выходное напряжение 3,3 вольта с максимальным током 1 А.
Распиновка
Пины питания
VIN: Пин для подключения внешнего источника напряжения в диапазоне от 5 до 14 вольт.
3V3: Пин от стабилизатора напряжения с выходом 3,3 вольта и максимальных током 1 А. Регулятор обеспечивает питание модуля ESP32-WROOM.
GND: Выводы земли.
Порты ввода/вывода
В отличие от большинства плат Arduino, родным напряжением ESP32 DevKit является 3,3 В, а не 5 В. Выходы для логической единицы выдают 3,3 В, а в режиме входа ожидают принимать не более 3,3 В. Более высокое напряжение может повредить микроконтроллер!
Будьте внимательны при подключении периферии: убедитесь, что она может корректно функционировать в этом диапазоне напряжений.
Цифровые входы/выходы: 21 пин
1–5,12–19,21–23,25–27,32и33Контакты ввода-вывода общего назначения. Пины могут быть настроены на вход или на выход. Логический уровень единицы — 3,3 В, нуля — 0 В. Максимальный ток выхода — 12 мА.
Цифровые входы: 4 пина
34–36и39Контакты ввода общего назначения. Могут быть настроены только на вход.
ШИМ: все пины ввода-вывода
Позволяет выводить аналоговые значения в виде ШИМ-сигнала с разрядность 16 бит. Максимальное количество каналов 16.
АЦП: 15 пинов
2,4,12–15,25–27,32–36и39Позволяет представить аналоговое напряжение в цифровом виде с разрядностью 12 бит.
ЦАП: пины
25(DAC1)и26(DAC2)Аналоговый выход цифро-аналогового преобразователя, который позволяет формировать 8-битные уровни напряжения. Выводы могут использоваться для аудио-выхода.
Интерфейсы
Каждый пин ввода-вывода платформы поддерживает аппаратные интерфейсы.
Интерфейс |
Количество |
Назначение |
|---|---|---|
I²C |
2 |
Используется для общения с периферией по интерфейсу «I²C». |
SPI |
3 |
Для общения с периферией по интерфейсу «SPI». |
UART/Serial |
3 |
Для общения с периферией по интерфейсу «UART». |
I²S |
2 |
Используется для передачи и приёма цифрового звука. |
Принципиальная схема
Габаритный чертёж
Характеристики
Модуль: ESP32-WROOM с чипом ESP32-D0WDQ6
Частота беспроводной передачи: 2,4 ГГц
Стандарт Wi-Fi: 802.11b/g/n
Стандарт Bluetooth: BLE v4.2 BR/EDR
Тактовая частота: до 240 МГц
Flash-память: 448 КБ
Внешняя Flash-память: 4 МБ
SRAM-память: 520 КБ
Пинов общего назначения: 25 ввода-вывода (GPIO) и 4 ввода (GPI)
Контактов с АЦП: 15
Разрядность АЦП: 12 бит
Контактов с ЦАП: 2
Разрядность ЦАП: 8 бит
Контактов с ШИМ: 21 (16 каналов)
Разрядность ШИМ: 16 бит
Контактов с ёмкостным сенсором: 8
Пинов с прерываниями: 25
Аппаратные интерфейсы: 3×SPI, 3×UART, 2×I²C и 2×I²S
Напряжение логических уровней: 3,3 В
Максимальный ток с пина или на пин: 12 мА
Максимальный выходной ток пина 3V3: 1 А
Входное напряжение через пин Vin: 5–14 В
Габариты: 51×28 мм