从零到实战的完整指南
目录导读
- 什么是温度传感器监控脚本?
- 监控脚本的核心功能与设计思路
- 主流传感器类型与通信协议
- 脚本开发环境搭建(Python + 树莓派/PC)
- 实战案例:基于DS18B20的温度监控脚本
- 如何实现数据记录与报警通知?
- 常见问题与故障排除
- Q&A环节:你关心的脚本问题
什么是温度传感器监控脚本?
温度传感器监控脚本是一种通过编程语言(如Python、Shell、C等)编写的自动化程序,用于实时读取温度传感器数据、记录历史变化、触发阈值报警,甚至将数据上传至云端或本地数据库,它广泛应用于智能家居、工业控制、农业大棚、数据中心等场景。

脚本就是你的“温度管家”,它不知疲倦地监听传感器信号,一旦温度异常,立刻通知你。
监控脚本的核心功能与设计思路
一个完善的温度监控脚本通常包含以下模块:
- 数据采集模块:通过I2C、GPIO、串口等协议读取传感器原始值
- 数据解析模块:将原始电信号转换为摄氏度/华氏度
- 存储模块:写入CSV、数据库(SQLite/MySQL)或直接打印
- 报警模块:当温度超过设定阈值时,发送邮件、短信或微信通知
- 日志模块:记录脚本运行状态与异常
设计思路建议:优先考虑可靠性(异常重试)、低延迟(非阻塞IO)、可扩展性(模块化函数)。
主流传感器类型与通信协议
| 传感器型号 | 通信协议 | 精度 | 适用场景 |
|---|---|---|---|
| DS18B20 | 1-Wire | ±0.5°C | 工业、环境监测 |
| DHT11/DHT22 | 单总线 | ±2°C | 室内温湿度 |
| SHT30 | I2C | ±0.3°C | 高精度实验室 |
| LM35 | 模拟电压 | ±0.5°C | 低成本开发 |
| 热敏电阻 | 模拟输入 | 非线性 | 定制化需求 |
推荐新手优先使用DS18B20,它只需一根数据线,且支持多点级联。
脚本开发环境搭建
假设你在Linux系统(如树莓派或Ubuntu)上操作:
# 安装Python环境 sudo apt update sudo apt install python3 python3-pip # 安装传感器驱动库 pip3 install w1thermsensor # 用于DS18B20 pip3 install Adafruit_DHT # 用于DHT系列 pip3 install smbus2 # 用于I2C传感器
如果你使用Windows,可以尝试模拟GPIO(如使用com0com虚拟串口进行测试)。
实战案例:基于DS18B20的温度监控脚本
以下是一个完整的Python脚本,读取DS18B20温度并带报警功能:
#!/usr/bin/env python3
# 文件名:temp_monitor.py
import time
import os
import glob
import sys
# 启用1-Wire模块
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
# 查找传感器设备
base_dir = '/sys/bus/w1/devices/'
device_folders = glob.glob(base_dir + '28*')
if len(device_folders) == 0:
print("错误:未检测到温度传感器,请检查连接。")
sys.exit(1)
device_file = device_folders[0] + '/w1_slave'
def read_temp_raw():
with open(device_file, 'r') as f:
return f.readlines()
def read_temp():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
return temp_c
return None
# 主循环
threshold_high = 50.0 # 高温报警阈值
threshold_low = -10.0 # 低温报警阈值
print("温度监控脚本启动,每5秒采样一次...")
while True:
temp = read_temp()
if temp is None:
print("温度读取失败,跳过此轮")
continue
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
print(f"{timestamp} - 当前温度: {temp:.2f}°C")
if temp > threshold_high:
print(f"⚠️ 高温报警!温度 {temp:.2f}°C 超过阈值 {threshold_high}°C")
# 这里可添加发送通知函数
elif temp < threshold_low:
print(f"❄️ 低温报警!温度 {temp:.2f}°C 低于阈值 {threshold_low}°C")
# 写入日志文件
with open('temperature_log.csv', 'a') as log:
log.write(f"{timestamp},{temp:.2f}\n")
time.sleep(5)
运行方式:python3 temp_monitor.py
如何实现数据记录与报警通知?
数据记录扩展:
- 使用SQLite数据库存储:
cursor.execute("INSERT INTO temps VALUES (?,?)", (timestamp, temp)) - 上传至云端:通过MQTT协议发送到如腾讯云IoT Hub或阿里云物联网平台
报警通知方式:
- 邮件:使用
smtplib库发送SMTP邮件 - 短信:调用阿里云短信API或Twilio
- 微信:通过企业微信机器人Webhook或Server酱推送
示例:发送邮件通知(需先开启SMTP服务)
import smtplib
from email.mime.text import MIMEText
def send_alert(temp):
msg = MIMEText(f"温度异常!当前温度:{temp:. .2f}°C")
msg['Subject'] = '温度报警'
msg['From'] = 'your_email@xxx.com'
msg['To'] = 'recipient@xxx.com'
with smtplib.SMTP('smtp.xx.com', 587) as server:
server.starttls()
server.login('your_email@xxx.com', 'password')
server.send_message(msg)
常见问题与故障排除
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 读取到-127°C或85°C | 传感器驱动未加载 | 使用modprobe w1-therm手动加载 |
找不到设备文件28* |
接线错误或GPIO引脚不对 | 检查VCC/GND/Data连接,确保4.7kΩ上拉电阻 |
| 温度数据不更新 | 主循环卡死 | 添加超时机制或改用多线程 |
| 报警不触发 | 阈值设置错误 | 打印当前温度,确认单位是摄氏度 |
Q&A环节:你关心的脚本问题
Q1:监控脚本必须用Python吗?
A:不一定,你还可以用Bash脚本(直接读/sys/bus/w1/devices/28-*/w1_slave)、C语言或Node.js,但Python因其丰富的库和简洁语法,最适合快速开发。
Q2:如何让脚本开机自启?
A:将脚本路径添加到/etc/rc.local,或使用systemd服务单元文件。
Q3:我需要监控多个温度传感器,脚本要改吗?
A:只需修改device_folders的遍历方式,用循环读取所有28*设备,每个传感器有独立ID,可分别命名。
Q4:能远程通过网页查看温度吗? A:可以!使用Flask或Django搭建轻量级Web服务器,将温度数据通过HTTP接口暴露,配合ECharts展示曲线图。
Q5:脚本占用资源大吗? A:非常小,树莓派上运行功耗仅几毫瓦,CPU占用不到1%,适合7×24小时运行。