Wi-Fi модуль ESP32 WROOM DevKit v1: распиновка, схема подключения и программирование

ESP32 DevKit платформа для разработки IoT-решений.

Программирование на C++

  1. Для начало работы с платформой ESP32 DevKit на языке C++ скачайте и установите на компьютер интегрированную среду разработки Arduino — Arduino IDE.
  2. По умолчанию среда Arduino IDE настроена только на AVR-платы. Для платформы ESP32 DevKit — добавьте в менеджере плат поддержку платформу на модуле ESP32.
  3. В Arduino IDE выберите платформу ESP32 DevKit: Инструменты Плата DOIT ESP32 DEVKIT V1.

После выполненных действий плата ESP32 DevKit готова к программированию через Arduino IDE.

Подробности о функциях и методах работы ESP32 на языке C++ читайте на ESP32 Arduino Core’s.

Примеры работы для 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, то вы увидите веб-интерфейс.

Создадим 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>&nbsp;";
                    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>&nbsp;";
                    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

  1. Для старта с платформой 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

Кнопка служит для ручного перевода модуля в режим прошивки:

  1. Зажмите кнопку BOOT;
  2. Нажмите и отпустите кнопку EN;
  3. Отпустите кнопку 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 пин 15, 1219, 2123, 2527, 32 и 33
    Контакты ввода-вывода общего назначения. Пины могут быть настроены на вход или на выход. Логический уровень единицы — 3,3 В, нуля — 0 В. Максимальный ток выхода — 12 мА.
  • Цифровые входы: 4 пина 3436 и 39
    Контакты ввода общего назначения. Могут быть настроены только на вход.
  • ШИМ: все пины ввода-вывода
    Позволяет выводить аналоговые значения в виде ШИМ-сигнала с разрядность 16 бит. Максимальное количество каналов 16.
  • АЦП: 15 пинов 2, 4, 1215, 2527, 3236 и 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 мм

Ресурсы