[toc]
# 一个简易的报告
## 0. 运行结果
恒温控制系统由上位机和下位机组成,通过串口通信实现温度控制。详细解释一下系统的运行过程和结果:
1. 系统初始化:
- 下位机初始化串口和定时器0。
- 上位机初始化串口连接。
2. 温度设定:
- 用户通过上位机界面设置目标温度。
- 上位机将设定温度发送给下位机,格式为:0x55 (起始字节), 0x01 (数据类型), 高字节, 低字节, 0xaa (结束字节)。
3. 下位机接收设定温度:
- 串口中断服务函数 `serial_isr` 接收数据。
- `process_received_packet` 函数解析数据包,更新 `SetValue`。
4. PID控制循环:
- `PID_Control` 函数读取当前温度,计算误差。
- 使用PID算法计算控制输出。
- 更新PWM值,控制加热元件。
5. 温度显示:
- `update_display_buffer` 函数更新显示缓冲区。
- `update_display` 函数在数码管上显示当前温度。
6. 温度反馈:
- 定时器0中断每50ms触发一次,设置发送标志。
- 主循环中每5个周期(约250ms)发送一次温度数据到上位机。
- `send_temperature` 函数发送格式为:0x55, 0x02, 温度高字节, 温度低字节, 0xaa。
7. 上位机接收和显示:
- 上位机接收温度数据,解析并显示在界面上。
- 可能会绘制温度-时间曲线。
8. 循环控制:
- 系统持续运行,不断调整PWM输出以维持设定温度。
运行结果:
1. 稳定性:系统应能在短时间内达到并维持设定温度,温度波动应较小。
2. 响应性:当设定温度改变时,系统应能迅速调整以达到新的目标温度。
3. 精确度:实际温度应与设定温度非常接近,误差应在可接受范围内。
4. 可视化:
- 下位机数码管实时显示当前温度。
- 上位机界面显示设定温度、当前温度,可能还有温度变化曲线。
5. 抗干扰能力:系统应能应对外部温度变化,保持稳定控制。
6. 安全性:PWM输出有限幅保护,防止过热。
7. 通信稳定性:上下位机之间保持稳定的数据交换,确保控制的连续性。
总的来说,实现了一个闭环控制的恒温系统,通过PID算法实现精确的温度控制,并提供了良好的用户界面和反馈机制。系统的性能将取决于PID参数的调整、硬件的质量和环境因素。
### 硬件原理图

### 实时温度数据监控

### 历史温度数据查询

## 1. 使用的软件
在实现上位机和下位机的串口通信以构建恒温控制系统时,您使用了多种软件。每个软件都有其特定的用途和功能,下面是它们的简介:
### Keil
Keil 是一个集成开发环境(IDE),用于嵌入式系统的开发,特别是针对基于 ARM 架构和 8051 微控制器的项目。
- **功能**:
- **代码编辑和调试**:提供强大的代码编辑和调试工具,可以方便地编写、编译和调试嵌入式 C/C++ 代码。
- **模拟和仿真**:支持在仿真环境中运行和测试代码,减少了在实际硬件上进行测试的需求。
- **集成开发工具**:集成了编译器、链接器和其他开发工具,使开发过程更加高效。
### Proteus
Proteus 是一个电子设计自动化(EDA)工具,广泛用于电路设计、仿真和 PCB 设计。
- **功能**:
- **电路仿真**:可以模拟实际电路的行为,支持各种模拟和数字元件,包括微控制器和传感器。
- **PCB 设计**:提供强大的 PCB 设计工具,能够从原理图直接生成 PCB 布局。
- **虚拟仪器**:提供虚拟示波器、信号发生器等工具,方便调试和测试电路。
### VSPD (Virtual Serial Port Driver)
VSPD 是一个虚拟串口驱动程序,用于创建虚拟串口对,允许在没有物理串口的情况下进行串口通信测试。
- **功能**:
- **虚拟串口对**:创建成对的虚拟串口,两个虚拟串口之间可以互相通信,就像真实的物理串口一样。
- **调试和测试**:方便在软件开发和调试过程中模拟串口通信,特别是在上位机和下位机之间进行通信时。
### 串口调试助手
串口调试助手是一种工具软件,用于测试和调试串口通信,广泛用于嵌入式系统开发和调试过程中。
- **功能**:
- **发送和接收数据**:可以手动或自动发送和接收串口数据,监视串口通信情况。
- **数据格式化**:支持多种数据格式(如十六进制、ASCII)显示和编辑,方便调试和分析。
- **日志记录**:记录和保存通信数据日志,便于后续分析和故障排查。
### PyCharm
PyCharm 是一个专为 Python 开发设计的集成开发环境(IDE),由 JetBrains 开发。
----------------------------
## 2. 上位机程序简单分析
这个程序实现了一个温度控制系统,包含以下主要功能:
1. **串口通信**:
- 初始化串口通信,尝试连接到指定的串口。
- 通过串口接收温度数据并发送设定温度。
2. **SQLite 数据库**:
- 创建并连接到 SQLite 数据库,创建用于存储温度数据的表。
- 插入和查询温度数据。
3. **多线程处理**:
- 使用多线程读取串口数据,防止主线程阻塞。
- 使用数据队列和数据锁管理并发数据访问。
4. **Pygame 音频**:
- 初始化 Pygame 混音器,用于播放音频警告。
5. **Dash 图表**:
- 使用 Dash 和 Plotly 实现实时温度数据图表的显示。
- 在浏览器中显示实时温度数据,并定期更新图表。
6. **Tkinter GUI**:
- 使用 Tkinter 创建图形用户界面。
- 实现设定温度、打开/关闭串口、实时数据显示和查询历史数据的功能。
- 添加按钮和输入框用于用户交互。
- 美化界面,设置主题和样式。
以下是各个功能的详细分析:
### 串口通信
```python
def init_serial():
global ser
try:
ser = serial.Serial('COM3', 9600, timeout=1)
except serial.SerialException as e:
print(f"Serial error: {e}")
ser = None
```
- 初始化串口,尝试连接到 `COM3`,波特率为 `9600`。
- 如果连接失败,捕获异常并输出错误信息。
```python
def send_set_temp(set_temp):
global ser
if ser and ser.is_open:
if set_temp < 15:
set_temp = 50
play_sound('low_temp_alert.wav') # 播放低温警告音频
update_status("温度过低! 调整为 50 °C 并播放警告音.")
elif set_temp > 150:
set_temp = 50
play_sound('high_temp_alert.wav') # 播放高温警告音频
update_status("温度过高! 调整为 50 °C 并播放警告音.")
else:
update_status(f"设定温度为 {set_temp} °C")
set_temp = int(set_temp * 100)
data = bytearray([0x55, 0x01, (set_temp >> 8) & 0xFF, set_temp & 0xFF, 0xaa])
ser.write(data)
else:
update_status("串口未打开")
```
- 发送设定温度数据至串口。
- 检测温度范围,并播放相应警告音频。
- 将温度值放大 100 倍,并转换为字节数组发送。
### SQLite 数据库
```python
# 创建SQLite数据库连接
conn = sqlite3.connect('temperature_data.db', check_same_thread=False)
cursor = conn.cursor()
# 创建表
table_name = 'data_' + time.strftime('%Y%m%d%H%M%S')
cursor.execute(f'''
CREATE TABLE IF NOT EXISTS {table_name} (
timestamp TEXT,
temperature REAL
)
''')
conn.commit()
```
- 创建