一、项目介绍和创意介绍
本项目选择方向四:绿色能源,太阳能能量采集
本项目面向小型太阳能供电或储能应用场景,设计一套可以本地联网、实时显示、后续可继续扩展的储能方案。
为了直观的观察当前太阳能板输入功率是多少、蓄电池侧实际获得了多少功率、充电效率高不高、当前系统处于待机、弱光还是充电中状态,本项目提出了一个更接近真实应用的创意方向:用两颗 INA226 分别监测太阳能输入侧和电池充电侧,通过 ESP32-C6 完成采样、计算和联网,将充电信息实时显示到LCD屏幕中。并内置一个 WebServer,把“发电状态”直接做成网页仪表盘,用户通过手机或电脑浏览器也能实时查看。
本项目的创意价值主要体现在三个方面。第一,把硬件测量和可视化结合起来,能够更容易的查看当前的实时状态。第二,它同时监测输入侧与输出侧,因此不仅能显示原始测量值,还能进一步计算充电效率,这比单点测量更有工程意义。第三,它具备较好的扩展性,后续可以接入历史曲线、异常告警、远程上报、低功耗休眠、蓝牙配网,甚至与家庭能源管理场景结合。

二、使用到的硬件介绍
1. ESP32-C6 主控模块
ESP32-C6-MINI-1U-H4 是本项目的核心控制器。它具备 Wi-Fi 能力,能够在本地局域网中运行 Web 服务,同时也有较好的性能和丰富的外设接口,适合做小型能源监测节点。本项目中,ESP32-C6 主要完成以下任务:
- 系统上电初始化,包括 NVS、日志、事件循环等基础功能。
- 初始化 I2C 总线,并完成总线设备探测。
- 驱动两颗 INA226 传感器,周期性读取电压、电流和功率信息。
- 计算太阳能输入功率、电池充电功率以及充电效率。
- 以 Wi-Fi Station 模式接入路由器。
- 驱动SPI LCD,实时显示充电状态。
- 启动嵌入式 HTTP 服务器与 WebSocket 服务,向浏览器实时提供数据。
相比单纯使用LCD,本项目利用 ESP32-C6 的网络能力,把显示终端从本地小屏扩展到了浏览器。
2. INA226 电流电压功率监测芯片
本项目使用两颗 INA226 来完成双路能量采样。INA226 是一款常用于电流、电压和功率测量的高精度数字监测芯片,采用 I2C 接口,适合与 ESP32-C6 这类主控配合使用。根据当前软件实现:
- U3 地址为 0x40,用于测量太阳能板输入侧电压、电流和功率。
- U5 地址为 0x45,用于测量电池充电侧电压、电流和功率。
- 两路采样的分流电阻均为 10mΩ。
- 太阳能侧最大预期电流按 10A 标定,电池侧最大预期电流按 5A 标定。
采用双 INA226 的优点在于,系统可以同时掌握能量流动的“入口”和“出口”,从而计算效率,而不仅仅是显示某一路孤立数据。这一点使得本项目在功能上从“监测”迈向了“分析”。
3. 太阳能板与蓄电池部分
太阳能板是系统能量输入来源,蓄电池则是能量存储与输出对象。本项目采用如韵电子CN3791方案,CN3791 是一款可使用太阳能板供电的 PWM 降压模式单节锂电池充电管理集成电路,独立对单节锂电池充电进行管理。
太阳能板输出会随着光照变化而波动,因此系统需要持续监测输入功率;电池侧在不同荷电状态下,其充电电流和功率也会变化。项目通过双路测量,把太阳能板发出来的电和电池实际吸收到的电对应起来,这样就能更准确地评价系统工作状态。

4. 电源管理电路
系统的电源管理部分涉及 MT3608 和 RT9013 两类器件。这里踩了一个坑:MT3608 是升压芯片,不能用于把高于 3.3V 的电池电压直接降到 3.3V。当电池电压本身高于 3.3V 时,MT3608 无法实现稳定降压输出。最早使用两路MT3608从VBAT取电,VBAT电压为4.1V,不能通过降压到3.3V。后续修正方案是先通过升压链路得到 5.0V,再使用 LDO 芯片 RT9013 将 5.0V 稳压到 3.3V,为 ESP32-C6 和相关数字器件供电。
三、方案框图和项目设计思路介绍
1. 系统方案框图

