用STM32F103C8T6和BC20模块DIY一个低成本户外环境监测站(数据上云OneNet)
用STM32F103C8T6和BC20模块打造户外环境监测站的完整指南
在智能硬件和物联网技术蓬勃发展的今天,DIY一个属于自己的环境监测设备已经不再是遥不可及的梦想。本文将带你从零开始,使用STM32F103C8T6微控制器和BC20通信模块,构建一个功能完善的户外环境监测站,并将数据上传至OneNet物联网平台进行可视化展示。
1. 项目概述与核心组件选择
户外环境监测站的核心功能是实时采集温度、湿度以及地理位置信息,并通过无线网络将这些数据传输到云端平台。要实现这一目标,我们需要精心挑选每个功能模块:
核心组件清单:
- 主控芯片:STM32F103C8T6(性价比极高的ARM Cortex-M3内核微控制器)
- 通信模块:BC20(集成NB-IoT和GPS功能的二合一模块)
- 环境传感器:DHT11(基础温湿度检测)
- 显示模块:0.96寸OLED(本地数据可视化)
- 电源系统:太阳能板+18650锂电池组(户外长期供电方案)
选择STM32F103C8T6是因为它具备丰富的外设接口和足够的处理能力,而BC20模块则完美解决了户外环境下的通信和定位需求。这种组合既保证了功能完整性,又控制了成本,整套硬件成本可以控制在200元以内。
2. 硬件设计与电路连接
正确的硬件连接是整个项目的基础。我们需要特别注意各模块的电气特性和接口匹配,以下是详细的连接方案:
STM32与各模块的连接关系表:
| 模块 | 引脚类型 | STM32连接引脚 | 备注 |
|---|---|---|---|
| BC20 | UART2 | PA2(TX), PA3(RX) | 波特率9600bps |
| DHT11 | GPIO | PB12 | 单总线协议 |
| OLED | I2C | PB6(SCL), PB7(SDA) | 可选SPI接口版本 |
| 调试串口 | UART1 | PA9(TX), PA10(RX) | 波特率115200bps |
关键连接注意事项:
- BC20模块需要外接天线,GPS天线应尽量放置在开阔区域
- DHT11数据线需加上拉电阻(4.7KΩ)
- 为STM32和BC20分别配置100nF去耦电容
- 整个系统建议采用3.3V供电,BC20的峰值电流可达500mA
提示:在实际焊接前,建议先使用面包板搭建测试电路,验证各模块功能正常后再进行永久性连接。
3. 软件开发与环境配置
软件开发是项目的核心环节,我们需要搭建完整的工具链并编写各模块的驱动代码。
3.1 开发环境准备
首先安装必要的工具软件:
- Keil MDK-ARM(STM32开发环境)
- ST-Link驱动(程序下载工具)
- 串口调试助手(如SecureCRT或Putty)
- OneNet Studio账号(物联网平台)
在Keil中新建工程时,需要正确配置STM32F103C8T6的设备选项:
// 系统时钟配置(72MHz) void SystemClock_Config(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); }3.2 BC20模块驱动开发
BC20模块通过AT指令进行控制,我们需要封装常用的功能函数:
// BC20初始化函数 BC20_ErrorCode BC20_Init(void) { BC20_ClearRecvBuf(); printf("【开始初始化BC20模块】\r\n"); // 检查模块响应 if(BC20_SendAT("AT\r\n", "OK", 3000) != BC20_OK) { printf("【错误】模块无响应\r\n"); return BC20_ERR_RESPONSE; } // 关闭回显 if(BC20_SendAT("ATE0\r\n", "OK", 3000) != BC20_OK) { printf("【错误】关闭回显失败\r\n"); return BC20_ERR_RESPONSE; } // SIM卡检测 if(BC20_SendAT("AT+CIMI\r\n", "OK", 3000) != BC20_OK) { printf("【错误】SIM卡异常\r\n"); return BC20_ERR_SIM; } // 网络附着检查 if(BC20_SendAT("AT+CGATT?\r\n", "+CGATT: 1", 10000) != BC20_OK) { printf("【错误】网络注册失败\r\n"); return BC20_ERR_NETWORK; } // GPS初始化 if(BC20_InitGPS() != BC20_OK) { printf("【警告】GPS初始化失败\r\n"); } printf("【BC20模块初始化完成】\r\n"); return BC20_OK; }4. OneNet平台配置与数据对接
OneNet平台作为数据的中枢,需要进行正确的产品创建设备管理。
4.1 产品创建与物模型定义
登录OneNet Studio后,按照以下步骤创建产品:
- 进入"产品开发"→"创建产品"
- 填写产品基本信息:
- 产品名称:户外环境监测站
- 行业类别:环境监测
- 联网方式:NB-IoT
- 在物模型中定义三个属性:
- 温度(float类型)
- 湿度(float类型)
- 位置(geo类型,包含经度和纬度)
4.2 设备接入与数据上传
设备端需要实现MQTT协议对接OneNet平台,以下是关键代码片段:
BC20_ErrorCode BC20_SendToOneNet(float temp, float humi, const GPS_Data *gps) { char cmd[256]; snprintf(cmd, sizeof(cmd), "AT+QMTPUB=0,0,0,0,\"$sys/%s/%s/thing/property/post\"," "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{" "\"temp\":{\"value\":%.1f}," "\"humi\":{\"value\":%.1f}," "\"location\":{\"value\":{\"lon\":%.6f,\"lat\":%.6f}}" "}}\r\n", PRODUCT_ID, DEVICE_ID, temp, humi, gps->longitude, gps->latitude); return BC20_SendAT(cmd, "+QMTPUB: 0,0,0", 5000); }5. 户外部署与电源优化
户外环境对设备的稳定性和电源管理提出了更高要求。
电源系统设计方案:
- 采用6V/2W太阳能板作为主要能源
- TP4056充电管理芯片控制锂电池充放电
- 3.7V 18650锂电池(3400mAh)作为储能单元
- AMS1117-3.3稳压芯片提供系统电源
低功耗优化策略:
- 设置STM32进入STOP模式,仅通过RTC定时唤醒
- BC20模块采用PSM省电模式
- 数据上传间隔调整为5分钟(可根据需要调整)
- OLED屏幕在不操作时关闭显示
实测表明,这套电源系统在晴天条件下可以持续工作,并在阴雨天维持至少7天的续航能力。
6. 数据可视化与告警设置
OneNet平台提供了强大的数据可视化功能,我们可以创建个性化的监控面板。
仪表盘配置步骤:
- 在设备详情页点击"数据可视化"→"新建仪表盘"
- 添加以下组件:
- 温湿度数字显示组件
- 历史曲线图(展示24小时趋势)
- 地图位置标记组件
- 设置阈值告警:
- 当温度>35℃时发送邮件通知
- 当湿度<30%时发送短信提醒
通过这些可视化工具,用户可以直观地了解环境变化趋势,并在异常情况发生时及时获得通知。
7. 项目扩展与进阶优化
基础功能实现后,还可以考虑以下扩展方向:
硬件扩展:
- 增加大气压力传感器(BMP280)
- 添加空气质量检测(PM2.5/PM10)
- 集成雨量检测模块
软件优化:
- 实现固件OTA远程升级
- 添加本地数据存储(SPI Flash)
- 开发微信小程序监控界面
外壳设计与防水:
- 使用3D打印制作防护外壳
- 接口处采用防水胶密封
- 天线部分使用防水接头
这个项目不仅是一个实用的环境监测工具,更是学习嵌入式系统和物联网开发的绝佳平台。通过不断迭代优化,你可以将它打造成功能更加丰富的智能硬件设备。
