从零到一:基于立创地文星(CW32F030C8T6)与ESP8266的物联网电压电流表全栈开发实战

发布时间:2026/7/24 2:48:19

从零到一:基于立创地文星(CW32F030C8T6)与ESP8266的物联网电压电流表全栈开发实战 从零到一基于立创地文星(CW32F030C8T6)与ESP8266的物联网电压电流表全栈开发实战大家好我是老王一个喜欢捣鼓硬件的嵌入式工程师。最近有不少朋友问我想自己动手做一个能联网、能远程查看数据的电压电流表但不知道从何下手。这让我想起了之前做的一个项目正好可以拿出来和大家分享一下。今天咱们就一起从零开始手把手打造一个基于立创地文星开发板主控是CW32F030C8T6和ESP8266的物联网电压电流表。这个项目麻雀虽小五脏俱全涵盖了硬件选型、电路设计、嵌入式编程、服务器搭建和数据可视化可以说是一个完整的嵌入式全栈开发实战。无论你是电子爱好者、在校学生还是想拓宽技能的工程师跟着做一遍相信你都能收获满满。1. 硬件设计从供电到采样一个都不能少做硬件项目第一步永远是“电”。供电稳了后面的一切才稳。1.1 供电电路让设备“活”起来咱们这个表是便携式的用一节18650锂电池供电。但锂电池电压是3.7V左右而板子上的屏幕、ESP8266模块需要3.3VMCU也需要稳定的电源。所以供电部分设计了三步走充电管理用了TC4056A这颗芯片给锂电池充电最大支持1A电流充电电路很简单接上USB口就能充。升压电路锂电池电压会从4.2V降到3V左右但有些模块比如某些屏幕背光可能需要稍高一点的电压。这里用了一颗MT3608B升压芯片把电池电压升到4.8V。它的效率在轻载时能达到92%左右挺省电的。输出电压由两个分压电阻决定公式是VOUT (1 R2/R1) * 0.6V。我选了R291kΩR113kΩ得到大约4.8V。降压稳压最后一步用一颗RS3236-3.3的LDO低压差线性稳压器把4.8V稳稳地降到3.3V。选它有个小心思它带一个EN使能引脚可以用MCU的GPIO来控制它的开关。不用的时候彻底关断它的待机电流只有0.01微安几乎可以忽略不计这对延长电池续航非常关键。提示升压电路里的电感建议选等效直流电阻DCR小的这样效率更高。续流二极管一定要用肖特基二极管比如常见的SS14它的导通压降低速度快。1.2 核心大脑为什么选CW32F030C8T6市面上MCU那么多为什么偏偏是它主要看中两点ADC性能强悍咱们做电压电流表核心就是模数转换ADC。CW32F030C8T6内置一个12位精度的ADC关键是它的参考电压Vref有多种选择1.5V、2.5V、芯片供电电压VDD甚至还可以用外部引脚PB00的电压。相比之下很多同价位芯片只有VDD一种参考源。参考电压越稳定ADC转换结果就越准这对于测量精度至关重要。IO口够用这个项目要用到TFT屏幕SPI接口、ESP8266串口、5个按键、多个ADC通道IO需求不少。地文星开发板把芯片的32个IO基本都引出来了完全够用布局也方便。1.3 测量核心ADC采样电路设计这是本项目的重中之重测量准不准就看这里了。CW32的ADC是12位的也就是说它能把一个电压值分成40962^12个等级。我们通过分压电阻把待测的大电压“压缩”到ADC能测量的安全范围0-Vref内。先看看ADC通道分配CW32引脚ADC通道功能PBA7ADC_IN7测量电池电压PB00ADC_IN8电压测量校准外部基准PB01ADC_IN9测量0~3V电压PB10ADC_IN11测量0~31V电压PB11ADC_IN12测量0~1A电流1.3.1 电压采样自动换挡大小通吃为了兼顾小电压的高精度和大电压的测量范围我设计了两档量程0-3V档直接用两个10kΩ的精密电阻精度0.1%对输入电压进行1:1分压。当输入3V时ADC引脚电压是1.5V刚好用内置的1.5V参考电压可以充分利用ADC的量程精度最高。0-31V档用200kΩ和10kΩ电阻进行分压分压比是1:20。这样当输入31V时ADC引脚电压大约是31V * (10k/(10k200k)) ≈ 1.48V仍然在1.5V参考电压的安全范围内。在软件里我会做一个“自动换挡”逻辑当ADC读取0-3V档的值接近满量程比如大于3V时就自动切换到31V档去读这样既能测小电压又能测大电压。注意计算一下电阻的功耗。在31V输入时10k电阻上的功率约0.218mW200k电阻上的功率约4.36mW。所以选用0603封装额定功率约100mW的电阻绰绰有余完全不用担心烧坏。1.3.2 电流采样如何测量安培级电流测量电流通常是在电流通路上串联一个很小的“采样电阻”R_sa测量电阻两端的电压再根据欧姆定律I V / R_sa算出电流。这里有个权衡采样电阻越大同样的电流产生的电压越大测量分辨率越高但电阻本身的功耗也越大P I^2 * R还会影响被测电路。我的需求是经常测毫安级电流希望分辨率高一点。所以选了一颗2512封装、200mΩ、功率2W的采样电阻。我们来算算最大能测的电流I_max sqrt(P/R) sqrt(2/0.2) ≈ 3.16A远超设计的1A量程很安全。测量分辨率ADC的1个数字LSB对应的电压是1.5V / 4096 ≈ 0.366mV。那么对应的电流值就是0.366mV / 0.2Ω ≈ 1.83mA。也就是说这个电路能分辨出大约1.83mA的电流变化对于毫安级测量来说够用了。1.3.3 其他辅助电路电池电压采样同样用两个10kΩ精密电阻分压使用内部2.5V参考电压来测量用于在屏幕上显示剩余电量。TL431基准源可选虽然CW32内置了2.5V基准但我额外加了一个TL431芯片来提供更精准的2.5V基准电压。这个电路主要是为了学习基准源的应用你可以理解为一个非常稳定的“电压源”用来校准ADC让测量更准。1.4 人机交互与通信模块按键电路非常简单按键一端接MCU的GPIO另一端接地。利用CW32 GPIO内部可配置的上拉电阻按键没按下时引脚被拉高按下时被拉低。在代码里检测这个下降沿就能知道按键按下了。我定义了5个按键上、下、左、右、确认。ESP8266电路物联网的核心负责连接Wi-Fi和MQTT服务器上传数据。我用的是ESP-12F模块加一个转接板方便插拔。注意如果你想用MCU控制ESP8266的复位需要把转接板上一个10k电阻去掉具体位置看图。电路上就是把ESP8266的串口TX、RX接到CW32的PB9和PB8上。TFT屏幕1.8寸128*160分辨率驱动芯片是ST7735使用SPI接口通信。接线时注意对照好引脚定义SCK、MOSI、RES、DC、CS、BL。2. 软件设计让硬件“聪明”起来硬件搭好了接下来就是写代码赋予它灵魂。整个工程代码量不小我花了将近一周时间。核心思路是模块化每个功能单独成块方便理解和调试。2.1 菜单系统如何在小屏幕上优雅操作屏幕不大但要显示和操作的功能不少。我设计了一个两级菜单主菜单在屏幕左侧列出主要功能比如“电压电流表”、“温湿度计”、“连接Wi-Fi”等。次级菜单在屏幕右侧显示当前主功能下的子选项。菜单的核心是一个状态机。我用两个字符串数组分别存储主菜单和次级菜单的按钮文字再用一个二维的函数指针数组void (*FUN[5][5])()来存放每个菜单项对应的执行函数。这样当用户按下“确认”键时我只需要根据当前菜单的索引值去调用FUN[main_menu_index][sub_menu_index]()就行了代码非常清晰。屏幕上还有一个状态栏实时显示电池电量、Wi-Fi连接状态、ESP8266和MQTT的连接状态这些都是通过调用底层的TFT绘图函数画上去的。2.2 联网核心ESP8266 AT指令与MQTT让设备上网我用了ESP8266的AT指令固件。AT指令就像你通过串口给ESP8266发短信它执行后回复你结果。比如发个AT它回复OK就说明通信正常。在代码里我封装了一个ESP8266_SendCmd函数底层就是通过串口给ESP8266发送字符串命令并等待指定的回复。连接Wi-Fi的流程大概是这样的打开ESP8266的电源通过GPIO控制EN引脚。发送ATCWMODE1设置它为Station模式连接路由器。发送ATCWJAP你的Wi-Fi名,密码来连接路由器。根据返回的“CONNECTED”或错误信息更新屏幕上的连接状态。连上Wi-Fi后就可以连接MQTT服务器了。MQTT是一种轻量级的物联网消息协议。我同样用AT指令配置ESP8266连接到我自建的EMQX服务器后面会讲怎么搭建。连接成功后就可以用MQTT_Publish函数来发布数据了。这个函数会把测量到的电压、电流值拼接成JSON格式的字符串通过ATMQTTPUB指令发送到指定的主题Topic上。2.3 测量核心ADC读取与数据处理电压电流测量的代码在va_meter.c里。主函数Launch_VA_Meter里有两个显示模式数字模式和图形模式。测量的核心流程如下初始化ADC配置好要用到的ADC通道和参考电压。循环读取在while循环里不断调用ADC_GET()函数读取各个通道的值。自动换挡判断读取0-3V档的ADC值通道9如果值接近4095满量程说明电压超过3V了就改用31V档通道11的读数来计算。数值计算电压电压值 (ADC读数 / 4095) * 参考电压 * 分压系数。比如31V档分压系数是(200k10k)/10k 21。电流电流值(mA) (ADC读数 / 4095) * 参考电压 / 采样电阻(0.2Ω) * 1000。注意实际计算中我根据实测数据做了一点微调减去一个校准值让读数更准这个需要你自己焊接好后校准。数据显示与上传把计算好的浮点数转换成字符串显示在屏幕上。同时每隔一段时间代码里约0.3秒就调用VAmeter_Mqtt_Send_Data函数把数据通过MQTT发送出去。图形模式下的曲线和柱状图绘制则是根据计算出的值在屏幕上对应的坐标画点或画线实现动态效果。2.4 系统基石定时器与按键消抖嵌入式系统里定时器和中断是协调多任务的“管家”。基本定时器BTIM1我让它每10ms中断一次。在这个中断服务函数里我调用Check_Key_Status()函数来扫描按键状态。这里用了一个简单的状态机来实现按键消抖和长短按识别。简单说就是第一次检测到按键按下先记下状态10ms后再检查如果还按着才认为是“真”的按下短按。如果连续按了超过130ms13个10ms周期就认为是长按。这样可以有效避免因按键抖动导致的误触发。基本定时器BTIM2每1秒中断一次用来更新状态栏的信息比如刷新一下连接状态。GPIOA中断配置为下降沿触发。这个主要用于系统休眠后的唤醒。当按下“确认”键PA10时产生中断把MCU从低功耗模式中叫醒。通用定时器GTIM3用来产生PWM信号控制TFT屏幕的背光亮度。频率设为1250Hz通过改变比较寄存器的值占空比来调光。3. 实战指南手把手搭建与配置理论说再多不如动手做一遍。下面就是详细的实操步骤。3.1 硬件焊接与组装PCB设计时我已经把最难焊的芯片都做成插拔式用排母了所以焊接难度不大最小封装是0603电阻。焊接顺序先焊电源芯片TC4056A MT3608 LDO再从小到大焊电阻电容最后焊排母、接口。焊接排母技巧在焊接连接开发板的那两排排母时可以先把排母插到开发板的排针上然后再一起焊到PCB上这样能保证间距绝对匹配。焊接后检查务必用万用表通断档仔细检查有没有短路、虚焊的地方。确认无误后再把开发板、屏幕、ESP8266模块和电池插上去。3.2 给CW32下载程序安装环境你需要安装Keil MDK社区版即可和CW32的器件支持包。立创官方Wiki有详细教程搜一下“立创开发板Wiki安装keil”就能找到。打开工程下载我提供的工程文件CW32F030C8T6_VAmeter.zip解压后用Keil打开Project/MDK/Project.uvprojx。修改配置在main.h文件里找到WIFI_SSID和WIFI_PASSWORD改成你家的Wi-Fi名和密码。先别急MQTT的配置需要等服务器搭好后再回来改。配置下载器在Keil的魔术棒选项里选择你的下载器比如ST-LINK, J-Link等。编译下载点击Rebuild编译确保0错误0警告。然后连接下载器点击Download按钮程序就烧录进去了。3.3 给ESP8266刷写AT固件CW32的程序默认是关闭ESP8266电源的我们需要先刷固件。准备工具和固件下载附件里的flash_download_tool.zip烧录工具和1112_esp8266-4m.zipMQTT AT固件。硬件连接用一个USB转TTL模块按照下表连接板子上的下载接口注意此时板子的总电源开关要关闭USB转TTL模块板载下载接口3.3V3.3VTXDRXDRXDTXDGNDGND同时用跳线帽短接板子上标注“下载”的跳线。烧录配置打开烧录工具选择ESP8266配置如下图。关键是“SPI SPEED”选40MHz“SPI MODE”选DIO“FLASH SIZE”选32Mbit。然后选择固件文件解压后bin文件和对应的地址0x0。开始烧录点击START。此时你需要操作已经下载好程序的CW32进入菜单“系统设置”-“启动ESP8266”给模块上电。烧录工具识别到后就会开始写入等待完成即可。恢复与测试烧录完成后拔掉USB转TTL线和跳线帽。重新上电进入菜单“WIFI”-“连接WIFI”看看能否成功连接。3.4 搭建云端服务Docker一键部署数据要上网需要一个MQTT服务器来接收一个数据库来存储一个看板来展示。我们用Docker来部署非常方便。前提你需要有一台一直开机的电脑比如旧笔记本或者云服务器并安装好Docker。Windows和Ubuntu的安装教程网上很多搜“Docker安装教程”即可。3.4.1 部署InfluxDB数据库InfluxDB是专门为时序数据比如随时间变化的电压值设计的数据库。打开终端创建一个目录并运行Docker命令端口我映射到了3086mkdir influxdb_config influxdb_data sudo docker run -d \ --nameinfluxdb2.0 \ -p 3086:8086 \ -v $PWD/influxdb_data:/var/lib/influxdb2 \ -v $PWD/influxdb_config:/etc/influxdb2 \ influxdb:2.7.6在浏览器访问http://你的机器IP:3086你会看到初始化页面。设置一个用户名、密码、组织名例如myorg和存储桶名例如vameter。务必保存好生成的API Token后面要用。点击“Quick Start”完成初始化。3.4.2 部署EMQX MQTT服务器EMQX是一个开源的MQTT消息服务器。在另一个目录运行以下命令管理页面端口是18083mkdir emqx_data emqx_log sudo docker run -d --name emqx \ -p 1883:1883 \ -p 18083:18083 \ -v $PWD/emqx_data:/opt/emqx/data \ -v $PWD/emqx_log:/opt/emqx/log \ emqx:5.7.1访问http://你的机器IP:18083用默认账号admin和密码public登录记得第一时间修改密码。创建客户端认证在管理界面进入“认证”-“客户端认证”创建基于密码的认证使用“内置数据库”作为后端。创建用户在“用户管理”里添加两个用户比如esp8266/123456给我们的电压电流表用python/123456给后面的数据转发程序用3.4.3 配置CW32程序中的MQTT参数现在回到Keil工程打开mqtt.h文件修改以下宏定义MQTT_USERNAME: 填esp8266MQTT_PASSWORD: 填123456MQTT_CLIENT_ID: 随便起个名比如esp8266_VAmeterMQTT_SERVER: 填你部署EMQX的机器IP地址MQTT_PORT: 默认1883一般不用改MQTT_TOPIC: 填一个主题名比如device/vameter/data修改后重新编译下载程序到CW32。3.4.4 运行Python数据转发程序ESP8266把数据发到了EMQX我们需要一个“中间人”把数据从EMQX取出来再存进InfluxDB。下载附件里的python转发程序.zip解压。打开终端进入该目录安装依赖pip install -r requirements.txt。用文本编辑器打开emqx_receive_VA_meter.py修改里面的几个参数EMQX_BROKER: 你的EMQX服务器IPEMQX_PORT: 1883EMQX_USERNAME/EMQX_PASSWORD: 填之前创建的python用户和密码EMQX_TOPIC: 要和CW32程序里设置的MQTT_TOPIC一致INFLUXDB_URL,INFLUXDB_TOKEN,INFLUXDB_ORG,INFLUXDB_BUCKET: 根据你InfluxDB的设置填写运行程序python emqx_receive_VA_meter.py。如果看到“Connected to MQTT Broker!”并且开始打印解析出的电压电流数据说明成功了。此时打开电压电流表连接Wi-Fi和MQTT进入测量界面。你应该能在Python程序的终端里看到实时数据也能在InfluxDB的查询界面里查到这些数据。3.4.5 使用Grafana制作炫酷仪表盘数据存好了最后一步就是把它漂亮地展示出来。部署Grafanamkdir grafana_data sudo docker run -d --namegrafana \ -p 3000:3000 \ -v $PWD/grafana_data:/var/lib/grafana \ grafana/grafana:11.0.0访问http://你的机器IP:3000首次登录用admin/admin会要求改密码。添加数据源左侧栏点“Connections” - “Data sources”添加一个InfluxDB数据源。Query Language: 选 FluxURL: 填http://你的机器IP:3086(InfluxDB的地址)Auth: 勾选“Basic auth”填InfluxDB的用户名密码。在“Custom HTTP Headers”里添加一个HeaderAuthorization: Token 你的InfluxDB_API_Token最后点“Save test”显示绿色对勾就成功了。创建仪表盘点击左上角“”号新建仪表盘再点“Add visualization”。添加图表选择刚创建的InfluxDB数据源。怎么查询数据呢一个偷懒的办法回到InfluxDB的数据查询界面用图形化工具选好数据然后点“Script Editor”它会把对应的Flux查询语句显示出来复制这段语句粘贴到Grafana的查询编辑器里就行了。调整图表样式曲线颜色、坐标轴等点击“Apply”和“Save”。重复步骤把电流、功率的图表也加进来。大功告成现在你不仅有了一个实体的物联网电压电流表还能在电脑或手机浏览器上通过Grafana的仪表盘实时监控远程的数据变化曲线了。这个项目从硬件焊接到软件编程再到云端部署走完了一个完整的物联网产品开发流程。过程中你会遇到各种小问题比如焊接问题、程序bug、网络配置错误等但每一个问题的解决都是宝贵的经验。希望这个教程能帮你打开嵌入式全栈开发的大门。所有的硬件设计文件、软件代码我都开源了链接在文章末尾欢迎取用、改进和分享。

相关新闻