2. 项目设计思路
本项目整体采用“测量层 + 计算层 + 通信层 + 展示层”的设计方法。
测量层由两颗 INA226 和 I2C 总线构成。主控上电后初始化共享 I2C 总线,并探测总线上的设备,随后分别初始化太阳能侧和电池侧监测芯片。这里的设计重点是把两个测量通道的职责彻底分开,保证输入侧和输出侧数据来源清晰。
计算层负责把采样值组织成具有实际意义的系统状态。软件不只保存原始电压、电流和功率,还进一步给出效率百分比,并根据功率区间判断当前状态属于离线、待机、弱光低功率、发电中还是充电中。经过这样的处理可以直接观察到系统工作状态。
通信层利用 ESP32-C6 的 Wi-Fi 功能,以 Station 模式接入局域网。联网成功后启动内置 Web 服务器,根路径返回网页,/api/status 返回 JSON 快照,/ws 提供 WebSocket 实时推送。这个组合兼顾了“兼容性”和“实时性”:HTTP 便于调试和普通请求访问,WebSocket 便于动态刷新页面。
展示层使用嵌入式网页实现可视化界面。网页重点显示太阳能输入功率、电池充电功率、输入输出电压电流、效率以及当前状态说明。用户不需要额外安装 App,只要在同一网络中访问设备 IP 即可使用。这种方案特别适合竞赛演示,因为展示直观,交互门槛低,也方便评委快速理解作品价值。
四、原理图和 PCB 介绍
1. 原理图设计说明
根据项目原理图,系统硬件可以分为六个功能区块:
- CN3791 单节锂电池充电管理集成电路。
- 主控与通信模块:以 ESP32-C6 为核心,实现数据采集、处理和联网。
- 输入测量模块:使用 INA226 U3 监测太阳能板输入侧。
- 输出测量模块:使用 INA226 U5 监测电池充电侧。
- 电源管理模块:由升压与稳压器件组成,为主控和测量电路提供稳定工作电压。
- 显示模块:SPI LCD,分辨率172*320。
在原理图审查过程中,发现了两处非常重要的问题。
第一处错误是 INA226 的 SDA 与 SCL 连接反了。由于 INA226 采用 I2C 通信,如果时钟线和数据线接反,芯片将无法被正常识别,软件层面会表现为设备初始化失败、总线扫描找不到器件或者读写超时。这个错误说明在原理图阶段,对接口定义的核对还不够严谨。解决方法是重新梳理 I2C 网络标号,确保 ESP32-C6 的 SDA 接到 INA226 的 SDA,SCL 接到 INA226 的 SCL,并在 PCB 布线和样机焊接前再次进行 ERC/连通性检查。
第二处错误是电源设计中试图让 MT3608 输出 3.3V。MT3608 本质上是升压芯片,不具备把高于目标电压的输入降到 3.3V 的能力。当电池电压高于 3.3V 时,这一路设计就无法正常实现稳定供电。修正思路是引入 RT9013 LDO,将升压后的 5.5V 再稳压为 3.3V,作为系统数字电源。这个修改说明电源设计不能只关注“最终想要 3.3V”,而必须结合器件拓扑本质判断它究竟是升压、降压还是线性稳压器件。

2. PCB 设计
PCB 设计的重点主要有以下几个方面:
- INA226 采样回路应尽量靠近分流电阻布局,减小走线电阻和外部干扰对测量精度的影响。
- I2C 线长应尽量短,并避免与大电流回路长距离平行布线,以降低串扰风险。
- 太阳能板输入、电池充电支路和 3.3V 数字电源应明确分区,保证电源路径清晰。
- 电源部分需要预留充分去耦和滤波电容,保障 Wi-Fi 发射和测量采样同时进行时系统供电稳定。

五、软件流程图和关键代码介绍
1. 软件总体流程图


