)
立创SH-201智能太阳能功率表基于ESP32-S2与LVGL的3.2寸屏功率监测方案开源大家好我是安野。最近在折腾家庭太阳能发电监测发现市面上的功率表要么功能单一要么价格不菲于是自己动手设计了一款。这就是今天要跟大家分享的SH-201智能太阳能功率表。它基于ESP32-S2主控搭配一块3.2寸的彩色TFT屏可以实时显示电压、电流、功率还能监测环境温湿度。最关键的是整个项目硬件和软件都是开源的非常适合想学习ESP32开发、LVGL图形界面或者对太阳能监测感兴趣的朋友。这个项目是我B站“低成本家庭发电站”系列的一部分虽然拖更了很久咕咕咕但总算把第一个坑填上了。下面我就从硬件选型、软件框架到如何编译烧录手把手地带大家了解这个项目。1. 硬件设计麻雀虽小五脏俱全SH-201的硬件设计追求的是实用和低成本。别看它体积不大但该有的功能一个不少。1.1 核心主控ESP32-S2为什么选ESP32-S2其实最初版本用的是RP2040但在2022年7月的更新中我把它换成了ESP32-S2。主要考虑有几点Wi-Fi连接潜力ESP32-S2内置Wi-Fi虽然当前固件还没用上但为未来实现数据远程上传、手机App查看留好了硬件基础。性能与资源单核240MHz的Xtensa处理器性能足够驱动图形界面和传感器数据处理。ESP-IDF开发环境也相当成熟。成本与易用性价格合理外围电路简单TYPE-C接口直接供电和下载程序非常方便。1.2 关键传感器与屏幕要让功率表“智能”起来离不开这几个核心器件电流传感器INA199这是测量电流的关键。它是一种基于分流器原理的高侧电流检测放大器。简单说就是在电源正极通路中串联一个很小的精密电阻分流器INA199通过测量这个电阻两端的微小电压差放大后输出给MCU的ADC模数转换器读取从而计算出电流值。这种方案精度高对主回路影响小。温湿度传感器AHT21用来监测功率表所在环境的温度和湿度。AHT21是一款精度不错、性价比高的数字传感器通过I2C总线与ESP32-S2通信获取数据非常方便。显示屏TFT 8K2798驱动的3.2寸屏这是人机交互的核心。一块3.2寸的TFT彩色屏幕显示效果很细腻。驱动芯片是8K2798我们使用LVGL这个轻量级图形库来驱动它实现流畅的UI界面显示电压、电流、功率、温湿度等信息。1.3 一个贴心的小设计背部磁吸为了方便把功率表固定在金属表面或者我特制的墙面上我在PCB背面设计了一个磁吸区域贴了一片强磁铁。这样你可以把它轻松吸在配电箱、机柜或者墙上随时查看不用打孔也不用胶粘。注意烧录程序需要使用专门的「Cube-101_esp-tool烧录调试工具」。烧录时需要将烧录器的TYPE-C口正向插入功率表的TYPE-C口。具体连接方式可以参考下图2. 软件框架ESP-IDF遇上LVGL硬件是骨架软件才是灵魂。SH-201的软件环境搭建有点讲究但一旦配好开发起来很顺畅。2.1 开发环境与系统操作系统我是在Arch Linux下开发的。当然你完全可以在Windows或者Ubuntu下进行ESP-IDF对这些系统都有很好的支持。开发框架ESP-IDF 4.3。这是乐鑫官方的物联网开发框架功能强大包含了操作系统、硬件驱动、网络协议栈等。务必注意版本是4.3不同版本的API可能有差异直接用4.3可以避免很多兼容性问题。2.2 图形库LVGL 7.2驱动那块3.2寸屏我选择了LVGL (Light and Versatile Graphics Library)版本是7.2。它是一个开源、轻量级的嵌入式图形库用C语言编写资源占用小但能实现非常漂亮的界面效果。移植基础我的LVGL移植是基于乐鑫官方的lv_port_esp32项目。这个项目已经帮我们做好了LVGL在ESP32平台上的基础适配如显示驱动、触摸驱动、任务调度等我们在这个基础上开发应用会省事很多。重要提示由于屏幕驱动和项目特定需求我对LVGL的底层函数进行了一些魔改。这意味着我项目里的LVGL驱动代码可能不通用于其他ESP32LCD屏的组合。如果你用的是相同的屏幕8K2798驱动那可以直接用如果是别的屏幕可能需要参考我的代码自行调整底层驱动。2.3 获取源代码所有的软件代码都是开源的你可以从我的GitHub仓库获取https://github.com/panyihang/SH-201_power-moniter提示项目代码还在持续更新和完善中用作者的话说就是“又不是不能用”。非常欢迎各位开发者提出Issue或者提交Pull Request (PR) 一起来完善它3. 手把手编译与烧录指南拿到代码后怎么把它变成运行在板子里的程序呢跟着下面的步骤来。3.1 搭建ESP-IDF开发环境首先你需要在自己的电脑上搭建好ESP-IDF v4.3的开发环境。具体步骤可以参考乐鑫的官方文档。这里假设你已经安装好并且设置了环境变量或者知道如何运行export.sh脚本。3.2 编译工程打开终端按照以下步骤操作进入工程目录使用cd命令切换到你的SH-201_power-moniter项目文件夹。cd /path/to/your/SH-201_power-moniter加载ESP-IDF环境运行ESP-IDF的环境设置脚本。这个脚本的路径取决于你的安装方式。. ~/esp/esp-idf-4.3/export.sh在Windows的ESP-IDF Command Prompt或PowerShell中这一步通常已自动完成编译代码使用idf.py工具进行编译。idf.py build如果一切顺利你会在终端看到编译进度最后生成build文件夹里面就包含了可烧录的二进制文件如bootloader.bin,partition-table.bin,SH-201_power-moniter.bin。3.3 烧录程序到开发板编译成功后就可以把程序烧录到SH-201功率表里了。连接硬件使用前面提到的「Cube-101_esp-tool烧录调试工具」将其TYPE-C口正向插入功率表的TYPE-C口。然后给烧录器接上USB线连接到电脑。执行烧录命令在终端中执行以下命令idf.py会自动检测端口并烧录。idf.py flash烧录过程中你会看到进度条。烧录完成后板子可能会自动重启。关于烧录端口的说明 如果自动检测端口失败你可能需要手动指定端口(PORT)。端口号取决于你的操作系统和使用的烧录工具操作系统手动USB烧录 (如CP2102)使用 Cube-esp-tool 烧录Linux/dev/ttyUSB[X]或/dev/ttyACM[X]/dev/ttyUSB[X]WindowsCOM[X]COM[X]你可以通过系统的设备管理器Windows或ls /dev/ttyUSB*/ls /dev/ttyACM*命令Linux来查看具体的端口号。然后使用idf.py -p PORT flash来指定端口烧录例如idf.py -p /dev/ttyUSB0 flash4. 【彩蛋】打造你的磁吸墙面最后分享一个低成本让任何墙面支持磁吸的方法。这样你就可以把SH-201功率表或者其他带磁铁的小物件随意贴在墙上了。材料准备内墙乳胶漆任何你喜欢的颜色100g就足够了买1kg大概8元别买多。四氧化三铁粉末 (Fe3O4)325目或更细的50g大约4元。注意Fe3O4粉混合后墙面会是黑灰色的无法覆盖原漆色。如果你希望墙面颜色变化不大可以尝试用铁粉(Fe粉)混合后只是微微偏黄但南方潮湿环境容易生锈不推荐。制作步骤混合将乳胶漆和Fe3O4粉末倒在一起充分搅拌直到混合均匀没有颗粒结块。准备墙面在你想要做成磁吸区域的墙面周围贴上美纹纸确保边界整齐美观。涂刷用刷子或小滚筒将混合好的磁性漆涂刷到美纹纸框定的区域内。一定要多涂几遍漆层越厚磁性越强。干燥与完成等待漆面完全干透后撕掉美纹纸。一个自制的磁吸墙面区域就做好了现在你就可以把SH-201功率表稳稳地吸在上面了。这个项目从硬件设计、软件编程到趣味改造涵盖了一个完整开源硬件项目的多个方面。希望它能给你带来一些启发和帮助。如果在制作过程中遇到任何问题欢迎来交流讨论。