【Designed by SoTWild】![](https://img.shields.io/badge/My Website-当代研究所-brightgreen.svg)
[Engilsh|简体中文]
ESP-HMI 是 Link 设备链中的一个,是整个项目最难开发的部分,主要提供远程直接开关设备、数据汇总(设备监控)。
我还开发了一些针对不同人群的功能:文本阅读、编辑、图片查看、播放MJPEG视频、运行小程序等。如果你是开发者,你也可以对它进行二次开发。(普通人可以把它看做一个功能极其简单的小电脑)
为了高效率运行程序,我移植了 FreeRTOS 操作系统,使得主控芯片可以 “同时” 运行多个程序。
本文档很长,见谅。
硬件上有一两个元件最小封装为0201,软件已经开源,综合来看很容易复刻。
充电芯片采用TP4056,可以通过配置PROG引脚控制充电电流,我这里使用了500mA充电电流,电池为4000mAh聚合物锂电池,理论上可以供电超过26小时,充电时间约为8小时。(运行电流约为150mA)
全面屏,3.5吋TFT屏幕,长$$8.5cm$$,宽$$5.5cm$$,厚$$12mm$$(不加电池)。
目前测试最大为**$$32G$$**,再大应该不行。
ESP32-D0WD-V3 双核,模组为ESP32-WROVER。
Visual Studio Code + Platform IO
2021.09.05:开始构思
2021.10.22:成功播放 Mjpeg 视频
2021.10.23:在 Mjpeg 基础上,添加了 pcm 背景音乐
2021.12.19:成功驱动 XPT2046 触摸芯片并运行了 LVGL demo
2021.12.21:优化 Mjpeg 240*320 像素,帧率最高 8.9FPS
2021.12.25:解码 jpg 文件;完成 ESP-IED Ver 1 PCB 的绘制
2021.12.26:编写画图程序
2021.12.30:编写 MP3 程序
2022.01.01:ESP-HMI Ver 1 直插板成功搭建
2022.01.02:开始编辑源代码
2022.01.02:添加 Media Player 中 Mjpeg 播放功能
2022.01.03:添加 Media Player 中 Jpeg 播放功能|添加 Media Player 中 MP3 播放功能
2022.01.09:添加 Media Player 中 PCM 播放功能
2022.01.09:添加 Media Player 中 TXT 播放功能
2022.01.12:添加 Draw 功能
2022.01.12:添加 THMini 功能
2022.03.28:添加 Album 功能
2022.03.28:添加 Ebook 功能
2022.03.29 :代码优化
2022.04.01:蓝牙音频传输(接收)
2022.04.05:开始编写 Sounder
2022.04.10:完成编写 Sounder
2022.04.13:开始编写 Vision
2022.04.14:完成编写 Vision
2022.04.17:完善 Ebook
2022.04.18:开始并完成编写 Settings
2022.04.22:绘制 Ver 1 原理图
2022.05.02:用户登陆系统
2022.07.05:计算器(普通)
2022.07.08:温度计
2022.07.12:文件上传
2022.07.14:WiFi
2022.07.30:Ver 1 PCB完成
2022.08.12:Ver 1 PCB调试完成
2022.08.13:添加Task Manager
2022.08.14:完成Album功能;编写文档
2022.08.15:编写文档
2022.08.16:修改Task Manager|Debug Vision
2022.08.19:完善Album
2022.08.21:开始编写 東方微型行
2022.08.29:修复了用户名长度的问题|添加bat快捷转换器
ESP32-WROVER 系列模组基于 ESP32-D0WD 双核芯片设计,其强大的双核性能适用于对内存需求大的应用场景,例如多样的 AIoT 应用和网关应用。
ESP32-WROVER 模组屏幕模块驱动芯片:ILI9488
通讯接口:SPI
触摸芯片:XPT2046
最大 32G,推荐 4 或 8G。
32G TF卡SHT30能够提供极高的可靠性和出色的长期稳定性,具有功耗低、反应快、抗干扰能力强等优点。
轻松实现城市环境监控、智能楼宇、工业自动化、智能家居等物联网应用场景的温湿度传感。
- 主芯片(传感器):Sensirion SHT30
- 供电电压(VCC):3.3V ~ 5.5V
- 通信接口:Gravity Analog (PH2.0-3P,模拟电压输出0.3-2.7V)
- 工作电流:< 0.5 mA
- 产品尺寸:30×22 mm
- 重量:3 g
温度测量性能:
- 量程:-40 ~ 125 ℃
- 分辨率:0.01 ℃,14bit
- 精度:±0.2℃@10~55℃(典型值),±1.5℃@-40 ~ 125 ℃(典型值)
- 响应速度:> 2s
湿度测量性能:
SHT30
- 量程:0~100 %RH
- 分辨率:0.006 %,14bit
- 精度:±3 %RH@10
90 %RH(典型值),±8 %RH@0100 %RH(典型值)- 响应速度:> 8s
PCF8563 是 PHILIPS 公司推出的一款工业级内含I2C 总线接口功能的具有极低功耗的多功能时钟/日历芯片。是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、电话、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。
PCF8563 模块MPU-60X0 是全球首例 ⑨ 轴运动处理传感器。它集成了3 轴MEMS陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP,可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C 或 SPI 接口输出一个⑨轴的信号(SPI 接口仅在MPU-6000 可用)。
MPU-60X0 对陀螺仪和加速度计分别用了三个16位的ADC(0~65535),将其测量的模拟量转化为可输出的数字量。传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为±2,±4,±8,±16g。
芯片尺寸4×4×0.9mm,采用QFN封装,可承受最大10000g的冲击,并有可编程的低通滤波器。
MPU6050模块USB转串口芯片,支持通讯波特率50bps~2Mbps。
此型号内置时钟,无需外部晶振。
搭载了CH340C的串口下载模块PW2053是一款高效单片同步降压调节器。
没找到实物图……TP4056 是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。
著名的充电模块WT8302系列是一款超低EM.3.0W,单声道,D类音频功率放大器。在5V电源下,能够向4Ω负载提供3.0W的输出功率,并具有高达**90%**的效率。
没找到实物图……只有最基础硬件(包括SHT30),注意 GPIO2 在烧录程序时需断开,如果你要频繁烧录程序,最好 PCB上飞线一个开关,或者拔下开发板(如果你愿意的话)。
验证板(1)T_CLK应连接IO0而不是IO25,已经在最新的PCB中改正。
(2)不要在意有两个ESP32开发板的插槽
硬件齐全,自动烧录,配备电池。
(1)DC-DC电源部分电感封装大小错误。解决办法:可以勉强焊接
(2)R15连接Strapping引脚导致无法启动。解决方法:不焊接R15
(3)PCF8563设计缺陷,晶振波形错误。解决方法:重新设计
(4)T_CLK应连接IO0而不是IO25,原理图已改正,PCB未改正。解决办法:飞线
(5)WT8302设计缺陷,杂音。解决方法:重新设计
未更正 飞线后ESP-HMI配有极为先进的USB Type-C接口,作为供电和通信。
SW7为DC-DC芯片的使能开关,实现小开关控制大功率开关。
U9连接的为震动马达。
SW3连接IO35,可以自由配置为中断引脚或其他功能。
板载5V、3.3V、BAT、SDA、SCL触点,方便调试。
ID | Name | Designator | Footprint | Price |
---|---|---|---|---|
1 | 10uF | C1,C5 | C0603 | |
2 | 1uF | C2 | C0603 | 0.0391 |
3 | 22pF | C3 | C0603 | 0.0573 |
4 | 0.1uF | C12 | C0603 | 3.29 |
5 | 1uF | C15 | C0603 | 0.0351 |
6 | 15pF | C16,C17 | C0603 | 0.0883 |
7 | 22uF | C4,C11 | C0805 | 3.29 |
8 | 0.1u | C6 | 1206 | |
9 | 100nF/50V | C7,C9 | 0603_C_JX | |
10 | 10μF/10V | C8,C10 | 0805_C_JX | |
11 | 104 | C13,C18 | C0805 | |
12 | 100nF | C14 | 603 | 0.0082 |
13 | 104 | C19,C22 | C 0603 | |
14 | 103 | C20 | C 0603 | |
15 | 2.2NF | C21 | C 0603 | |
16 | 104 | C23 | C0603 | |
17 | 1uF | C24 | C0603 | 0.032 |
18 | HYC77-TF09-200 | CARD1 | TF-SMD_HYC77-TF09-200 | 0.9401 |
19 | PJ-327A 5JJ | CN1 | AUDIO-SMD_PJ-327A5JJ | 0.5698 |
20 | IN4007 | D1,D2 | SMA_L4.3-W2.6-LS5.1-RD | |
21 | 触点 | 5V,BAT,3.3V,SDA,SCL | 触点 | |
22 | 2.2UH_0520 | L1 | IND-SMD_L2.5-W2.0 | |
23 | AFC07-S40ECA-00 | LCD1 | FPC-SMD_P0.50-40P_LCS-SJ-H2.0 | 1.1266 |
24 | Red/LED | LED1 | 0603_D_JX | |
25 | Green/LED | LED2 | 0603_D_JX | |
26 | S8050 | Q1,Q2 | SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR | 0.0702 |
27 | RU8205C6 | Q3 | SOT-23-6 | 0.3144 |
28 | S8050LT1-J3Y | Q5 | SOT-23_L2.9-W1.3-P1.90-LS2.4-BR | 0.1207 |
29 | 220R | R1,R2 | R0603 | |
30 | 10k | R4,R5,R6,R7,R29 | R0603 | |
31 | 1k | R3 | 805 | |
32 | 100 | R8 | 805 | |
33 | 0.25R/1% | R9 | 1206_R_JX | |
34 | 10k/1% | R10 | 0603_R_JX | |
35 | 2k/1% | R11 | 0603_R_JX | |
36 | 1.2k/1% | R12 | 0805-R | |
37 | 45K | R13 | R0603 | 0.0135 |
38 | 10K | R14,R15,R16,R17,R18,R19,R25 | R0603 | 0.0132 |
39 | 100kΩ | R21 | R0603 | 0.0075 |
40 | 10K | R20,R22,R23 | R0402 | 0.0038 |
41 | 10k | R24 | R0805 | |
42 | 1k | R26 | R0603 | |
43 | 10K | R27 | R0603 | |
44 | 10K | R28 | R 0603 | |
45 | 10K | R30 | RES-ADJ-TH_R1001B | 0.504 |
46 | 10k | R31,R32 | R0603 | 0.0066 |
47 | TA-3525-A1 | SW1,SW2,SW4,SW7 | SW-SMD_3P-L9.1-W3.5-P2.50-EH6.8 | 0.8578 |
48 | TS-KG012EV | SW3,SW5,SW6 | SW-SMD_TS-KG012EV | 0.3602 |
49 | CH340C | U1 | SOP-16_L10.0-W3.9-P1.27-LS6.0-BL | 2.66 |
50 | ESP32-WROVER-E(4MB) | U2 | WIFIM-SMD_39P-L31.4-W18.0-P1.27 | 33.11 |
51 | PW2053 | U3 | SOT-23-5_L2.9-W1.6-P0.95-LS2.8-BL | |
52 | 3P金手指 | BAT,U9,U12 | 3P金手指 | |
53 | TP4056_JX | U5 | SOP8_150MIL_JX | |
54 | PCF8563M/TR | U6 | SOP-8_L4.9-W3.9-P1.27-LS6.0-BL | 1.1374 |
55 | DW01+ | U7 | SOT-23-6-L | |
56 | SHT30-DIS-B | U8 | DFN-8_L2.5-W2.5-P0.50-BL-EP | 6.48 |
57 | WT8302-MSOP-8 | U10 | MSOP-8_L3.0-W3.0-P0.65-LS4.9-BL | |
58 | MPU-6050-24PIN-440.9 | U13 | QFN24 | |
59 | XPT2046 | U14 | TSSOP-16_L5.0-W4.4-P0.65-LS6.4-BL | 3.31 |
60 | TYPE-C16PIN | USB1 | USB-C-SMD_TYPE-C16PIN | 1.5593 |
61 | - | X2 | OSC-SMD_BD2.0-P2.54_TMXLI-206F32.768KHZ12.5PF20PPM | 1.2412 |
本人一切嵌入式皆为自学,原谅我写成屎山或执行效率不高
void Mjpeg_start(const char *MJPEG_FILENAME, const char *AUDIO_FILENAME);
这是进行 Mjpeg 视频播放,源代码由Play Video With ESP32修改而来,详情见MjpegClass.h。
void drawSdJpeg(const char *filename, int xpos, int ypos);
这是绘制 .jpg 格式图片,源代码由Bodmer/JPEGDecoder修改而来。
void MP3_start(const char *filename);
这是进行 .mp3 格式音频的播放,源代码由ESP8266Audio修改而来。
void PCM_start(const char *AUDIOFILENAME);
这是进行 .pcm 格式音频的播放,源代码由Play Video With ESP32修改而来。
String readFileLine(const char* path, int num);
读取 .txt 文本的某一行,源代码来自peng-zhihui/HoloCubic。
void BleAudio();
蓝牙音频接收,来自ESP32-A2DP。
void CreatCrollWords(int IWIDTH, int IHEIGHT, int WAIT, int X, int Y,int size,int font, uint16_t TextColor, String msg);
创建滚动文字,修改自TFT_eSPI。
void GetfromMometer();
从SHT30获得温湿度数据,修改自SHT3x: Arduino library for Sensorion SHT3x。
void getNetTime();
获取网络时间,修改自NTPClient。
void WiFiInit(String Mode);
初始化网络,可选STA/AP模式。
void File_transfer_init();
无线文件传输功能,修改自教你做一个ESP32-SD卡服务器_哔哩哔哩_bilibili
Main.h 这是应用:
Sounder 音乐播放器
Vision 视频播放器
画图
Ebook 电子书阅读器
Game 小游戏
Album 相册
Settings 设置
Calculator计算器、函数绘图器
Thermometer温湿度计
文件上传
网络
任务管理器(资源查看器)
MjpegClass.h 这是mjpeg解码库。
main.cpp 开机时执行的程序,包括:
1)加载串口
2)屏幕初始化
3)触摸初始化
4)挂载SD卡
5)连接 Wi-Fi
6)读取设置文件
7)用户登录
8)运行 MainPage(); 主页程序
主要有两个文件夹:
**System:**包含系统配置信息、应用图标、默认图标、控件图标等
**User:**各用户文件
注:封面图片大小需 ≤ 240 x 240。
.jpg的路径:/User/登录的用户名/Data/Music/MusicCover/xxx.jpg
.mp3的路径:/User/登录的用户名/Data/Music/MusicData/xxx.mp3
特点:只要添加(合适)名称的.mp3文件和同名的封面文件,系统即可自动识别音乐文件和封面文件。
核心实现方法:依靠以下函数每次开机时读取指定位置的文件并将文件路径写入对应的配置文件中。
然后系统调用readFileLine();
函数读取配置文件,得到目标文件位置。
void listDir(fs::FS &fs, const char * dirname, uint8_t levels);
void appendDir(fs::FS &fs, const char * dirname, String filename, uint8_t levels);
/User/登录的用户名/Config/MusicCoverConfig.txt
/User/登录的用户名/Config/MusicConfig.txt
注:系统首先通过截取字符串从读取到的文件路径中获取文件名,用户选中文件名后再填补出文件路径。
取字符串的前i个字符:
str=str.substring(0,i);
去掉字符串的前i个字符:
str=str.substring(i);
从右边开始取i个字符:
str=str.substring(str.length()-i);
str=str.substring(str.length()-i,str.length());
从右边开始去掉i个字符:
str=str.substring(0,str.Length-i);
sizeof(str)
获取字符串长度。
(str).c_str()
String转char。
和Sounder的实现方法大同小异,添加了显示封面图片的功能。
原因:系统读取VideoCover
文件夹内文件,根据封面文件名截取字符串得出文件名,后添加后缀得出其余文件名。
注:封面大小需 ≤ 180 x 100。
.jpg的路径:/User/登录的用户名/Data/Video/VideoCover/xxx.jpg
.mjpeg的路径:/User/登录的用户名/Data/Video/VideoData/xxx.mjpeg
.pcm的路径:/User/登录的用户名/Data/Video/VideoData/xxx.pcm
.mp4转.mjpeg的方法:下载ffmpeg,Play Video With ESP32,使用指令:
ffmpeg -i input.mp4 -vf "fps=30" output.mjpeg
注:可以用ffmpeg调整视频序列设置或者提前准备合适的视频。
这是**.mp4转.pcm**:
ffmpeg -i input.mp4 -f u16be -acodec pcm_u16le -ar 44100 -ac 1 output.pcm
修改自TFT_Touch库中的Draw实例。
和Sounder的实现方法大同小异,添加了显示封面图片的功能。
读取文件函数为String readFileLine(const char* path, int num);
注:封面大小需 ≤ 140 x 200。
.jpg的路径:/User/登录的用户名/Data/Ebook/EbookCover/xxx.jpg
.mjpeg的路径:/User/登录的用户名/Data/Ebook/EbookData/xxx.txt
移植了同人作品**《玩弄蕾米莉亚的红色恶魔晚餐》中“咲夜时停搬物”**游戏。
相当简单
/User/登录的用户名/Data/Game/TouHou/
和Sounder的实现方法大同小异。
注:图片大小需 ≤ 480 x 320。
/User/登录的用户名/Data/Image/
待修改完善。
核心函数String::toFloat(void)
触摸键盘添加字符串,再将字符串转换为可运算的数据类型。
某些计算会有误差
函数绘图器未编写完成。
单纯刷屏
修改自教你做一个ESP32-SD卡服务器,添加了在线查看功能、不同用户分区功能、用户名密码登录功能。
使用AP模式直连ESP32时文件下载速度最高可达350KB/s,稳定在330 ~ 350KB/s。
使用STA模式将ESP-HMI连接至路由器时下载速度最高327KB/s,稳定在200KB/s(路由器旁)。远离路由器时只有18KB/s,因此推荐使用AP模式。
/User/登录的用户名/Data/upload/
可以选择AP模式或STA模式。
CPU:频率、运行时间
RAM:芯片RAM、SPI RAM
ROM:Flash大小、Flash速度、SD卡大小
Battery:电池电压、剩余百分比、预计使用时间
WiFi:当前模式、IP地址、SSID、MAC地址
Temperature:温度(不是CPU温度)
后续会添加真正意义上的“任务管理”功能。
(1)PCB上要将IO25与XPT2046的T_CLK断开,将T_CLK和IO0连接。
原因:IO25和IO26为ESP32 DAC 的两个通道,音频输出时与触摸屏时钟信号冲突,会导致音频播放时(后)无法触摸。
(2)如果追求完美,建议重新设计WT8302和PCF8563的电路,并且将DC-DC设计在偏僻位置。
原因:原设计有缺陷,根据信号测量可以判定失败。
电源纹波 晶振波形,已经失控了(3)音频质量有限,但还是能接受。
原因:ESP32 DAC 精度为 8-bit,理论只可以输出256个值。
放大后的音频波形(4)在(1)中,断开IO25
后,可以将其连接上耳机插座,实现双声道。
原因:ESP32 中,IO25
为 DAC Channel 1,是左声道;IO26
为 DAC Channel 2,是右声道。原设计中耳机的两声道并联,由 IO26
提供右声道信号。
(5)注意屏幕插座要买插接上接式40p插座,而不是翻盖式。
原因:翻盖式虽然好用,但一开始设计是插接式,没注意到,是我踩过的坑。
(1)使用了两个TFT库(TFT_eSPI、Arduino GFX),分别负责绘制GUI和播放Mjpeg视频。
(2)不同的触摸模块需要配置(校准、设置旋转方向)
void setCal(uint16_t xmin, uint16_t xmax, uint16_t ymin, uint16_t ymax, uint16_t xres, uint16_t yres, boolean axis);
void setRotation(byte rotation);
注:代码中setRotation
有多处需要修改。
(3)在TFT_eSPI库/User_Setups/Setup21_ILI9488.h
中,设置了SPI_FREQUENCY
为40MHz,80MHz会出现花屏现象。
注:若将屏幕更换为ST7796驱动芯片的类型再优化PCB布线可能会解决花屏问题(待测试)
修改前的CLK信号:40MHz 修改后的CLK信号:80MHz(4)本项目文件夹中SD
文件夹内名为NewUserDemo
的文件夹用途是创建新用户时复制粘贴到User
文件夹内以生成文件系统
用的。
(5)电池电压和百分比的计算方法比较粗糙,百分比算法是: $$ \frac{采样值-关机电压}{满电电压-关机电压}\times100% $$ 这里设置关机电压为$$3.5V$$。则代码算法是: $$ BatteryLevel=\frac{GetBatteryVol()-3.5}{0.7(4.2V-3.5V)}\times100% $$ 如果要遵循电池放电曲线,提高精度,需要使用积分计算。
计算剩余使用时间的方法是:
$$
\frac{电池百分比\times电池容量}{系统耗电电流}(小时)
$$
如果要计算到分钟,只要再
代码算法是: $$ GetBatteryRemainingTime=\frac{GetBatteryLevel()\times4000}{150} $$ 这里设置电池容量为$$4000mAh$$,耗电电流为$$150mA$$。
(6)烧录完成后ESP32无限重启:重新烧录。
原因:未知。
(1)到SoTWild/ESP-HMI: 基于 ESP32-WROVER 的人机界面 (github.com)这个页面选择Code -> Download ZIP
下载压缩包。
如果出现404错误,可以在本地一个文件夹按 Shift 再右键打开 Power Shell 窗口使用
git clone https://github.com/SoTWild/ESP-HMI.git
这个命令克隆存储库(前提是安装了git)。
ESP32-HMI:右键“通过 Code 打开”可以修改**.ini配置文件后直接加载Platform IO编译上传。或者将
include
和src
文件夹合并**,将lib
文件夹中的库导入,使用 Arduino IDE 打开。Images:文档使用的图片
PCB:两版设计,包括原理图、PCB图和嘉立创EDA文件
SD:里面文件是TF卡内应装载的
LICENCE:GNU 协议
README.md:文档
README-EN.md:英文文档(还没有添加)
(2)下载Gerber文件,送板厂打样
注:由于是4层PCB,若要黑色阻焊层,得加钱。
(3)根据BOM表购买元件焊接
(4)将SD文件夹中文件复制到准备好的TF卡内
(5)上传程序,装配TF卡
(6)调试
(7)完成
Bodmer/JPEGDecoder: A JPEG decoder library (github.com)
peng-zhihui/HoloCubic: 带网络功能的伪全息透明显示桌面站 (github.com)
arduino-libraries/NTPClient: Connect to a NTP server (github.com)
教你做一个ESP32-SD卡服务器_哔哩哔哩_bilibili
另外有些出处找不到了,可以的话请告知我。
该项目从2021年09月05日开始构思,目前为止基本要完成了。它几乎代表了我的最高技术力,希望该项目能为开源事业添砖加瓦。
在开发过程中,我也吸取到不少经验和教训,这里尽量分享出来,希望能帮助到各位。