当前位置: 首页 > news >正文

别再手动抄数据了!用STM32+DS18B20+MySQL,自动记录温度曲线(附完整源码)

从传感器到数据库:STM32与MySQL的物联网温度监测系统实战

在工业监控、农业大棚或是实验室环境中,温度数据的持续采集与分析往往是关键环节。传统的手工记录方式不仅效率低下,还容易出错;而简单的本地存储又难以实现数据的长久保存和远程访问。本文将带你构建一套完整的自动化解决方案,使用STM32微控制器采集DS18B20温度传感器的数据,通过串口通信将数据发送到上位机,最终存储到MySQL数据库中,形成一条高效可靠的数据流水线。

这套系统的价值在于它打通了从物理世界到数字世界的桥梁。传感器实时捕捉环境变化,微控制器负责数据采集和初步处理,上位机作为中转站进行数据解析和格式化,而数据库则承担着数据持久化和管理的重任。这种架构不仅适用于温度监测,稍加修改便可应用于湿度、光照、压力等多种物理量的监测场景。

1. 系统架构设计与核心组件选型

1.1 整体工作流程分解

系统的工作流程可以分为三个主要阶段:

  1. 数据采集层:STM32F103C8T6微控制器通过单总线协议与DS18B20温度传感器通信,定期读取温度值
  2. 数据传输层:采集到的温度数据通过USART串口发送到上位机,使用USB转TTL模块实现物理连接
  3. 数据存储层:运行在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 MDK5.38STM32开发IDE
STM32CubeMX6.8.1外设配置工具
MySQL Community Server8.0.28数据库服务
MySQL Connector/ODBC8.0.28数据库驱动
Visual Studio2022上位机开发环境

2. STM32端的数据采集实现

2.1 硬件连接与初始化

DS18B20与STM32的连接非常简单,只需要一根数据线(加上电源和地线共三线)。典型连接方式如下:

DS18B20 STM32 VDD ---- 3.3V DQ ---- PA0 (配置为上拉输入/开漏输出) GND ---- GND

在STM32CubeMX中需要进行以下配置:

  1. 启用USART1,配置为异步模式,波特率9600
  2. 配置PA0为GPIO输出(初始化为高电平)
  3. 启用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窗体应用程序,主要功能包括:

  1. 串口通信配置与数据接收
  2. 温度数据解析与显示
  3. 数据库连接与数据插入

核心数据库操作代码如下:

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 性能优化策略

随着系统长时间运行,可能会遇到以下性能问题及解决方案:

  1. 数据库写入性能瓶颈

    • 使用批量插入代替单条插入
    • 考虑使用内存数据库作为缓存,定期同步到磁盘
    • 优化数据库索引,特别是时间范围查询
  2. 串口通信可靠性

    • 实现数据校验机制(如CRC16)
    • 添加数据重传机制
    • 使用硬件流控制(RTS/CTS)
  3. 资源占用优化

    • 上位机程序采用异步IO操作
    • 合理设置数据采样频率
    • 实现数据压缩后再传输

4.2 系统扩展方向

基础的温度监测系统可以进一步扩展为更复杂的物联网应用:

  1. 多传感器融合

    • 同时监测温度、湿度、气压等多种环境参数
    • 在数据库中添加相应字段
    • 实现传感器数据的关联分析
  2. 远程监控

    • 将数据库部署在云服务器上
    • 开发Web或移动端应用访问数据
    • 实现异常报警通知功能
  3. 数据分析与可视化

    • 使用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Ω,显著提高了通信稳定性。

http://www.jsqmd.com/news/742952/

相关文章:

  • 《全域数学》第一部 数术本源 第三卷 代数原本第14篇 附录二 猜想证明【乖乖数学】
  • 2026年合规GEO系统好用排名,费用怎么样 - mypinpai
  • Tentra MCP:为AI编程助手构建持久代码记忆与架构知识图谱
  • code-context-v2:构建代码语义图谱,提升项目理解与开发效率
  • 轻量级RAG框架Haiku.RAG:快速构建私有知识库问答系统
  • 从SwiGLU到RMSNorm:深入LLaMA-3的‘组件级’调优,为什么这些小改动能带来大提升?
  • OpenCV Stitcher拼接总失败?可能是这3个参数没调对(附实战避坑指南)
  • 分享郑州精密模具定制加工服务 - mypinpai
  • 2026年如何集成Hermes Agent/OpenClaw?阿里云部署及token Plan配置步骤
  • BifrostMCP:连接AI助手与本地环境的MCP协议实践指南
  • CSS !important:深度解析与最佳实践
  • 基于dlib与OpenCV的眼动控制鼠标实现:从人脸关键点到屏幕映射
  • 大语言模型记忆管理:DCPO算法原理与医疗问答实践
  • 阿里云2026年5月怎样部署Hermes Agent/OpenClaw?百炼token Plan解析
  • AI视觉推理在物理教育中的应用与优化
  • 2026年陕西实验室仪器选购排名,哪家好? - mypinpai
  • 从HDLC到PDXP:手把手解析航天测控IP化改造背后的协议升级与数据应用变革
  • 卡梅德生物技术快报|永生化细胞系构建:原理、构建流程与工程化验证数据
  • Solon框架深度解析:高性能Java全场景应用开发实践
  • 从贝叶斯到渠道归因:手把手教你用Python搞定几个小众但好用的归因模型
  • PlotAI:用自然语言指令生成Python数据可视化代码的实践指南
  • AI氛围智能体架构解析:从多模态理解到可控内容生成
  • 工业焊缝缺陷检测实战:我用PatchCore在自建数据集上踩过的那些坑
  • 2026年大同旋转门费用,华意凯瑞性价比高吗 - mypinpai
  • 2026年5月阿里云Hermes Agent/OpenClaw安装指南+百炼token Plan全解析攻略教程
  • 从MGF文件到相似度报告:一份给生物信息学新手的Matchms实战指南
  • 基于Whisper与yt-dlp构建YouTube视频自动转录文档工具
  • 在VS Code中直接预览神经科学数据:Neurofibromin/CursorConverter插件开发详解
  • Windows系统xactengine2_7.dll文件丢失找不到无法启动程序解决
  • 2026年4月市面上口碑好的恒流泵厂家口碑分析,高温恒流泵/碱液质量流量计/高精度齿轮计量泵,恒流泵厂商推荐分析 - 品牌推荐师