DIY一个低成本气象站:STM32F103C8T6核心板+OLED显示风速风向温湿度
2026/4/28 18:22:24 网站建设 项目流程

DIY低成本气象站:STM32F103C8T6+OLED实现风速风向温湿度监测

最近在整理工作室时翻出一块闲置的STM32F103C8T6核心板,突然萌生了个有趣的想法——能不能用它做个桌面气象站?这个被称为"蓝色药丸"的开发板价格不到20元,配合常见的传感器模块,完全可以搭建一个功能完整的微型气象监测系统。经过两周的折腾,终于实现了风速、风向、温湿度的实时采集与OLED显示,整套硬件成本控制在百元以内。

1. 硬件选型与成本控制

选择STM32F103C8T6作为主控有几个明显优势:首先是极高的性价比,市面上兼容板价格普遍在15-25元区间;其次是丰富的社区资源,正点原子和野火等厂商提供了完善的基础库;最重要的是其性能完全满足需求——72MHz主频、64KB Flash、20KB RAM,足以处理多个传感器的数据采集与显示任务。

传感器组合经过多次对比测试后确定为:

  • 风速风向传感器:选用RS485输出的工业级传感器(约45元),相比PWM输出型号更稳定可靠
  • 温湿度传感器:经典的DHT11模块(8元),虽然精度不如SHT30,但胜在接线简单
  • 显示模块:0.96寸4线OLED(15元),比LCD更省电且支持自定义界面

提示:所有模块建议选择3.3V供电版本,避免电平转换问题。若使用5V传感器,需额外添加电平转换电路。

硬件连接方案有两种选择:

方案优点缺点适用场景
飞线连接零成本,快速验证可靠性差,易松动短期测试
自制PCB稳定可靠需要设计打板时间长期使用

我最初采用飞线方案验证功能,确认可行后设计了简单的双面PCB,通过嘉立创免费打样服务制作,实际花费仅需支付运费。

2. 传感器数据采集实战

2.1 RS485风速风向传感器配置

工业级风速传感器通常采用Modbus-RTU协议,需要特别注意以下参数配置:

// USART2初始化代码示例(4800bps 8N1) huart2.Instance = USART2; huart2.Init.BaudRate = 4800; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&huart2);

传感器数据读取流程:

  1. 发送Modbus查询帧(如读取保持寄存器)
  2. 等待并接收响应数据
  3. 校验CRC16后提取有效值
  4. 转换为实际物理量(如m/s)

2.2 DHT11温湿度采集技巧

DHT11虽然简单,但时序要求严格,常见问题包括:

  • 响应超时:检查接线是否接触不良
  • 校验和错误:适当增加两次读取间隔
  • 数据漂移:避免传感器靠近发热元件

改进后的采集代码结构:

