ESP32-S3-Touch-AMOLED-1.8是一款微雪(Waveshare)设计的高性能的微控制器开发板。在较小的板型下,板载了1.8英寸电容触摸AMOLED屏、电源管理芯片、六轴传感器(三轴加速度计与三轴陀螺仪)、RTC、SD卡槽、麦克风、扬声器等外设,方便开发并嵌入应用到产品中。
1、ESP32-S3R8 2、QMI8658 3、PCF85063 4、AXP2101 5、ES8311 6、扬声器 7、备用电池焊盘 8、MX1.25 锂电池接口 | 9、16MB NOR-Flash 10、麦克风 11、板载贴片天线 12、预留1mm间距GPIO焊盘 13、BOOT 按键 14、Type-C 接口 15、PWR 电源按键 |
ESP32-S3-Touch-AMOLED-1.8 目前提供 Arduino IDE 和 ESP-IDF 两种开发工具和框架,提供了灵活的开发选择,你可以根据项目需求和个人习惯选择适合的开发工具。
本章介绍 Arduino 环境搭建,包括 Arduino IDE、ESP32板管理、相关库的安装,程序编译下载及示例程序测试,帮助用户掌握开发板,便于二次开发。
文件
-> 偏好设置
https://espressif.github.io/arduino-esp32/package_esp32_index.json
①. 在侧边栏选择“BOARDS MANAGER”(板管理);
②. 在搜索框中输入要安装的板名称“ESP32”;
③. 在方框处选择 版本号;
④. 点击“INSTALL”(安装)。
板名称 | 板安装要求 | 版本号要求 |
---|---|---|
esp32 by Espressif Systems | “离线”安装/“在线”安装 | ≥3.0.6 |
①. 在侧边栏选择“LIBRARY MANAGER”(库管理);
②. 在搜索框中输入要安装的库名称,如“Adafruit NeoMatrix”;
③. 在方框处选择库版本,若无特殊要求,默认最新版即可,点击“INSTALL”(安装)。
①. 软件窗口会显示库的安装进度;
②. 安装完成后,库的状态会变成“x.x.x版本 installed”。
库名称 | 说明 | 版本 | 库安装要求 |
---|---|---|---|
Arduino_DriveBus | FT3168触摸芯片驱动库 | —— | “离线”安装 |
GFX_Library_for_Arduino | 适配SH8601的GFX图形化库 | v1.4.9 | “离线”安装 |
ESP32_IO_Expander | TCA9554拓展芯片驱动库 | v0.0.3 | 可“在线”或“离线”安装 |
lvgl | LVGL图形化库 | v8.4.0 | “在线”安装后需复制demos文件夹至src,建议使用“离线”安装 |
SensorLib | PCF85063、QMI8658传感器驱动库 | v0.2.1 | 可“在线”或“离线”安装 |
XPowersLib | AXP2101电源管理芯片驱动库 | v0.2.6 | 可“在线”或“离线”安装 |
ui_a | 自定义ui库 | —— | “离线”安装 |
ui_b | 自定义ui库 | —— | “离线”安装 |
ui_c | 自定义ui库 | —— | “离线”安装 |
Mylibrary | 开发板引脚宏定义 | —— | “离线”安装 |
lv_conf.h | LVGL配置文件 | —— | “离线”安装 |
示例程序 | 基础例程说明 | 依赖库 |
---|---|---|
01_HelloWorld | 展示了基本的图形库功能,也可以用于测试显示屏的基础性能以及随机文本显示效果 | GFX_Library_for_Arduino |
02_Drawing_board | 展示了基本的图形库功能,也可以用于测试显示屏的基础性能以及随机文本显示效果 | GFX_Library_for_Arduino,Arduino_DriveBus , ESP32_IO_Expander |
03_GFX_AsciiTable | 根据屏幕尺寸,在显示屏上按行列打印ASCII字符 | GFX_Library_for_Arduino |
04_GFX_FT3168_Image | 展示显示图片效果,通过触摸更换显示的图片 | GFX_Library_for_Arduino,Arduino_DriveBus , ESP32_IO_Expander |
05_GFX_PCF85063_simpleTime | GFX库显示当前时间 | SensorLib,GFX_Library_for_Arduino |
06_GFX_ESPWiFiAnalyzer | 在屏幕上绘制WiFi频段信号强度 | GFX_Library_for_Arduino |
07_GFX_Clock | 通过简单的标记指针和时间管理实现时钟 | GFX_Library_for_Arduino |
08_LVGL_Animation | 自定义UI,控制背光亮度 | LVGL,Arduino_DriveBus,ui_a |
09_LVGL_change_background | 自定义UI,控制背景色 | LVGL,Arduino_DriveBus,ui_b |
10_LVGL_PCF85063_simpleTime | LVGL库显示当前时间 | LVGL,SensorLib |
11_LVGL_QMI8658_ui | LVGL绘制加速度折线图 | LVGL,SensorLib |
12_LVGL_AXP2101_ADC_Data | LVGL显示PMIC数据 | LVGL,XPowersLib |
13_LVGL_Widgets | LVGL演示 | LVGL,Arduino_DriveBus ,ESP32_IO_Expander |
14_LVGL_SD_Test | LVGL显示SD卡文件内容 | LVGL |
15_ES8311 | ES8311驱动示例,播放简单的音频 | —— |
16_LVGL_Sqprj | squareline ui结合LVGL示例 | LVGL |
【程序说明】
【硬件连接】
【代码分析】
if (!gfx->begin()) { USBSerial.println("gfx->begin() failed!"); }
gfx->fillScreen(BLACK); gfx->setCursor(10, 10); gfx->setTextColor(RED); gfx->println("Hello World!");
gfx->setCursor(random(gfx->width()), random(gfx->height())); gfx->setTextColor(random(0xffff), random(0xffff)); gfx->setTextSize(random(6), random(6), random(2)); gfx->println("Hello World!");
【程序说明】
【硬件连接】
【代码分析】
gfx->begin(); gfx->fillScreen(WHITE); for (int i = 0; i <= 255; i++) { gfx->Display_Brightness(i); gfx->setCursor(30, 150); gfx->setTextColor(BLUE); gfx->setTextSize(4); gfx->println("Loading board"); delay(3); }
void Arduino_IIC_Touch_Interrupt(void) { FT3168->IIC_Interrupt_Flag = true; } int32_t touchX = FT3168->IIC_Read_Device_Value(FT3168->Arduino_IIC_Touch::Value_Information::TOUCH_COORDINATE_X); int32_t touchY = FT3168->IIC_Read_Device_Value(FT3168->Arduino_IIC_Touch::Value_Information::TOUCH_COORDINATE_Y); if (FT3168->IIC_Interrupt_Flag == true) { FT3168->IIC_Interrupt_Flag = false; USBSerial.printf("Touch X:%d Y:%d\n", touchX, touchY); if (touchX > 20 && touchY > 20) { gfx->fillCircle(touchX, touchY, 5, BLUE); } }
【程序说明】
【硬件连接】
【代码分析】
Arduino_DataBus *bus = new Arduino_ESP32QSPI( LCD_CS /* CS */, LCD_SCLK /* SCK */, LCD_SDIO0 /* SDIO0 */, LCD_SDIO1 /* SDIO1 */, LCD_SDIO2 /* SDIO2 */, LCD_SDIO3 /* SDIO3 */); Arduino_GFX *gfx = new Arduino_SH8601(bus, -1 /* RST */, 0 /* rotation */, false /* IPS */, LCD_WIDTH, LCD_HEIGHT);
gfx->setTextColor(GREEN); for (int x = 0; x < numRows; x++) { gfx->setCursor(10 + x * 8, 2); gfx->print(x, 16); } gfx->setTextColor(BLUE); for (int y = 0; y < numCols; y++) { gfx->setCursor(2, 12 + y * 10); gfx->print(y, 16); } char c = 0; for (int y = 0; y < numRows; y++) { for (int x = 0; x < numCols; x++) { gfx->drawChar(10 + x * 8, 12 + y * 10, c++, WHITE, BLACK); } }
【程序说明】
【硬件连接】
【代码分析】
if (fingers_number > 0) { switch (Image_Flag) { case 0: gfx->draw16bitRGBBitmap(0, 0, (uint16_t *)gImage_1, LCD_WIDTH, LCD_HEIGHT); break; case 1: gfx->draw16bitRGBBitmap(0, 0, (uint16_t *)gImage_2, LCD_WIDTH, LCD_HEIGHT); break; case 2: gfx->draw16bitRGBBitmap(0, 0, (uint16_t *)gImage_3, LCD_WIDTH, LCD_HEIGHT); break; case 3: gfx->draw16bitRGBBitmap(0, 0, (uint16_t *)gImage_4, LCD_WIDTH, LCD_HEIGHT); break; case 4: gfx->draw16bitRGBBitmap(0, 0, (uint16_t *)gImage_5, LCD_WIDTH, LCD_HEIGHT); break; } Image_Flag++; if (Image_Flag > 4) { Image_Flag = 0; } }
【代码修改】
【程序说明】
【硬件连接】
【代码分析】
【程序说明】
【硬件连接】
【代码分析】
GFX_EXTRA_PRE_INIT
)【程序说明】
【硬件连接】
【代码分析】
void redraw_hands_cached_draw_and_erase() { gfx->startWrite(); draw_and_erase_cached_line(center, center, nsx, nsy, SECOND_COLOR, cached_points, sHandLen + 1, false, false); draw_and_erase_cached_line(center, center, nhx, nhy, HOUR_COLOR, cached_points + ((sHandLen + 1) * 2), hHandLen + 1, true, false); draw_and_erase_cached_line(center, center, nmx, nmy, MINUTE_COLOR, cached_points + ((sHandLen + 1 + hHandLen + 1) * 2), mHandLen + 1, true, true); gfx->endWrite(); }
【程序说明】
【硬件连接】
【代码分析】
int32_t slider_value = lv_slider_get_value(ui_Slider1); int32_t brightness = map(slider_value, 0, 100, 5, 255); gfx->Display_Brightness(brightness);
【程序说明】
【硬件连接】
【代码分析】
【程序说明】
【硬件连接】
【代码分析】
USBSerial.begin(115200)
为串口调试做准备rtc
,如果失败则进入死循环。设置日期和时间FT3168
,如果初始化失败则打印错误信息并延迟等待,成功后打印成功信息gfx
,设置亮度,并打印 LVGL 和 Arduino 的版本信息。接着初始化 LVGL,包括注册打印回调函数用于调试,初始化显示驱动和输入设备驱动。创建并启动 LVGL 的定时器,最后创建一个标签并设置初始文本为 “Initializing...”lv_timer_handler()
:这是 LVGL 图形库中的一个重要函数,用于处理图形界面的各种定时器事件、动画更新、输入处理等任务。在每个循环中调用这个函数可以确保图形界面的流畅运行和及时响应交互操作【程序说明】
【硬件连接】
【代码分析】
USBSerial.begin(115200)
为串口调试做准备FT3168
,如果初始化失败则打印错误信息并延迟等待,成功后打印成功信息gfx
,设置亮度,并打印 LVGL 和 Arduino 的版本信息。接着初始化 LVGL,包括注册打印回调函数用于调试,初始化显示驱动和输入设备驱动。创建并启动 LVGL 的定时器,最后创建一个标签并设置初始文本为 “Initializing...”chart
,设置图表的类型、范围、数据点数量等属性,并为加速度的三个轴添加数据系列qmi
,配置加速度计和陀螺仪的参数,启用它们,并打印芯片 ID 和控制寄存器信息lv_timer_handler()
:这是 LVGL 图形库中的一个重要函数,用于处理图形界面的各种定时器事件、动画更新、输入处理等任务。在每个循环中调用这个函数可以确保图形界面的流畅运行和及时响应交互操作【程序说明】
【硬件连接】
【代码分析】
void toggleBacklight() { USBSerial.println(backlight_on); if (backlight_on) { for (int i = 255; i >= 0; i--) { gfx->Display_Brightness(i); delay(3); } } else { for (int i = 0; i <= 255; i++) { gfx->Display_Brightness(i); delay(3); } } backlight_on = !backlight_on; }
【运行效果】
【程序说明】
【硬件连接】
【代码分析】
USBSerial.begin(115200)
为串口调试做准备Wire.begin(IIC_SDA, IIC_SCL);
初始化 I²C 总线,用于与其他 I²C 设备通信expander
,设置引脚模式为输出,并进行一些初始的引脚状态设置FT3168
,如果初始化失败则打印错误信息并延迟等待,成功后打印成功信息gfx
,设置亮度,并获取屏幕的宽度和高度。然后初始化 LVGL,包括注册打印回调函数用于调试,设置触摸控制器的电源模式为监控模式,初始化显示驱动和输入设备驱动。创建并启动 LVGL 的定时器,创建一个标签并设置文本,最后调用lv_demo_widgets()
展示 LVGL 的示例小部件lv_timer_handler()
:这是 LVGL 图形库中的一个重要函数,用于处理图形界面的各种定时器事件、动画更新、输入处理等任务。在每个循环中调用这个函数可以确保图形界面的流畅运行和及时响应交互操作delay(5);
:添加一个小的延迟,避免过度占用 CPU 资源【程序说明】
【硬件连接】
【代码分析】
USBSerial.begin(115200)
为串口调试做准备listDir
函数列出 SD 卡根目录的内容,并将 SD 卡的类型、大小和目录列表信息显示在屏幕上的标签中listDir
函数继续列出其内容。对于文件,打印文件名和文件大小。最后将所有收集到的信息作为字符串返回【运行效果】
SPI接口 | ESP32-S3 |
---|---|
CS (SS) | EXIO7 |
DI (MOSI) | GPIO1 |
DO (MISO) | GPIO3 |
SCK (SCLK) | GPIO2 |
【程序说明】
【硬件连接】
【代码分析】
es_handle
es8311_codec_init
函数初始化 ES8311 编解码器canon_pcm
)【运行效果】
【程序说明】
【硬件连接】
【代码分析】
【代码修改】
本章介绍 ESP-IDF 环境搭建,包括 Visual Studio、Espressif IDF插件的安装,程序编译下载及示例程序测试,帮助用户掌握开发板,便于二次开发。
esp-idf: configure esp-idf extension
示例程序 | 基础例程说明 |
---|---|
01_AXP2101 | 通过移植后的XPowersLib驱动AXP2101获取电源相关数据 |
02_PCF85063 | 驱动pcf85063进行时间存储读取功能 |
03_QMI8658 | 通过移植后的SensorLib驱动qmi8658获取陀螺仪相关数据 |
04_SD_MMC | 使用sdmmc方式初始化SD卡并读取、写入内容 |
05_LVGL_WITH_RAM | 通过开启双缓存、开启DMA加速防撕裂等方式运行LVGL的demo |
06_I2SCodec | 使用I2S驱动 ES8311 Codec芯片采集或播放音频 |
【程序说明】
【硬件连接】
【代码分析】
【运行效果】
【程序说明】
【硬件连接】
【代码分析】
conf
,设置主设备模式、SDA 和 SCL 引脚、上拉电阻以及时钟频率i2c_param_config
函数配置 I2C 参数。如果配置失败,记录错误日志并返回错误码i2c_driver_install
函数安装 I2C 驱动,将配置应用到实际硬件上,并返回结果data
用于存储读取的时间数据rtc_read_reg
函数从 RTC 芯片的特定寄存器地址(0x04)开始读取 7 个字节的时间数据。如果读取失败,记录错误日志并返回错误码ESP_LOGI
输出格式化的当前时间【运行效果】
【程序说明】
【硬件连接】
【代码分析】
【运行效果】
【程序说明】
【硬件连接】
【代码分析】
fprintf
将数据写入文件【运行效果】
【程序说明】
【硬件连接】
【代码分析】
【程序说明】
【硬件连接】
【代码分析】
【运行效果】
【自定义音频】
用户可以通过下述步骤自定义音频播放片段(需要有一定编程基础)
此款产品的预留焊盘间距为1.27mm,适配铜柱为M2尺寸。
该产品板载ES8311音频编解码芯片,板载扬声器、贴片麦克风。可实现语音对话功能;
目前接入各类平台都已验证完成,支持豆包、文心一言、ChatGPT等主流平台。示例程序将逐步开放至ESP32-AIChats
实测在室温20℃时,开启wifi STA和AP模式,电池处于充电状态。测试半小时通过AXP2101温度数据读取温度最高46℃。在正常放电过程中,温度会降低3~4℃。如若不开启WiFi/蓝牙功能,则可平稳保持36℃左右
该AMOLED屏幕可耐高温,40~60摄氏度不会对屏幕显示、触摸功能造成影响,在高温高湿情况下可能会出现偏光,是属于正常范围内的。
该产品建议使用ESP32-S3的低功耗工作模式完成部分场景的应用。
1、当串口被占用时会烧录失败,将串口监视器关闭重新烧录
2、当ESP32程序崩溃时,烧录会失败,此时需要将开发模块完全断电,按住BOOT再上电进入强下载模式再进行烧录。烧录完不会自动退出下载模式,所以需要再次进行断电重启
注:本产品重新上电需长按PWR按键6s以上,再次按下PWR按键
当工程编译失败时,应当检查开发环境。
这种情况由于程序崩溃,导致USB无法正常工作,可按住BOOT按键再上电,此时模块可进入下载模式烧录固件(程序)即可解决该情况。
Arduino IDE中,首次编译程序是将所有的依赖包都加载编译,所以首次编译任务多,慢属于正常情况,耐心等待即可
重新上电即可
此款产品板载AXP2101,可以测量各类电池数据,如:芯片温度、是否充电、是否接入电源、充电状态、电池电压、充电电压、电池电量等
AXP2101 的电池电量测量基于电池电压,但电池电量并非线性变化,因此测量时可能会出现百分比波动较大的情况。尤其是在插拔充电器、负载变化或者电池老化的情况下,波动会更加明显。测得的百分比只能作为参考,实际需使用电压作为电量衡量。
不提供
可以,此款产品两个按钮为BOOT、PWR功能如下:
1.BOOT:按下之后再上电,开发板进入下载模式(在程序死机或USB GPIO占用时常用);在正常工作情况下,可通过GPIO0检测按钮高低电平判断动作,低电平为按下,可识别单击、双击、多击及长按动作。
2.PWR:在通电状态下,长按6s后可关机,在关机状态下(关机可给电池充电),单击开机;在正常工作情况下,可通过拓展IO的EXIO4及IO5检测按钮高低电平判断动作,高电平为按下,可识别单击、双击、多击及长按(长按不可超过6s,否则关机)动作。
此款产品核心芯片为ESP32-S3R8,支持2.4GHz WiFi、蓝牙5等无线通讯功能,板载贴片天线,天线增益已调节至最优,可支持蓝牙和WiFi的使用。详情需查阅ESP32-S3 datasheet
这款产品使用ESP32-S3R8为核心,QSPI协议连接屏幕,完全支持中文显示,但需要满足下述条件:
1. 需要字符编码支持,支持UTF-8编码的字符串,可以渲染至屏幕
2. 字库支持
3. 显示库支持,LVGL或Arduino_GFX都支持
350nit;
通过QSPI向0x51写入0x00(最暗、关闭背光)~0xFF(最亮)控制亮度。
Arduino中的Arduino_GFX库封装了自定义函数,可通过gfx->Display_Brightness(i)控制背光,i的数值为0(最暗、关闭背光)~255(最亮)。
屏幕显示芯片:SH8601;
屏幕触摸芯片:FT3168
ESP32-S3-Touch-AMOLED-1.8基于ESP32-S3R8芯片,支持ESP-IDF及其生态,可使用ESP-IDF开发,也可以使用arduino-esp32 Core开发。ESP-IDF可与Vscode搭配使用,arduino-esp32可与Arduino IDE或PlatformIo搭配使用。
不防水,使用时需保持干燥
建议电池使用规格为 3.85*24*28 400mAh,常规满亮屏状态下约能使用1小时,仅关闭屏幕背光情况下可运行3~4小时,全低功耗场景下可运行约6小时。 配套电池(仅中国地区)为350mAh。
提供的GFX Arduino LVGL使用的上层驱动是Arduino TFT库,此场景下使用DMA加速处理图像读写能力有限。在ESP-IDF提供的LVGL示例是开启双缓存防撕裂等优化操作优化,所以效果更佳。
在Arduino IDE开发环境下,我们还提供原生的esp_lcd_panel驱动方式,对比Arduino TFT场景下屏幕刷新有明显提升,但效果不如ESP-IDF的示例。
使用时,请将Arduino IDE libraries下的lvgl_conf.h 中 LV_COLOR_16_SWAP改为 1
Arduino_ESP_LCD_LVGL
Windows系统:
①通过设备管理器查看: 按下Windows + R键打开“运行”对话框; 输入devmgmt.msc并按回车键打开设备管理器; 展开“端口(COM和LPT)”部分,这里会列出所有的COM端口及其当前状态。
②使用命令提示符查看: 打开命令提示符(CMD); 输入mode命令,这将显示所有COM端口的状态信息。
③查看硬件连接: 如果你已经连接了外部设备到COM口,通常设备会占用一个端口号,可以通过查看连接的硬件来确定使用的是哪个端口。
Linux系统:
①使用dmesg命令查看: 打开终端。
②使用ls命令查看: 输入ls /dev/ttyS*或ls /dev/ttyUSB*来列出所有的串口设备。
③使用setserial命令查看: 输入setserial -g /dev/ttyS*来查看所有串口设备的配置信息。
ESP32-S3-Touch-AMOLED-1.8的Type-C烧录调试口是ESP32-S3 USB直出的,Arduino IDE开发环境中,支持printf函数打印输出,若想支持Serial函数打印输出则需要使能USB CDC On Boot功能或者HWCDC声明,此类可参考示例代码中的演示。ESP-IDF中通常使用ESP_LOGD、ESP_ERROR_CHECK打印输出。
本产品定位于开发板,并不是成品产品。关于产品生态属于是ESP32核心,生态很成熟,开发环境也很友好,我们不协助修改代码,请各位创客、极客自行发挥DIY能力,如有疑问可以询问工程师为您解答。
如您觉得我们的产品不错,希望批量定制硬件、定制外壳、定制软件等,欢迎联系商务销售
周一-周五(9:30-6:30)周六(9:30-5:30)
手机:13434470212
邮箱:services04@spotpear.cn
QQ:202004841