ESP32 WROOM DevKit v1: распиновка, схема подключения и программирование
ESP32 DevKit — это универсальная платформа для разработки IoT-решений.
Программирование на C++
- Для начала работы с платформой ESP32 DevKit на языке C++ скачайте и установите на компьютер интегрированную среду разработки Arduino IDE.
- По умолчанию среда IDE настроена только на AVR-платы. Для платформы ESP32 DevKit добавьте в менеджере плат поддержку платформ на модуле ESP32.
- Выберите платформу ESP32 DevKit:.
После выполненных действий плата 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 пинах.
- webClient.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.
Подробнее о функциях и методах работы 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 | Пользовательский светодиод на 2 пине микроконтроллера. При задании значения «высокого уровня» светодиод включается, при «низком» – выключается. |
Кнопка 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 мм