
Waveshare ESP32-S3-LCD-1.47B: LCD, QMI8658 и питание от аккумулятора
Waveshare · ESP32-S3-LCD-1.47B / ESP32-S3-LCD-1.47B-M
Показывает данные и измеряет движение устройства.
Автор: SLDV LAB
Опубликовано · Обновлено
О МОДУЛЕ
Что делает ESP32-S3-LCD-1.47B / ESP32-S3-LCD-1.47B-M
ESP32-S3-LCD-1.47B объединяет микроконтроллер, небольшой цветной экран, датчик движения и возможность аккумуляторного питания. Она подходит для карманного индикатора, пульта, интерфейса датчика или прототипа носимого устройства. Это самостоятельная плата разработки: внешний Arduino для работы не требуется.
Для интеграции аккумулятора предусмотрены контакты BAT/VBAT и GND у боковой гребёнки и встроенная схема зарядки ETA6098. Можно подключить отдельный перезаряжаемый литиевый аккумулятор 3.7 В. Аккумулятор в стандартной комплектации Waveshare не указан. Отдельный батарейный отсек, крепление и допустимые размеры элемента производителем не заявлены: механическое размещение нужно предусмотреть в своём корпусе.
По опубликованной электрической схеме резистор R5=82 кОм задаёт ток ETA6098; таблица datasheet v1.1 указывает типичный fast-charge ток около 2 А при таком ISET. Фактический ток зависит также от питания, температуры и экземпляра, но маленький аккумулятор нельзя считать совместимым по одному напряжению 3.7 В. До проверки реальной ревизии/R5 платы, допустимого тока заряда и защиты конкретной ячейки, а также полярности используйте только USB-питание, без подключённой батареи.
QMI8658 уже установлен на плате и содержит трёхосевой акселерометр и трёхосевой гироскоп. Он позволяет получать ускорение и угловую скорость; распознавание жестов, оценка наклона и подсчёт шагов требуют соответствующей программы. Магнитометра и готового абсолютного компаса эта шестиосевая IMU не заменяет.
Исполнения ESP32-S3-LCD-1.47B и ESP32-S3-LCD-1.47B-M относятся к одной аппаратной семье. У стандартного варианта две гребёнки поставляются отдельно, у -M они уже припаяны. Буква B важна: нельзя переносить на эту плату распиновку ESP32-S3-LCD-1.47 без B, ESP32-S3-Touch-LCD-1.47 или ESP32-C6-LCD-1.47.
Экран здесь без сенсорного ввода. В демонстрационной программе имитация нажатий организована через кнопку BOOT. microSD позволяет хранить изображения и файлы, а RGB-светодиод подсвечивает прозрачную промежуточную пластину.
Зарядную схему не следует считать подтверждённой полноценной защитой аккумулятора от всех аварийных режимов. Для готового устройства выбирайте защищённую ячейку/сборку и отдельно проверяйте совместимость её допустимого зарядного тока с платой. Не подключайте неперезаряжаемые батареи, последовательные многосекционные сборки или аккумулятор с обратной полярностью. При пайке гребёнок Waveshare запрещает снимать экран: жало подводят под углом.
Характеристики
- Микроконтроллер
- ESP32-S3R8
- Процессор
- 2 × Xtensa LX7, 32 бита
- Частота до
- 240 МГц
- Flash
- 16 МБ
- Внутренняя SRAM
- 512 КБ
- PSRAM
- 8 МБ
- Диагональ LCD
- 1.47 дюйм
- Разрешение LCD
- 172×320 пикселей
- Контроллер дисплея
- ST7789, SPI
- Матрица
- IPS TFT; заявлено 262K цветов
- Сенсорный ввод
- Нет
- Датчик движения
- QMI8658: 3 оси акселерометра + 3 оси гироскопа
- Адрес встроенной IMU
- 0x6B в официальном демо; SDA GPIO48 / SCL GPIO47
- Контакты аккумулятора
- BAT/VBAT (+), GND (−); одна литиевая ячейка 3.7 В номинально
- Схема зарядки
- ETA6098, R5=82 кОм по схеме: типичный fast-charge около 2 А; реальную ревизию/R5 и допустимый ток защищённой ячейки проверить до подключения
- Аккумулятор в стандартном комплекте Waveshare
- Нет
- Гребёнки
- 18 контактов: 13 сигнальных + 5 контактов питания/земли; у -M припаяны
- Измерение батареи
- GPIO1, делитель 200 кОм / 100 кОм (коэффициент 3)
- Слот карты памяти
- microSD / TF, SDMMC
- Wi-Fi
- 2.4 ГГц, IEEE 802.11 b/g/n
- Bluetooth
- Bluetooth 5 LE
- USB
- Type-C: питание, связь и загрузка прошивки
- RGB-светодиод
- WS2812B-0807, GPIO38
- Интерфейс
- I²C, SPI, UART, Аналоговый, Wi-Fi, Bluetooth
- Питание модуля
- Первый запуск и работа до проверки аккумулятора: только 5 В через USB Type-C, BAT/VBAT оставить неподключённым. По опубликованной схеме ETA6098 имеет R5=82 кОм на ISET; datasheet ETA6098 v1.1 соответствует этому типичному fast-charge току около 2 А. Это может быть слишком много для маленькой LiPo. Перед подключением проверить фактическую ревизию и R5 своей платы, допустимый зарядный ток конкретной защищённой ячейки/сборки и её полярность. Допустима только одна перезаряжаемая литиевая ячейка 3.7 В номинально (1S, заряд до 4.2 В): плюс на BAT/VBAT, минус на GND. Логика GPIO 3.3 В; не подавать 5 В на GPIO или BAT. 3V3 — выход. Полноценная защита аккумулятора на плате не подтверждена.
ПРАКТИКА
Подключение

