STM32F103C8T6 + ESP8266 物联网实战:3小时搭建WiFi远程温控风扇系统
STM32F103C8T6 ESP8266 物联网实战3小时搭建WiFi远程温控风扇系统去年夏天帮学弟调试毕业设计时发现用STM32ESP8266做温控风扇是个既实用又容易上手的项目。这个系统不仅能自动调节风扇转速还能用手机远程控制特别适合宿舍或小房间使用。下面我就把完整的实现过程拆解给大家从硬件选型到代码调试手把手带你避开那些我踩过的坑。1. 硬件准备与电路设计1.1 核心器件选型建议做这个项目需要以下硬件总成本约120元主控芯片STM32F103C8T6最小系统板蓝色药丸板性价比高72MHz主频完全够用自带USB转串口烧录方便WiFi模块ESP-01SESP8266注意要买带底板的最新版老版本固件不稳定实测在宿舍环境传输距离可达30米温湿度传感器DHT11虽然精度一般±2℃但胜在便宜易用若需要更高精度可换用SHT30价格贵3倍执行部件5V继电器模块控制风扇电源4010轴流风扇电脑机箱常用型号注意风扇功率不要超过继电器负载1.2 电路连接详解接线时最容易出错的是ESP8266的供电问题一定要接对STM32F103C8T6 -- ESP-01S 3.3V ---- VCC GND ---- GND PA3(TX) ---- RX PA2(RX) ---- TX STM32F103C8T6 -- DHT11 3.3V ---- VCC GND ---- GND PB6 ---- DATA STM32F103C8T6 -- 继电器 PB7 ---- IN 5V ---- VCC GND ---- GND警告ESP8266必须使用独立3.3V供电直接接STM32的3.3V会导致电流不足表现为模块频繁重启。建议使用AMS1117-3.3稳压芯片单独供电。2. 开发环境搭建2.1 软件工具准备需要安装以下软件以Windows为例Keil MDK# 安装后需注册学生可申请教育版 # 安装STM32F1支持包Keil.STM32F1xx_DFP.2.4.0.pack串口调试助手推荐使用SSCOM或XCOM用于查看ESP8266的AT指令响应网络调试工具网络调试助手TCP/UDP测试手机端可用TCP调试助手APP2.2 工程配置关键点新建Keil工程时注意选择器件STM32F103C8勾选以下库GPIOUSARTTIMRCC在Options for Target → Target中设置晶振为8MHz勾选Use MicroLIB简化串口打印3. ESP8266网络配置3.1 AT指令固件烧录市面上买的模块可能固件版本较旧建议先刷最新AT固件# 使用Flash_Download_Tools_v3.x工具 # 选择ESP8266下载 # 固件选择v2.2.0 AT Firmware.bin # 烧录配置 # - CrystalFreq: 26M # - SPI SPEED: 40MHz # - SPI MODE: QIO # - FLASH SIZE: 8Mbit3.2 基础AT指令测试通过串口发送以下指令测试模块波特率115200AT // 测试通信 ATRST // 重启模块 ATCWMODE1 // 设置为Station模式 ATCWLAP // 扫描周边WiFi ATCWJAP你的WiFi,密码 // 连接路由器 ATCIFSR // 查看获取的IP地址常见问题若返回busy错误尝试降低波特率到9600或检查供电稳定性。3.3 TCP服务器配置让ESP8266作为TCP服务器ATCIPMUX1 // 开启多连接 ATCIPSERVER1,8080 // 开启服务器端口8080 ATCIPSTO2880 // 设置超时为2880秒4. STM32程序设计4.1 主程序框架程序采用状态机设计主要包含三个任务while(1) { // 任务1读取温湿度每2秒一次 if(HAL_GetTick() - tempTick 2000) { DHT11_ReadData(temp, humi); tempTick HAL_GetTick(); } // 任务2网络数据处理 if(UART1_RxFlag) { ESP8266_DataProcess(); UART1_RxFlag 0; } // 任务3温度控制逻辑 TempControl_Update(); }4.2 关键代码实现4.2.1 DHT11驱动代码注意时序要求严格void DHT11_Start(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; // 配置为输出模式 GPIO_InitStruct.Pin DHT11_PIN; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(DHT11_PORT, GPIO_InitStruct); // 主机拉低18ms HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET); Delay_ms(18); // 切换为输入模式 GPIO_InitStruct.Mode GPIO_MODE_INPUT; HAL_GPIO_Init(DHT11_PORT, GPIO_InitStruct); }4.2.2 ESP8266数据处理解析手机APP发来的指令void ESP8266_DataProcess(void) { if(strstr((char*)UART1_RxBuffer, FAN_ON)) { Relay_Control(1); sprintf(sendBuf, FAN STATUS:ON\r\n); ESP8266_SendData(sendBuf); } else if(strstr((char*)UART1_RxBuffer, FAN_OFF)) { Relay_Control(0); sprintf(sendBuf, FAN STATUS:OFF\r\n); ESP8266_SendData(sendBuf); } }4.2.3 PID温度控制简易PID实现可根据需要调整参数void TempControl_Update(void) { float error targetTemp - currentTemp; integral error; derivative error - lastError; float output Kp*error Ki*integral Kd*derivative; // 限制输出范围 output (output 100) ? 100 : ((output 0) ? 0 : output); // 控制继电器动作 if(output 30) { // 阈值可调 Relay_Control(1); } else { Relay_Control(0); } lastError error; }5. 手机控制端实现5.1 Android简易APP开发使用Android Studio快速开发控制界面布局文件关键代码Button android:idid/btnConnect android:text连接设备/ TextView android:idid/tvTemp android:text当前温度--℃/ SeekBar android:idid/sbTemp android:max40/ Button android:idid/btnFanOn android:text开启风扇/网络通信核心代码Socket socket new Socket(192.168.1.100, 8080); PrintWriter out new PrintWriter(socket.getOutputStream()); BufferedReader in new BufferedReader(new InputStreamReader(socket.getInputStream())); // 发送控制指令 out.println(FAN_ON); out.flush(); // 接收温度数据 String tempData in.readLine(); runOnUiThread(() - tvTemp.setText(当前温度 tempData ℃));5.2 微信小程序方案若不想开发APP可使用微信小程序云开发方案创建云函数处理TCP通信const net require(net); const client new net.Socket(); exports.main async (event, context) { client.connect(8080, 设备IP, () { client.write(event.command \r\n); }); return new Promise((resolve) { client.on(data, (data) { resolve({data: data.toString()}); client.destroy(); }); }); };小程序页面调用wx.cloud.callFunction({ name: fanControl, data: { command: FAN_ON } }).then(res { console.log(res.result.data) })6. 系统调试与优化6.1 常见问题排查ESP8266连接不稳定检查天线是否完好PCB天线易损坏尝试ATCWQAP断开后重新连接更换为ESP-12F模块信号更强DHT11读取失败检查上拉电阻4.7KΩ必需延长两次读取间隔最少2秒更换传感器DHT11良品率不高继电器频繁动作在PID控制中加入死区控制增加状态变化的最小间隔时间改用固态继电器无机械触点6.2 性能优化建议低功耗优化// 进入STOP模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 通过ESP8266中断唤醒 HAL_NVIC_SetPriority(EXTIx_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTIx_IRQn);数据传输优化采用二进制协议替代文本协议添加数据校验CRC16使用MQTT协议替代原始TCP扩展功能添加OLED显示实时数据接入第三方物联网平台如阿里云IoT增加温度历史数据存储使用EEPROM这个项目最让我惊喜的是它的实用性——去年做的原型机至今还在学弟宿舍正常工作。通过这个实战项目你不仅能掌握STM32与ESP8266的通信技巧还能学习到完整的物联网系统开发流程。当看到手机上的控制指令实时改变风扇状态时那种成就感绝对值得这3小时的投入。