1. 项目概述
这个项目听起来就很有意思——用STM32做主控,ESP8266负责联网,再搭配小程序做远程监控,一套完整的物联网解决方案就成型了。作为一个做过类似项目的工程师,我可以负责任地说,这个组合在成本、性能和开发难度上找到了一个完美的平衡点。
STM32作为主控芯片,负责数据采集和设备控制;ESP8266作为WiFi模块,实现设备联网;小程序则提供了便捷的远程监控界面。这种架构在智能家居、工业监控等领域应用非常广泛。我去年就用类似的方案给一个温室大棚做过环境监控系统,稳定运行至今。
2. 硬件选型与搭建
2.1 STM32选型建议
STM32系列单片机种类繁多,对于这个项目,我推荐使用STM32F103C8T6(俗称"蓝莓派")。这款芯片有64KB Flash、20KB RAM,72MHz主频,完全够用。更重要的是,它价格便宜(约10元),资料丰富,社区支持好。
注意:如果项目需要更多外设接口,可以考虑STM32F407系列,但价格会高不少。
2.2 ESP8266使用要点
ESP8266最常用的型号是ESP-01S,价格约15元。使用时要注意:
- 供电必须稳定,建议使用3.3V LDO稳压
- 天线区域不要被金属遮挡
- 烧录固件前需要将GPIO0拉低
我习惯用AT指令模式开发,虽然性能不如直接开发ESP8266,但胜在简单稳定。常用的AT指令有:
bash复制AT+CWMODE=1 // 设置为Station模式
AT+CWJAP="SSID","password" // 连接WiFi
AT+CIPSTART="TCP","192.168.1.100",8080 // 建立TCP连接
2.3 硬件连接示意图
STM32与ESP8266通常通过UART通信:
- STM32的USART1_TX(PA9) -> ESP8266的RX
- STM32的USART1_RX(PA10) -> ESP8266的TX
- 共地连接
如果还需要控制ESP8266的复位:
- STM32的任意GPIO -> ESP8266的RST
3. 软件开发环境搭建
3.1 STM32开发环境
我推荐使用Keil MDK开发STM32程序。安装步骤:
- 下载并安装Keil MDK
- 安装STM32F1xx Device Family Pack
- 新建工程,选择STM32F103C8器件
- 配置工程选项,特别是Flash Download选项
对于新手,可以使用STM32CubeMX生成初始化代码,能省去很多底层配置的麻烦。
3.2 ESP8266固件烧录
ESP8266出厂通常自带AT固件,但如果需要更新:
- 下载最新AT固件
- 使用USB转TTL工具连接ESP8266
- GPIO0拉低后上电进入烧录模式
- 使用Flash下载工具烧录
3.3 小程序开发准备
微信小程序开发需要:
- 注册微信开发者账号
- 下载微信开发者工具
- 创建新项目,选择"小程序"模板
小程序后端可以使用Node.js或Python开发,部署在云服务器上。
4. STM32程序设计
4.1 外设初始化
首先初始化必要的硬件外设:
c复制// USART1初始化 - 用于与ESP8266通信
void USART1_Init(void) {
// 波特率115200
// 8位数据位,无校验,1位停止位
// 启用接收中断
}
// ADC初始化 - 用于传感器数据采集
void ADC_Init(void) {
// 配置ADC通道
// 设置采样时间
// 启用ADC
}
4.2 主程序逻辑
主程序通常采用状态机设计:
c复制while(1) {
switch(currentState) {
case STATE_IDLE:
// 等待指令或定时采集
break;
case STATE_SENSING:
// 采集传感器数据
break;
case STATE_SENDING:
// 通过ESP8266发送数据
break;
case STATE_RECEIVING:
// 处理来自小程序的指令
break;
}
}
4.3 与ESP8266通信协议
我设计了一个简单的通信协议:
code复制[STX][CMD][LEN][DATA][CRC][ETX]
- STX: 起始字节(0x02)
- CMD: 命令字
- LEN: 数据长度
- DATA: 实际数据
- CRC: 校验和
- ETX: 结束字节(0x03)
5. ESP8266网络通信实现
5.1 TCP服务器搭建
小程序通常通过TCP与设备通信。可以在云服务器上搭建TCP服务器,也可以让ESP8266直接作为TCP服务器(需要路由器端口映射)。
Node.js TCP服务器示例:
javascript复制const net = require('net');
const server = net.createServer((socket) => {
socket.on('data', (data) => {
console.log('Received:', data.toString());
// 处理数据并回复
socket.write('ACK');
});
});
server.listen(8080, '0.0.0.0');
5.2 数据上传与指令接收
ESP8266需要实现:
- 定时上传传感器数据
- 接收并执行来自小程序的指令
- 断线自动重连
数据上传示例:
c复制void sendSensorData(float temp, float humi) {
char buffer[64];
sprintf(buffer, "{\"temp\":%.1f,\"humi\":%.1f}", temp, humi);
sendTCPData(buffer);
}
5.3 心跳包机制
为了保持长连接,需要实现心跳包:
c复制void sendHeartbeat(void) {
static uint32_t lastTime = 0;
if(HAL_GetTick() - lastTime > 30000) { // 30秒一次
sendTCPData("{\"cmd\":\"heartbeat\"}");
lastTime = HAL_GetTick();
}
}
6. 小程序开发
6.1 页面布局设计
小程序主要页面包括:
- 登录页
- 设备列表页
- 监控数据展示页
- 控制页面
WXML示例:
html复制<view class="container">
<canvas id="tempChart"></canvas>
<view class="data-row">
<text>当前温度: {{temp}}°C</text>
<text>当前湿度: {{humi}}%</text>
</view>
<button bindtap="refreshData">刷新数据</button>
</view>
6.2 与后端通信
小程序通过WebSocket或HTTP与后端通信:
javascript复制// 建立WebSocket连接
const socket = wx.connectSocket({
url: 'wss://yourserver.com/ws'
})
// 接收数据
socket.onMessage((res) => {
const data = JSON.parse(res.data)
this.setData({
temp: data.temp,
humi: data.humi
})
})
6.3 数据可视化
使用echarts-for-weixin组件实现数据图表:
javascript复制import * as echarts from '../../ec-canvas/echarts';
function initChart(canvas, width, height) {
const chart = echarts.init(canvas, null, {
width: width,
height: height
});
canvas.setChart(chart);
const option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [{
data: [20, 22, 21, 24, 23, 22, 20],
type: 'line'
}]
};
chart.setOption(option);
return chart;
}
7. 系统集成与测试
7.1 联调步骤
- 先测试STM32与ESP8266的串口通信
- 测试ESP8266联网功能
- 测试TCP服务器通信
- 测试小程序与后端的通信
- 全系统联调
7.2 常见问题排查
-
ESP8266无法联网:
- 检查WiFi密码是否正确
- 检查路由器是否限制了新设备
- 检查天线是否正常
-
数据传输出错:
- 检查串口波特率设置
- 检查通信协议格式
- 添加更多的调试输出
-
小程序无法显示数据:
- 检查网络连接
- 检查API接口地址
- 查看浏览器控制台错误信息
7.3 性能优化建议
- 数据上传频率不要太高(建议30秒-1分钟)
- 使用二进制协议代替JSON可以减少数据量
- 添加数据缓存,网络异常时暂存本地
- 使用差分上传,只有数据变化时才上传
8. 项目扩展方向
这个基础框架可以扩展很多功能:
- 添加更多传感器(光照、CO2等)
- 实现历史数据存储和查询
- 添加报警功能(邮件/微信通知)
- 支持多设备管理
- 添加OTA升级功能
我在实际项目中还遇到过一些特殊需求,比如:
- 需要支持4G网络(可以用SIM800模块替代ESP8266)
- 需要本地存储(可以加SD卡模块)
- 需要低功耗(需要改用STM32L系列)
这个项目的魅力在于它的可扩展性,几乎可以满足任何监控场景的需求。我在一个农业大棚项目中,就用类似的架构实现了环境监控、自动灌溉、补光控制等全套功能。