2. 软件架构说明
软件层面主要由四个模块组成。
第一是主程序模块。station_example_main.c 负责系统启动、Wi-Fi 连接、I2C 总线初始化、任务创建以及 Web 服务启动。虽然文件名沿用了示例工程命名,但其内部已经演进为完整的应用主入口。
第二是 INA226 驱动模块。ina226.c 和 ina226.h 封装了寄存器配置、校准参数计算、总线电压读取、分流电压读取、电流读取和功率读取等基础功能。驱动初始化时还读取厂商 ID,有助于判断器件是否工作正常,这对调试阶段很有价值。
第三是太阳能监测模块。solar_monitor.c 是整个项目的核心业务层。该模块分别初始化太阳能侧与电池侧的 INA226,并在任务循环中周期读取两路数据。软件根据两路功率计算充电效率,并把结果写入共享结构体 solar_data_t 中,供网页服务读取。
第四是 Web 展示模块。webserver.c 内置 HTML 页面、状态 JSON 接口与 WebSocket 服务。浏览器进入页面后,可以实时接收电压、电流、功率、效率和状态字符串,形成较为完整的前端展示界面。
3. 关键代码介绍
(1)双 INA226 采样设计
项目将 U3 和 U5 分别映射到不同地址,这种方式让两路测量天然具备独立性。软件中分别配置了不同的最大预期电流,以便计算合适的校准系数,从而兼顾量程和精度。太阳能侧配置为 10A,电池侧为 5A,符合“输入功率较大、输出侧相对可控”的设计预期。
(2)效率计算逻辑
效率的计算方式为:

在软件中,为了避免除零错误,只有当太阳能输入功率大于一个较小阈值时才进行效率计算;同时对结果做 0% 到 100% 的裁剪。这样的处理体现了工程上对异常情况的考虑,避免了在弱光、空载或瞬时波动时网页显示出不合理的数值。
(3)状态判定逻辑
网页中并不仅仅显示数值,还会根据功率情况显示不同状态,例如 offline、idle、weak、generating、charging。这种做法的意义在于,把低层物理量转换成用户更容易理解的系统语义。例如评委在演示现场并不一定会立刻理解 0.12W 与 1.85W 的差异,但如果页面直接显示“弱光低功率”或“充电中”,理解成本就会明显降低。
(4)共享数据与并发访问
太阳能监测任务和网页服务任务之间通过共享结构体交换数据。结构体内部带有互斥锁,读取和写入都经过保护,这样能够避免在多任务环境下出现数据竞争。这个设计虽然基础,但非常关键,因为任何实时监测系统只要涉及采集任务和展示任务并行运行,就绕不开数据一致性问题。
(5)网页实时推送
项目使用 HTTP + WebSocket 的组合方式。HTTP 负责页面加载和快照查询,WebSocket 负责周期广播实时数据。这样做的优点在于:
- 初次打开页面时可以先通过 HTTP 快速拿到当前状态。
- 页面建立 WebSocket 后可以低延迟持续刷新。
- 即使 WebSocket 中断,也可以通过重新连接和快照请求恢复展示。
这一设计比纯轮询方式更高效,也更符合实时监测页面的交互习惯。
六、功能展示图及说明
1. 功能展示内容
- 硬件实物连接图:展示太阳能输入、电池支路、ESP32-C6 与双 INA226 的连接关系。下面是使用正点原子的电源模拟太阳能电池板,设置为和电池板工作电压差不多的19V。充电时右边的状态灯为红色。

- 本次使用的太阳能电池板:开路电压21V,工作电压18V

- 场外测试运行日志:测试时有云层,发电功率不是太高,也有可能和我使用的电池有关系,这几块锂电池是7-8年前用的,带保护板,限制了充电速度。可以看到充电效率85%左右。

- 网页主界面图:太阳能输入功率、电池充电功率、效率和当前发电状态。

- LCD显示效果

2. 功能说明
设备上电后,ESP32-C6 先完成基础初始化,然后扫描 I2C 总线并尝试初始化两颗 INA226。若器件连接正常,系统开始周期采集太阳能输入侧与电池充电侧的电压、电流和功率,并在内部计算效率。随后,设备连接到预设 Wi-Fi 网络,获取 IP 地址后启动 Web 服务。用户只需在浏览器输入设备 IP,即可打开“太阳能发电状态 WebServer”页面,实时看到系统当前运行情况。
在展示效果上,网页不再出现无关的传感器信息,而是专门围绕太阳能系统本身展开,界面能够直观回答“当前是否在发电”“是否正在给电池充电”“效率大概多少”这些核心问题。这种聚焦性让作品主题更加鲜明,也提升了演示时的信息密度和说服力。
如果正式提交竞赛材料,建议在本节中补充真实截图,例如:太阳能板无遮挡时的“充电中”界面、弱光环境下的“弱光低功率”界面,以及串口日志中 INA226 初始化成功和网页访问成功的截图。这样可以让报告从“说明文字”进一步升级为“证据链完整”的工程文档。
七、设计中遇到的难题和解决方法
1. 原理图中 I2C 连线错误
在硬件设计审查过程中,发现 INA226 的 SDA 与 SCL 被接反。这会导致 I2C 通信完全失败,进而让系统误以为芯片不存在。解决方法是重新校对接口定义、统一网络标号,并在样机焊接前通过原理图检查和实物连通性测试进行二次确认。这个问题提醒我,数字接口虽然只有几根线,但越是“看起来简单”的地方,越容易因为疏忽产生致命错误。

