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-CUSB компьютера / источник 5 ВОсновной способ питания и прошивки. Для передачи данных нужен USB-кабель с линиями данных.
Плюс аккумулятора 1SBAT / VBAT (U2.7)Вид сзади, USB-C сверху: третий контакт сверху справа. Только положительный вывод литиевого аккумулятора 3.7 В номинально. До проверки R5/ревизии и допуска защищённой ячейки к току около 2 А оставить BAT неподключённым, пользоваться USB.
Минус аккумулятораGND (U2.6)Вид сзади, USB-C сверху: четвёртый контакт сверху справа, сразу под BAT. Перед подключением сверить маркировку и полярность мультиметром.
VBUS / 5VU2.10Вид сзади: сверху слева. По схеме через установленный R30 0 Ω связан с USB VBUS; альтернативный R31 к VSYS не установлен. Не считать универсальным входом VSYS и не соединять независимые источники 5 В без развязки.
GNDU2.11Второй контакт сверху слева; общая земля.
3V3(OUT)U2.12Третий контакт сверху слева; выход 3.3 В. Максимальные 800 мА в описании LDO не означают доступный ток для внешней нагрузки.
GP0GPIO0 (U2.13)Четвёртый контакт слева, совмещён с BOOT и влияет на режим загрузки.
GP2, GP3, GP4, GP5, GP6GPIO2…GPIO6 (U2.14…U2.18)Оставшиеся контакты левого ряда сверху вниз. Назначение внешних I²C/SPI/UART задаёт программа; уровни только 3.3 В. GPIO3 также strapping-контакт: учитывать уровни при старте.
GP11, GP10, GP9, GP8, GP7GPIO11…GPIO7 (U2.5…U2.1)Ниже правого GND сверху вниз. Можно назначать внешнюю периферию с учётом возможностей ESP32-S3.
TXGPIO43 / UART0 TX (U2.9)Верхний контакт справа. К RX внешнего устройства с логикой 3.3 В, земли объединить.
RXGPIO44 / UART0 RX (U2.8)Второй контакт сверху справа. К TX внешнего устройства с логикой 3.3 В.
Встроенная IMU: SDA / SCLGPIO48 / GPIO47Уже разведены внутри платы, не контакты боковых гребёнок. Не использовать распиновку IMU другой платы.
Встроенная IMU: INT1 / INT2GPIO13 / GPIO12Соединения по схеме. Базовый пример опрашивает IMU без прерываний.
Встроенный LCD: MOSI / CLKGPIO45 / GPIO40Уже соединены; SPI без MISO. Не назначать занятую периферию повторно.
Встроенный LCD: CS / DC / RST / BLGPIO42 / GPIO41 / GPIO39 / GPIO46Подсветка у B — GPIO46; GPIO48 занят SDA IMU.
Встроенная microSD: CLK / CMD / D0GPIO14 / GPIO15 / GPIO16Основные линии SDMMC; карта не относится к комплекту платы.
Встроенная microSD: D1 / D2 / D3GPIO18 / GPIO17 / GPIO21Дополнительные линии 4-битного SDMMC.
Встроенный RGB LEDGPIO38Адресный WS2812B-0807.
Встроенный BAT_ADCGPIO1Подключён через делитель 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 CDC

Native 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=0x6B

SA0 по схеме соединён с землёй; адрес 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=46

Display_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

text
1. Скачать официальный 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 сначала проверить исходное демо. Сборка и аппаратный прогон здесь не заявляются.

Проекты с этим компонентом

Все проекты

Связанные проекты пока не опубликованы.

Связанные материалы и компоненты