别再手动抄数据了!用STM32+DS18B20+MySQL,自动记录温度曲线(附完整源码)
从传感器到数据库:STM32与MySQL的物联网温度监测系统实战
在工业监控、农业大棚或是实验室环境中,温度数据的持续采集与分析往往是关键环节。传统的手工记录方式不仅效率低下,还容易出错;而简单的本地存储又难以实现数据的长久保存和远程访问。本文将带你构建一套完整的自动化解决方案,使用STM32微控制器采集DS18B20温度传感器的数据,通过串口通信将数据发送到上位机,最终存储到MySQL数据库中,形成一条高效可靠的数据流水线。
这套系统的价值在于它打通了从物理世界到数字世界的桥梁。传感器实时捕捉环境变化,微控制器负责数据采集和初步处理,上位机作为中转站进行数据解析和格式化,而数据库则承担着数据持久化和管理的重任。这种架构不仅适用于温度监测,稍加修改便可应用于湿度、光照、压力等多种物理量的监测场景。
1. 系统架构设计与核心组件选型
1.1 整体工作流程分解
系统的工作流程可以分为三个主要阶段:
- 数据采集层:STM32F103C8T6微控制器通过单总线协议与DS18B20温度传感器通信,定期读取温度值
- 数据传输层:采集到的温度数据通过USART串口发送到上位机,使用USB转TTL模块实现物理连接
- 数据存储层:运行在PC上的数据处理程序接收串口数据,解析后通过ODBC接口写入MySQL数据库
这种分层架构的优点是各模块职责明确,便于单独调试和功能扩展。例如,如果需要更换温度传感器型号,只需修改数据采集层的代码,其他部分可以保持不变。
1.2 关键硬件组件介绍
STM32F103C8T6(蓝莓派开发板):
- Cortex-M3内核,72MHz主频
- 64KB Flash,20KB RAM
- 3个USART接口
- 丰富的GPIO和外设资源
DS18B20数字温度传感器:
- 测量范围:-55°C至+125°C
- ±0.5°C精度(-10°C至+85°C)
- 单总线接口,节省IO资源
- 每个器件有唯一64位序列号,支持多设备并联
USB转TTL模块(CH340G芯片):
- 支持3.3V/5V电平
- 最高波特率可达2Mbps
- 即插即用,无需额外驱动
1.3 软件栈选择
开发环境配置如下表所示:
| 组件 | 版本 | 备注 |
|---|---|---|
| Keil MDK | 5.38 | STM32开发IDE |
| STM32CubeMX | 6.8.1 | 外设配置工具 |
| MySQL Community Server | 8.0.28 | 数据库服务 |
| MySQL Connector/ODBC | 8.0.28 | 数据库驱动 |
| Visual Studio | 2022 | 上位机开发环境 |
2. STM32端的数据采集实现
2.1 硬件连接与初始化
DS18B20与STM32的连接非常简单,只需要一根数据线(加上电源和地线共三线)。典型连接方式如下:
DS18B20 STM32 VDD ---- 3.3V DQ ---- PA0 (配置为上拉输入/开漏输出) GND ---- GND在STM32CubeMX中需要进行以下配置:
- 启用USART1,配置为异步模式,波特率9600
- 配置PA0为GPIO输出(初始化为高电平)
- 启用SysTick定时器,用于精确延时
2.2 DS18B20驱动开发
DS18B20采用单总线协议,其时序要求非常严格。以下是温度读取的核心代码片段:
// 复位DS18B20 uint8_t DS18B20_Reset(void) { uint8_t presence = 0; HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET); delay_us(480); // 保持480us低电平 HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET); delay_us(60); // 等待60us presence = !HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN); delay_us(420); // 等待存在脉冲结束 return presence; } // 读取温度值 float DS18B20_GetTemperature(void) { uint8_t tempL, tempH; uint16_t temp; float temperature; DS18B20_Reset(); DS18B20_WriteByte(0xCC); // 跳过ROM DS18B20_WriteByte(0x44); // 启动温度转换 delay_ms(750); // 等待转换完成 DS18B20_Reset(); DS18B20_WriteByte(0xCC); // 跳过ROM DS18B20_WriteByte(0xBE); // 读取暂存器 tempL = DS18B20_ReadByte(); tempH = DS18B20_ReadByte(); temp = (tempH << 8) | tempL; if(temp & 0x8000) { // 负温度 temperature = -(float)((temp ^ 0xFFFF) + 1) * 0.0625; } else { // 正温度 temperature = (float)temp * 0.0625; } return temperature; }2.3 数据格式化与串口传输
采集到的温度数据需要通过串口发送到上位机。为了提高数据传输的可靠性,我们设计了一个简单的数据帧格式:
[起始符][温度值][单位][结束符] 例如:"T25.6C\n"对应的STM32代码实现:
while(1) { float temperature = DS18B20_GetTemperature(); printf("T%.1fC\n", temperature); // 格式化输出 HAL_Delay(2000); // 每2秒采集一次 }提示:在实际应用中,可以考虑添加CRC校验或使用更复杂的协议(如Modbus)来提高通信可靠性,特别是在电磁环境复杂的工业场景中。
3. 上位机数据处理与数据库存储
3.1 MySQL数据库配置
首先需要在MySQL中创建用于存储温度数据的数据库和表:
CREATE DATABASE IF NOT EXISTS iot_monitor; USE iot_monitor; CREATE TABLE temperature_data ( id INT AUTO_INCREMENT PRIMARY KEY, device_id VARCHAR(20) NOT NULL, temperature FLOAT NOT NULL, record_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, location VARCHAR(50) COMMENT '传感器位置信息' );这种表结构设计具有以下优点:
- 自动生成递增的ID作为主键
- 记录设备ID便于区分多个传感器
- 默认使用当前时间作为记录时间戳
- 添加位置字段便于后期数据分析
3.2 上位机程序开发
使用C#开发一个Windows窗体应用程序,主要功能包括:
- 串口通信配置与数据接收
- 温度数据解析与显示
- 数据库连接与数据插入
核心数据库操作代码如下:
using MySql.Data.MySqlClient; public class DatabaseManager { private string connectionString = "Server=localhost;Database=iot_monitor;Uid=root;Pwd=yourpassword;"; public bool InsertTemperatureData(string deviceId, float temperature) { using (MySqlConnection conn = new MySqlConnection(connectionString)) { try { conn.Open(); string sql = "INSERT INTO temperature_data (device_id, temperature) VALUES (@deviceId, @temp)"; MySqlCommand cmd = new MySqlCommand(sql, conn); cmd.Parameters.AddWithValue("@deviceId", deviceId); cmd.Parameters.AddWithValue("@temp", temperature); int rowsAffected = cmd.ExecuteNonQuery(); return rowsAffected > 0; } catch (Exception ex) { Console.WriteLine($"数据库操作失败: {ex.Message}"); return false; } } } public DataTable GetTemperatureHistory(string deviceId, DateTime start, DateTime end) { DataTable dt = new DataTable(); using (MySqlConnection conn = new MySqlConnection(connectionString)) { string sql = "SELECT temperature, record_time FROM temperature_data " + "WHERE device_id = @deviceId AND record_time BETWEEN @start AND @end " + "ORDER BY record_time"; MySqlCommand cmd = new MySqlCommand(sql, conn); cmd.Parameters.AddWithValue("@deviceId", deviceId); cmd.Parameters.AddWithValue("@start", start); cmd.Parameters.AddWithValue("@end", end); MySqlDataAdapter adapter = new MySqlDataAdapter(cmd); adapter.Fill(dt); } return dt; } }3.3 串口数据处理
上位机需要实时监听串口数据,并从中提取温度值:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { string data = serialPort1.ReadLine(); if (data.StartsWith("T") && data.EndsWith("C")) { string tempStr = data.Substring(1, data.Length - 2); if (float.TryParse(tempStr, out float temperature)) { this.Invoke(new Action(() => { textBoxTemp.Text = temperature.ToString("0.0"); chart1.Series["Temperature"].Points.AddY(temperature); databaseManager.InsertTemperatureData("DS18B20_01", temperature); })); } } }注意:在实际应用中,应该添加异常处理和数据校验逻辑,特别是在处理来自串口的原始数据时,防止错误数据导致程序崩溃。
4. 系统优化与扩展应用
4.1 性能优化策略
随着系统长时间运行,可能会遇到以下性能问题及解决方案:
数据库写入性能瓶颈:
- 使用批量插入代替单条插入
- 考虑使用内存数据库作为缓存,定期同步到磁盘
- 优化数据库索引,特别是时间范围查询
串口通信可靠性:
- 实现数据校验机制(如CRC16)
- 添加数据重传机制
- 使用硬件流控制(RTS/CTS)
资源占用优化:
- 上位机程序采用异步IO操作
- 合理设置数据采样频率
- 实现数据压缩后再传输
4.2 系统扩展方向
基础的温度监测系统可以进一步扩展为更复杂的物联网应用:
多传感器融合:
- 同时监测温度、湿度、气压等多种环境参数
- 在数据库中添加相应字段
- 实现传感器数据的关联分析
远程监控:
- 将数据库部署在云服务器上
- 开发Web或移动端应用访问数据
- 实现异常报警通知功能
数据分析与可视化:
- 使用Python的Matplotlib或Plotly库生成专业图表
- 实现温度变化趋势预测
- 导出Excel或PDF报告
# 示例:使用Python分析温度数据 import pandas as pd import matplotlib.pyplot as plt from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://user:password@localhost/iot_monitor') df = pd.read_sql('SELECT * FROM temperature_data', engine) plt.figure(figsize=(12, 6)) plt.plot(df['record_time'], df['temperature']) plt.title('Temperature Trend') plt.xlabel('Time') plt.ylabel('Temperature (°C)') plt.grid(True) plt.show()4.3 长期运行的系统维护
要使系统能够稳定长期运行,需要考虑以下方面:
- 日志记录:记录系统运行状态和异常情况
- 自动备份:定期备份数据库,防止数据丢失
- 故障恢复:实现系统自监测和自动恢复机制
- 安全防护:加强数据库访问权限控制
下表总结了系统各模块的维护要点:
| 模块 | 维护内容 | 周期 | 工具/方法 |
|---|---|---|---|
| STM32 | 固件更新 | 按需 | ST-LINK编程器 |
| 传感器 | 校准检查 | 每月 | 标准温度源对比 |
| 上位机 | 日志清理 | 每周 | 批处理脚本 |
| 数据库 | 备份执行 | 每日 | mysqldump |
| 数据库 | 性能优化 | 季度 | EXPLAIN分析慢查询 |
在实际部署中,我们遇到了传感器偶尔读取失败的情况。通过分析发现是电源噪声导致的,解决方法是在DS18B20的电源引脚添加一个0.1μF的去耦电容,同时将数据线上拉电阻从4.7kΩ减小到2.2kΩ,显著提高了通信稳定性。