2. 电源设计思路错误
另一个较大的问题出现在电源设计上。最初方案中想通过 MT3608 获得 3.3V,但 MT3608 是升压芯片,不适合在电池电压可能高于 3.3V 的情况下直接得到 3.3V 输出。这个思路本质上把器件能力理解错了。后续修正为通过 RT9013 LDO 将 5.5V 稳压到 3.3V。这个问题让我更深刻地认识到,做硬件设计时不能只靠“经验上觉得差不多”,而必须从器件拓扑和工作条件出发进行推导。

3. 双路能量测量的数据一致性问题
因为本项目需要同时读取输入侧与输出侧数据,所以不能仅仅把两个数值分别打印出来,而必须从系统角度统一组织数据,并在合适时间点进行效率计算。为此,软件中把两路数据集中存储在共享结构体中,并通过互斥锁保护访问。这样页面读取到的数据在逻辑上是一致的,不会出现“太阳能侧是新数据、电池侧还是旧数据”的混乱情况。
4. 嵌入式网页展示与资源限制之间的平衡
在 ESP32-C6 上直接嵌入网页时,需要同时考虑页面效果、代码体积和刷新效率。页面做得太复杂,会增加固件体积和维护成本;做得太简单,又难以体现作品的完整性。最终方案选择了较轻量但信息集中度高的仪表盘式页面,并使用 WebSocket 进行数据推送,兼顾了可视化效果和资源开销。
八、对本次竞赛的心得体会
通过这次竞赛,我最大的体会是,一个好的电子设计作品需要贴近真实使用场景。本项目如果只做成串口打印状态信息,虽然技术上也算完成了采样,但作品感染力会弱很多;而当能够通过LCD和网页实时展示时,整个项目的工程感会有明显提升。
第二个体会是,硬件设计中的基础错误代价很高。像 SDA/SCL 接反、电源器件选型理解错误这类问题,看似只是一个引脚或一个芯片选择的问题,实际上会直接导致整板无法稳定工作。相比软件,硬件往往没有那么高的可回退性,因此在原理图阶段的审查和推演非常关键。这次经历让我更加重视设计前的理论核查,也更加理解为什么优秀的硬件工程师会在原理图评审上投入大量时间。
第三个体会是,软硬件协同能力非常重要。这个项目里,硬件测量只是起点,真正让作品形成“系统感”的,是软件对数据的组织、网络服务的接入以及网页端的表达。如果没有 LCD 和 Web 端展示,只能看到原始调试数据。只有把硬件、固件和前端三部分连起来,作品才真正完整。
总体而言,这次竞赛对我来说不仅是一次作品展示,更是一次完整的工程训练。我从中体会到,做项目不能只关注单个知识点,而要学会从应用场景出发组织方案、从系统目标反推硬件与软件结构、从调试问题中不断修正设计。这样的过程对个人能力提升非常直接,也让我对后续继续做能源类、物联网类和智能终端类项目更有信心。
九、总结
本项目基于 ESP32-C6、双 INA226、CN3791太阳能输入与电池充电支路,完成了一套具备本地联网和网页实时显示能力的太阳能发电状态监测系统。系统不仅能够测量太阳能板输入侧和电池侧的关键参数,还能进一步计算充电效率,并通过简洁直观的LCD显示屏和网页向用户展示当前状态。这使得本作品相比普通的测量演示,更具工程性、应用性和展示价值。
在项目实施过程中,我既完成了从硬件测量到网页展示的功能闭环,也发现并修正了原理图中的两处关键问题,即 INA226 的 SDA/SCL 连接错误以及 MT3608 不能直接实现 3.3V 供电的问题。这些经历让整个项目形成了一次较完整的设计、验证与复盘过程。
如果继续迭代,本项目还可以增加历史数据曲线、效率统计、异常告警、自动记录不同光照条件下的性能表现,甚至与家庭能源管理系统联动。