| Контакт модуля | Контакт платы | Назначение |
|---|---|---|
| USB Type-C | USB компьютера / источник 5 В | Основной способ питания и прошивки. Для передачи данных нужен USB-кабель с линиями данных. |
| Плюс аккумулятора 1S | BAT / VBAT (U2.7) | Вид сзади, USB-C сверху: третий контакт сверху справа. Только положительный вывод литиевого аккумулятора 3.7 В номинально. До проверки R5/ревизии и допуска защищённой ячейки к току около 2 А оставить BAT неподключённым, пользоваться USB. |
| Минус аккумулятора | GND (U2.6) | Вид сзади, USB-C сверху: четвёртый контакт сверху справа, сразу под BAT. Перед подключением сверить маркировку и полярность мультиметром. |
| VBUS / 5V | U2.10 | Вид сзади: сверху слева. По схеме через установленный R30 0 Ω связан с USB VBUS; альтернативный R31 к VSYS не установлен. Не считать универсальным входом VSYS и не соединять независимые источники 5 В без развязки. |
| GND | U2.11 | Второй контакт сверху слева; общая земля. |
| 3V3(OUT) | U2.12 | Третий контакт сверху слева; выход 3.3 В. Максимальные 800 мА в описании LDO не означают доступный ток для внешней нагрузки. |
| GP0 | GPIO0 (U2.13) | Четвёртый контакт слева, совмещён с BOOT и влияет на режим загрузки. |
| GP2, GP3, GP4, GP5, GP6 | GPIO2…GPIO6 (U2.14…U2.18) | Оставшиеся контакты левого ряда сверху вниз. Назначение внешних I²C/SPI/UART задаёт программа; уровни только 3.3 В. GPIO3 также strapping-контакт: учитывать уровни при старте. |
| GP11, GP10, GP9, GP8, GP7 | GPIO11…GPIO7 (U2.5…U2.1) | Ниже правого GND сверху вниз. Можно назначать внешнюю периферию с учётом возможностей ESP32-S3. |
| TX | GPIO43 / UART0 TX (U2.9) | Верхний контакт справа. К RX внешнего устройства с логикой 3.3 В, земли объединить. |
| RX | GPIO44 / UART0 RX (U2.8) | Второй контакт сверху справа. К TX внешнего устройства с логикой 3.3 В. |
| Встроенная IMU: SDA / SCL | GPIO48 / GPIO47 | Уже разведены внутри платы, не контакты боковых гребёнок. Не использовать распиновку IMU другой платы. |
| Встроенная IMU: INT1 / INT2 | GPIO13 / GPIO12 | Соединения по схеме. Базовый пример опрашивает IMU без прерываний. |
| Встроенный LCD: MOSI / CLK | GPIO45 / GPIO40 | Уже соединены; SPI без MISO. Не назначать занятую периферию повторно. |
| Встроенный LCD: CS / DC / RST / BL | GPIO42 / GPIO41 / GPIO39 / GPIO46 | Подсветка у B — GPIO46; GPIO48 занят SDA IMU. |
| Встроенная microSD: CLK / CMD / D0 | GPIO14 / GPIO15 / GPIO16 | Основные линии SDMMC; карта не относится к комплекту платы. |
| Встроенная microSD: D1 / D2 / D3 | GPIO18 / GPIO17 / GPIO21 | Дополнительные линии 4-битного SDMMC. |
| Встроенный RGB LED | GPIO38 | Адресный WS2812B-0807. |
| Встроенный BAT_ADC | GPIO1 | Подключён через делитель 200 кОм / 100 кОм. Это измерение напряжения, не готовый датчик процентов заряда. |
Подходит для ESP32, Arduino. Выберите контакты по документации своей платы.
ВАШ ПРОЕКТ · ВАШ ДАТЧИК
Интегрируйте модуль с ChatGPT
Скопируйте запрос в ChatGPT. Укажите свою плату и среду разработки — получите подключение и код для своего проекта.
Помоги интегрировать именно Waveshare ESP32-S3-LCD-1.47B или ESP32-S3-LCD-1.47B-M в мой проект. Сначала уточни вариант платы, среду и её версию, назначение устройства, внешние периферийные модули и нужен ли аккумулятор. Если нужен аккумулятор, уточни его тип, номинальное напряжение, наличие защиты, допустимый ток зарядки и размеры корпуса. Используй B-распиновку: QMI8658 на SDA GPIO48 / SCL GPIO47, адрес 0x6B; LCD ST7789 172×320, MOSI45 / CLK40 / CS42 / DC41 / RST39 / BL46; батарейный ADC на GPIO1 через делитель 3:1. BAT/VBAT — плюс отдельной 1S литиевой ячейки 3.7 В, GND — минус. Гребёнки имеют логику 3.3 В; VBUS и BAT нельзя путать. По опубликованной схеме R5=82 кОм, что соответствует типичному fast-charge току ETA6098 около 2 А. До проверки фактических ревизии/R5, допустимого тока конкретной защищённой ячейки/сборки и полярности оставить BAT отключённым и использовать только USB. Не обещай полноценную BMS, готовый батарейный отсек или совместимость произвольной маленькой LiPo. Подготовь согласованные подключение, зависимости, настройки IDE, минимальный пример с проверкой ошибок и последовательность проверки на реальной плате. Для Arduino опирайся на официальный B-Demo и API core 3.x: LVGL 8.3.10, OneButton 2.6.1, PNGdec 1.0.2 для LCD_Image. Объясни, какие файлы нужно оставить рядом со скетчем. Не выдавай программную имитацию ввода в демо за touchscreen и не переносись на C6, обычную S3-LCD-1.47 или Touch-LCD-1.47. Отдельно проверь, что внешняя периферия не занимает GPIO LCD, IMU, карты памяти, native USB и загрузочные контакты. Различай проверку исходников, успешную компиляцию и испытание на устройстве; явно отмечай, что ещё не проверено.
Библиотеки
Установите библиотеку для своей среды и откройте пример из её документации.
Что именно прописать
- Arduino: пакет плат
esp32 by Espressif Systems ≥3.0.2Требование Waveshare. Демо использует API Arduino-ESP32 3.x (ledcAttach/ledcWrite по GPIO); не переносить без адаптации в core 2.x.
- Arduino: плата
ESP32S3 Dev ModuleИменно этот профиль показан в настройках производителя; контакты встроенных устройств задаются драйверами B-варианта.
- Flash / частота
16MB (128Mb); QIO 80MHzНастройки по официальному снимку Arduino IDE. Не путать 16 МБ Flash и 8 МБ PSRAM.
- PSRAM
OPI PSRAMНастройка для ESP32-S3R8; в ESP-IDF демо включены CONFIG_SPIRAM_MODE_OCT и скорость PSRAM 80 МГц.
- Partition Scheme
16M Flash (3MB APP/9.9MB FATFS)Схема разделов из официального снимка настроек Arduino.
- CPU Frequency
240MHz (WiFi)Настройка из официального примера.
- USB Mode / Upload Mode
Hardware CDC and JTAG; UART0 / Hardware CDCNative USB через Type-C, без отдельного USB-UART мостика в схеме.
- USB CDC On Boot
EnabledДля приведённых здесь скетчей с Serial. На снимке полного демо Waveshare стоит Disabled; это не препятствует включению CDC для Serial в этих примерах.
- Serial Monitor
115200Выбрать появившийся USB-порт после прошивки. Не переносить COM13 со снимка документации.
- Библиотеки полного LVGL демо
LVGL 8.3.10; OneButton 2.6.1Использовать Arduino/libraries из того же официального ZIP; в текущем архиве присутствует OneButton, хотя таблица веб-руководства его не перечисляет. Не заменять LVGL 8 на LVGL 9 без портирования.
- Библиотека LCD_Image
PNGdec 1.0.2Версия в официальном ZIP. Подготовить microSD с PNG из Arduino/SD Card File.
- Файлы QMI8658
I2C_Driver.h/.cpp; Gyro_QMI8658.h/.cppВ официальном Arduino/examples/LVGL_Arduino. Это локальные драйверы проекта, а не универсальное имя пакета из Library Manager.
- Встроенная IMU I²C
SDA=48; SCL=47; address=0x6BSA0 по схеме соединён с землёй; адрес 0x6B выбран в QMI8658_Init официального B-демо. В примерах шина явно ограничена 100 кГц.
- Инициализация IMU
I2C_Init(); QMI8658_Init();Инициализировать шину раньше датчика. Перед этим проверить ACK. По умолчанию в исходниках диапазоны ±4 g и ±64 °/с; выбор другого диапазона требует изменить масштаб пересчёта.
- Чтение IMU
getAccelerometer(); getGyroscope();API официального драйвера. QMI8658_Loop() в проверенном архиве обновляет только Accel; для Gyro нужен отдельный вызов. Единицы Accel — g, Gyro — °/с.
- LCD: геометрия и SPI
ST7789; 172×320; MOSI=45; SCLK=40; CS=42; DC=41; RST=39; BL=46Display_ST7789.h подтверждает размер и Offset_X=34, Offset_Y=0. Не подставлять 170×320 с рекламной графики.
- BAT_ADC
GPIO1; Vbat ≈ 3 × VadcДелитель по схеме. В демо присутствует Measurement_offset=0.992857; это коэффициент примера, не универсальная калибровка всех экземпляров.
- Аккумулятор
1S, 3.7 V nominal; BAT/VBAT=+; GND=−По схеме R5=82 кОм: типичный fast-charge ETA6098 около 2 А. Сначала проверить реальную ревизию/R5, допустимый ток защищённой ячейки/сборки и полярность. До этого только USB, BAT отключён. Подключать батарею при снятом внешнем питании; не подавать на BAT 5 В.
- ESP-IDF: проект
ESP-IDF/ESP32-S3-LCD-1.47B-TestОткрывать папку самого проекта. Manifest указывает idf >=4.4, lvgl ~8.3.0 и led_strip ^2.4.1; это требования manifest, а не доказательство успешной сборки на всех IDF 4.4+.
- Восстановление загрузки
Удержать BOOT → нажать/отпустить RESET → отпустить BOOTСпособ войти в загрузчик из FAQ производителя, если плата не определяется для прошивки.
Проверка памяти, связи с QMI8658 и батарейного ADC
cpp#include <Arduino.h>
#include <Wire.h>
constexpr uint8_t IMU = 0x6B;
constexpr int SDA_PIN = 48, SCL_PIN = 47, BAT_PIN = 1;
bool readRegister(uint8_t reg, uint8_t &value) {
Wire.beginTransmission(IMU);
Wire.write(reg);
if (Wire.endTransmission(false) != 0) return false;
if (Wire.requestFrom(IMU, size_t(1), true) != 1) return false;
value = uint8_t(Wire.read());
return true;
}
void setup() {
Serial.begin(115200);
delay(1200);
Wire.begin(SDA_PIN, SCL_PIN, 100000);
Wire.setTimeOut(50);
analogReadResolution(12);
analogSetPinAttenuation(BAT_PIN, ADC_11db);
Serial.printf("Flash: %u bytes; PSRAM: %u bytes\n",
unsigned(ESP.getFlashChipSize()),
unsigned(ESP.getPsramSize()));
}
void loop() {
uint8_t who = 0;
if (readRegister(0x00, who)) {
Serial.printf("QMI8658 register 0x00: 0x%02X\n", who);
} else {
Serial.println("No IMU response. Check exact B board and GPIO48/47.");
}
const float vb = analogReadMilliVolts(BAT_PIN) * 3.0f / 1000.0f;
Serial.printf("BAT node, approximate: %.3f V\n", vb);
delay(1000);
}
Полный самостоятельный скетч для ESP32-S3-LCD-1.47B / -M, Arduino-ESP32 3.x, без сторонних библиотек. USB CDC On Boot = Enabled. Не запускает измерения IMU и не управляет зарядкой. Значение BAT имеет смысл только при подключённой батарее; напряжение открытого зарядного узла не доказывает наличие батареи. Коэффициент 3 подтверждён схемой, погрешность требует сверки мультиметром. Ожидаемые объёмы: Flash 16 МБ и PSRAM 8 МБ при правильной настройке OPI. Код сверен с распиновкой/API; компиляция и испытание на физической плате здесь не выполнялись.
Акселерометр и гироскоп с драйвером официального B-демо
cpp#include <Arduino.h>
#include "I2C_Driver.h"
#include "Gyro_QMI8658.h"
bool imuReady = false;
bool readBlock(uint8_t reg, uint8_t *data, size_t count) {
Wire.beginTransmission(0x6B);
Wire.write(reg);
if (Wire.endTransmission(false) != 0) return false;
if (Wire.requestFrom(uint8_t(0x6B), count, true) != count) {
while (Wire.available()) Wire.read();
return false;
}
for (size_t i = 0; i < count; ++i) data[i] = uint8_t(Wire.read());
return true;
}
int16_t signed16(const uint8_t *p) {
return int16_t(uint16_t(p[0]) | (uint16_t(p[1]) << 8));
}
void setup() {
Serial.begin(115200);
delay(1200);
I2C_Init(); // Wire.begin(48, 47)
Wire.setClock(100000);
Wire.setTimeOut(50);
uint8_t id;
if (!readBlock(0x00, &id, 1)) {
Serial.println("IMU not found at 0x6B");
return;
}
QMI8658_Init(); // Official defaults: +/-4 g and +/-64 dps
delay(20);
uint8_t accCfg, gyroCfg, enable;
imuReady = readBlock(0x03, &accCfg, 1)
&& readBlock(0x04, &gyroCfg, 1)
&& readBlock(0x08, &enable, 1)
&& ((accCfg & 0x70) == 0x10)
&& ((gyroCfg & 0x70) == 0x20)
&& ((enable & 0x03) == 0x03);
if (!imuReady) Serial.println("IMU config mismatch; do not use these scale factors");
}
void loop() {
if (!imuReady) { delay(1000); return; }
uint8_t b[12];
if (!readBlock(0x35, b, sizeof(b))) {
Serial.println("IMU read failed; sample discarded");
delay(250);
return;
}
Serial.printf("A[g] %.3f %.3f %.3f | G[dps] %.2f %.2f %.2f\n",
signed16(b + 0) * (4.0f / 32768.0f),
signed16(b + 2) * (4.0f / 32768.0f),
signed16(b + 4) * (4.0f / 32768.0f),
signed16(b + 6) * (64.0f / 32768.0f),
signed16(b + 8) * (64.0f / 32768.0f),
signed16(b + 10) * (64.0f / 32768.0f));
delay(100);
}
Полный основной скетч, но требует четырёх файлов I2C_Driver.h/.cpp и Gyro_QMI8658.h/.cpp из Arduino/examples/LVGL_Arduino официального ZIP, проверенного 09.10.2026. Скопировать только эти четыре файла рядом с новым .ino. Инициализация производителя задаёт ±4 g и ±64 °/с; пример проверяет диапазоны и отбрасывает неполные I²C-ответы. В покое модуль ускорения должен быть около 1 g, гироскоп близок к нулю с реальным смещением; при резком вращении диапазон ±64 °/с может насыщаться. Это базовое чтение без синхронизации FIFO/data-ready, не измерительный эталон. При изменении диапазонов нужен другой масштаб. Код проверен по исходникам, на устройстве не запускался.
Первый запуск экрана, LVGL и изображений microSD
text1. Скачать официальный ESP32-S3-LCD-1.47B-Demo.zip.
2. Для полного интерфейса открыть Arduino/examples/LVGL_Arduino/LVGL_Arduino.ino вместе со всеми соседними файлами.
3. Установить библиотеки из Arduino/libraries этого архива: LVGL 8.3.10 и OneButton 2.6.1. Сохранить предоставленную конфигурацию LVGL.
4. Выбрать ESP32S3 Dev Module, Flash 16MB, QIO 80MHz, OPI PSRAM, схему 16M Flash (3MB APP/9.9MB FATFS), USB Hardware CDC.
5. Подключить плату USB-кабелем с данными, выбрать фактический порт и скомпилировать проект.
6. Загрузить прошивку. При проблемах с портом войти в загрузчик комбинацией BOOT/RESET.
7. Проверить изображение, подсветку, кнопку BOOT и изменение показаний ускорения при наклоне.
8. Для показа PNG использовать отдельный Arduino/examples/LCD_Image/LCD_Image.ino, PNGdec 1.0.2 и microSD с файлами из Arduino/SD Card File.
9. Для собственного GUI сохранять LCD 172×320 и BL=GPIO46. Функция Simulated_Touch_Init в демо имитирует ввод кнопкой, сенсорного слоя у B нет.
Процедура для официального архива именно ESP32-S3-LCD-1.47B. Полный проект надо открывать целиком, отдельного .ino недостаточно. В архиве заголовок LVGL_Arduino.ino обозначен V1.0 / 2024-10-30; не считать это датой последней модификации всего архива. До собственного GUI сначала проверить исходное демо. Сборка и аппаратный прогон здесь не заявляются.
Проекты с этим компонентом
Все проектыСвязанные проекты пока не опубликованы.


