用STM32F103C8T6和BC20模块DIY一个低成本户外环境监测站(数据上云OneNet)

用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连接引脚备注BC20UART2PA2(TX), PA3(RX)波特率9600bpsDHT11GPIOPB12单总线协议OLEDI2CPB6(SCL), PB7(SDA)可选SPI接口版本调试串口UART1PA9(TX), PA10(RX)波特率115200bps关键连接注意事项BC20模块需要外接天线GPS天线应尽量放置在开阔区域DHT11数据线需加上拉电阻4.7KΩ为STM32和BC20分别配置100nF去耦电容整个系统建议采用3.3V供电BC20的峰值电流可达500mA提示在实际焊接前建议先使用面包板搭建测试电路验证各模块功能正常后再进行永久性连接。3. 软件开发与环境配置软件开发是项目的核心环节我们需要搭建完整的工具链并编写各模块的驱动代码。3.1 开发环境准备首先安装必要的工具软件Keil MDK-ARMSTM32开发环境ST-Link驱动程序下载工具串口调试助手如SecureCRT或PuttyOneNet 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(ATCIMI\r\n, OK, 3000) ! BC20_OK) { printf(【错误】SIM卡异常\r\n); return BC20_ERR_SIM; } // 网络附着检查 if(BC20_SendAT(ATCGATT?\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), ATQMTPUB0,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打印制作防护外壳接口处采用防水胶密封天线部分使用防水接头这个项目不仅是一个实用的环境监测工具更是学习嵌入式系统和物联网开发的绝佳平台。通过不断迭代优化你可以将它打造成功能更加丰富的智能硬件设备。