void DHT11_ReadData(float *temp, float *humi) { // 1. 主机发送开始信号 DQ_OUT(); DQ_LOW(); delay_ms(18); DQ_HIGH(); delay_us(30); // 2. 等待从机响应 DQ_IN(); while(DQ_READ()); while(!DQ_READ()); while(DQ_READ()); // 3. 接收40位数据 uint8_t data[5] = {0}; for(int i=0; i<5; i++) { for(int j=0; j<8; j++) { while(!DQ_READ()); delay_us(30); data[i] |= DQ_READ() << (7-j); while(DQ_READ()); } } // 4. 校验并转换数据 if(data[4] == (data[0]+data[1]+data[2]+data[3])) { *humi = data[0] + data[1]*0.1; *temp = data[2] + data[3]*0.1; } }

3. OLED界面设计与优化

0.96寸OLED分辨率通常为128x64,合理布局可以同时显示所有气象数据。我的界面分为三个区域:

  1. 顶部状态栏:显示当前时间(通过RTC模块获取)
  2. 中央数据区:用图标+数值形式展示实时测量值
  3. 底部趋势区:用简易折线图显示最近10分钟变化

实现这种布局需要精心设计显示函数:

void OLED_DisplayData(float temp, float humi, float wind_speed, uint16_t wind_dir) { OLED_Clear(); // 1. 绘制顶部状态栏 OLED_ShowString(0, 0, "STM32气象站", 16); OLED_ShowString(90, 0, get_time_str(), 16); OLED_DrawLine(0, 16, 127, 16); // 2. 中央数据区 OLED_ShowBMP(0, 20, 16, 16, temp_icon); // 温度图标 OLED_ShowString(20, 20, "温度:", 16); OLED_ShowFloat(60, 20, temp, 1, 16); OLED_ShowString(100, 20, "C", 16); // ... 其他数据类似显示 // 3. 底部趋势图 OLED_DrawLine(0, 50, 127, 50); draw_simple_graph(wind_speed_history, 10); OLED_Refresh(); }

注意:频繁刷新全屏会导致闪烁,建议使用局部刷新技术。SSD1306支持设置列地址和页地址,可以只更新变化区域。

4. 系统整合与性能优化

当所有传感器和显示功能单独测试通过后,需要解决多任务调度问题。STM32F103没有RTOS支持,可以采用以下策略:

  • 定时器中断:配置基本定时器产生1Hz中断作为系统心跳
  • 状态机设计:将各传感器读取分解为独立状态
  • 非阻塞延时:用HAL_GetTick()替代delay_ms()

典型的主循环结构:

while(1) { uint32_t now = HAL_GetTick(); // 每秒读取一次温湿度 if(now - last_dht11_time >= 1000) { DHT11_ReadData(&temp, &humi); last_dht11_time = now; } // 每5秒读取风速风向 if(now - last_wind_time >= 5000) { read_wind_sensor(); last_wind_time = now; } // 实时刷新显示 OLED_DisplayData(temp, humi, wind_speed, wind_dir); }

电源管理是另一个优化重点。实测发现:

  • 全速运行电流约45mA
  • 关闭不用的外设可降至30mA
  • 加入休眠模式后待机电流<1mA

通过合理配置可以显著延长电池供电时间:

void enter_sleep_mode(void) { // 关闭外设时钟 __HAL_RCC_USART2_CLK_DISABLE(); __HAL_RCC_I2C1_CLK_DISABLE(); // 配置唤醒源 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // 进入停止模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后重新初始化 SystemClock_Config(); MX_USART2_UART_Init(); MX_I2C1_Init(); }

5. 扩展功能与改进方向

基础功能实现后,可以考虑添加这些增强功能:

  • 数据记录:添加SPI Flash存储历史数据
  • 无线传输:通过ESP-01模块上传数据到服务器
  • 报警功能:设置阈值触发蜂鸣器报警
  • 太阳能供电:配合TP4056充电模块实现离网运行

一个实用的改进是增加风向标校准功能。由于安装位置和周边建筑影响,原始风向数据可能需要补偿:

// 风向补偿表(16方位) const int16_t wind_dir_offset[16] = { 0, // N 23, // NNE 45, // NE 68, // ENE 90, // E 113, // ESE 135, // SE 158, // SSE 180, // S 203, // SSW 225, // SW 248, // WSW 270, // W 293, // WNW 315, // NW 338 // NNW }; uint16_t correct_wind_direction(uint16_t raw) { uint8_t index = raw / 22.5; return (raw + wind_dir_offset[index]) % 360; }

硬件上也可以持续优化:

  • 改用SMT元件缩小PCB尺寸
  • 添加防雷击保护电路
  • 设计3D打印外壳提升美观度

这个项目最让我惊喜的是STM32F103C8T6的表现——虽然已经面世十多年,但在这种小型物联应用中依然游刃有余。整个开发过程中,最耗时的部分其实是传感器的机械固定和防风防水处理,电子部分反而比较顺利。建议初学者可以先在洞洞板上验证所有功能,再考虑制作PCB,避免反复修改造成的浪费。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询