ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于树莓派与DHT22的物联网温湿度监控系统实战指南

基于树莓派与DHT22的物联网温湿度监控系统实战指南 1. 项目概述用树莓派打造你的专属温度监控站最近在整理工作室的设备发现一个挺实际的需求想实时监控几个关键区域的温度。比如3D打印机的工作环境温度是否稳定存放电子元件的防潮箱内部温湿度是否达标甚至是想看看家里不同房间的温差到底有多大。市面上的成品温湿度计要么功能单一要么数据无法记录和远程查看对于喜欢折腾的我来说显然不够用。于是我翻出了吃灰已久的树莓派Raspberry Pi决定用它来搭建一个功能全面、可定制性极高的温度追踪系统。这个项目听起来可能有点“极客”但其实它的核心逻辑非常简单利用树莓派这个微型电脑作为大脑连接上温湿度传感器作为“感官”编写一小段程序来读取数据最后通过一个直观的网页界面把数据展示出来甚至可以设置报警。整个过程涉及硬件连接、软件配置和简单的编程是入门物联网IoT和自动化监控的绝佳实践。无论你是想监控服务器机柜的温度、确保宠物饲养箱的环境适宜还是单纯对智能家居感兴趣这个项目都能提供一个从零到一的完整解决方案。它不依赖于任何复杂的云服务平台所有数据都在本地处理既保证了隐私也让你对整套系统的运作有完全的控制权。接下来我就把整个搭建过程、核心的技术细节以及我踩过的一些坑毫无保留地分享给你。2. 核心硬件选型与连接方案2.1 为什么选择树莓派作为核心你可能会有疑问测温湿度用个单片机比如Arduino不是更简单便宜吗确实对于单一功能Arduino是更经济的选择。但我选择树莓派主要是看中它的三点优势这决定了整个项目的扩展性和易用性上限。首先强大的计算与网络能力。树莓派本质上是一台运行Linux系统的微型电脑。这意味着我们可以轻松地在它上面运行一个Web服务器例如Nginx或Apache直接托管一个数据可视化界面。你可以在同一局域网内的任何设备手机、电脑、平板上通过浏览器访问这个界面无需额外的APP或复杂的配置。这是单片机很难原生实现的。其次便捷的数据存储与处理。温度数据通常需要记录和分析。树莓派可以直接使用SD卡或外接硬盘存储历史数据到数据库如SQLite或InfluxDB或CSV文件中。你可以编写脚本进行数据分析比如计算日均温度、生成变化曲线甚至基于历史数据做简单的预测。最后极高的可扩展性。今天做温度监控明天你可能想增加一个摄像头监控画面或者连接土壤湿度传感器来照顾阳台的植物。树莓派丰富的GPIO通用输入输出接口和USB接口以及其本身强大的多任务处理能力使得增加新功能变得非常容易。它是一个真正的“平台”而非“一次性方案”。注意树莓派型号众多对于本项目从性价比和功耗考虑Raspberry Pi 3B 或 Raspberry Pi 41GB/2GB内存版本是完全足够的。更早的型号如Pi 2或Zero W需额外配置也能运行但性能和接口可能受限。2.2 传感器选型DHT22 vs DHT11 vs 其他传感器是项目的“眼睛”选对型号事半功倍。在温湿度传感器中DHT系列最为常见。DHT11是入门级选择价格极其低廉。但它精度较低温度±2°C湿度±5%RH且响应较慢。适合对精度要求不高的场景比如大概了解室内是否过热。DHT22也称AM2302是我强烈推荐的型号。虽然价格比DHT11贵一些但其精度温度±0.5°C湿度±2%RH和量程-40 to 80°C都远胜于DHT11响应也更快。对于需要可靠数据的监控场景如设备机房、实验室或种植环境多花这点钱是完全值得的。其他选择如果你追求更高精度或需要监测多个点可以考虑DS18B20仅温度精度高支持一线总线串联多个或BME280温湿度气压三合一精度高使用I2C接口更稳定。本项目以最通用的DHT22为例进行讲解其原理和方法同样适用于其他传感器。2.3 硬件连接实战与电路解析连接树莓派和DHT22只需要三根线如果是模块版通常是四针但VCC、GND、DATA三针是必须的。这是整个项目唯一的硬件操作部分非常简单。所需材料清单树莓派已安装好操作系统推荐Raspberry Pi OS及配套电源DHT22传感器模块版自带上拉电阻更推荐母对母杜邦线 3根一块面包板可选方便接线电路连接步骤给树莓派断电在进行任何硬件连接前请务必确保树莓派已完全断电这是保护GPIO口和树莓派主板的基本操作。识别GPIO针脚树莓派的40针GPIO排针是连接外部设备的关键。我们需要找到3.3V电源3.3V、接地GND和一个可用的数据针脚例如GPIO4对应物理引脚第7号。你可以搜索“树莓派GPIO引脚图”来对照。连接导线将DHT22的VCC或引脚连接到树莓派的3.3V电源引脚例如物理引脚1。将DHT22的GND或-引脚连接到树莓派的任一GND接地引脚例如物理引脚6。将DHT22的DATA或OUT引脚连接到树莓派的GPIO4物理引脚7。上拉电阻DHT22的数据线需要一个上拉电阻约4.7KΩ - 10KΩ连接到3.3V以确保信号稳定。如果你购买的是模块版的DHT22这个电阻通常已经集成在模块上无需额外添加。如果是传感器裸片则需要在DATA线和3.3V线之间焊接一个4.7KΩ的电阻。连接完成后你的硬件部分就准备好了。整个连接的核心逻辑是树莓派提供稳定的3.3V电源和接地并通过指定的GPIO口与传感器进行双向数字通信读取数据。3. 软件环境搭建与驱动配置硬件连接好后我们需要让树莓派系统能够“认识”并“对话”DHT22传感器。这个过程主要是在命令行中完成的。3.1 操作系统准备与基础更新首先确保你的树莓派已经安装了 Raspberry Pi OS原 Raspbian并通过SSH或直接连接显示器键盘的方式登录到系统。打开终端进行系统更新是一个好习惯sudo apt update sudo apt upgrade -y更新完成后我们需要安装Python3的开发环境以及GPIO库。树莓派OS通常预装了Python3但我们还需要安装包管理工具pip和必要的库。sudo apt install python3-pip python3-dev -y3.2 安装Python GPIO与控制库树莓派与GPIO设备交互最常用的库是RPi.GPIO但它对DHT系列传感器的支持需要额外编写复杂的时序代码。为了简化我们直接使用专为DHT传感器优化的Adafruit_DHT库。这个库封装了复杂的通信协议让我们用一两行代码就能读取数据。使用pip进行安装sudo pip3 install Adafruit_DHT实操心得在安装这类硬件相关库时有时会因为编译依赖问题失败。如果遇到错误通常需要先安装一些系统开发包。可以尝试运行sudo apt install build-essential python3-dev后再重试安装命令。3.3 编写第一个测试脚本验证传感器安装好库之后我们立刻编写一个简单的Python脚本来测试传感器是否工作正常。这能快速排除硬件连接或软件配置的问题。创建一个新的Python文件比如叫test_dht22.pynano test_dht22.py在编辑器中输入以下代码import Adafruit_DHT import time # 设置传感器类型和GPIO引脚 DHT_SENSOR Adafruit_DHT.DHT22 DHT_PIN 4 # 我们之前连接的是GPIO4 print(开始读取DHT22传感器数据...) try: while True: # 尝试读取传感器数据 humidity, temperature Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) if humidity is not None and temperature is not None: # 读取成功打印数据 print(温度: {:.1f}°C, 湿度: {:.1f}%.format(temperature, humidity)) else: # 读取失败 print(传感器读取失败请检查连接。) # 每2秒读取一次 time.sleep(2) except KeyboardInterrupt: print(程序被用户中断)按CtrlX然后按Y再按Enter保存并退出。在终端中运行这个脚本python3 test_dht22.py如果一切正常你应该会看到终端里每隔2秒打印出当前的温度和湿度读数。如果一直显示“传感器读取失败”请按CtrlC停止程序然后按以下步骤排查检查硬件连接确保三根线没有松动且VCC、GND、DATA分别对应正确。检查GPIO引脚号确认代码中的DHT_PIN 4与你实际连接的GPIO口一致GPIO4对应物理引脚7。检查电源确保使用的是3.3V引脚而非5V。DHT22虽然兼容5V但树莓派的GPIO口耐压是3.3V用5V可能损坏树莓派。检查上拉电阻如果使用裸片传感器务必确认4.7KΩ上拉电阻已正确连接。当测试脚本能稳定输出数据时恭喜你最核心的“感知”部分已经成功。4. 构建数据采集与存储系统测试成功意味着我们能获取瞬时数据但一个完整的追踪系统需要持续记录。接下来我们将创建一个后台服务定时采集数据并保存下来。4.1 设计数据采集脚本我们希望采集脚本能作为后台服务运行安静地、周期性地工作。我们将创建一个更健壮的脚本temperature_logger.py。nano temperature_logger.py输入以下内容#!/usr/bin/env python3 import Adafruit_DHT import time import csv import os from datetime import datetime # 配置参数 DHT_SENSOR Adafruit_DHT.DHT22 DHT_PIN 4 LOG_INTERVAL 60 # 记录间隔单位秒。60秒1分钟记录一次 CSV_FILE_PATH /home/pi/temperature_data.csv # 数据保存路径 def read_sensor(): 尝试读取传感器数据失败重试2次 for i in range(3): humidity, temperature Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN, retries2, delay_seconds1) if humidity is not None and temperature is not None: return temperature, humidity time.sleep(1) return None, None def ensure_csv_header(): 确保CSV文件存在并包含表头 if not os.path.exists(CSV_FILE_PATH): with open(CSV_FILE_PATH, modew, newline) as file: writer csv.writer(file) writer.writerow([timestamp, temperature_c, humidity_percent]) def log_data(): 主循环读取数据并写入CSV ensure_csv_header() print(f数据记录器已启动数据将保存至: {CSV_FILE_PATH}) print(f记录间隔: {LOG_INTERVAL} 秒) try: while True: temp, humi read_sensor() current_time datetime.now().strftime(%Y-%m-%d %H:%M:%S) if temp is not None and humi is not None: # 写入CSV文件 with open(CSV_FILE_PATH, modea, newline) as file: writer csv.writer(file) writer.writerow([current_time, round(temp, 2), round(humi, 2)]) # 在控制台输出当前记录可选 print(f[{current_time}] 记录成功: {temp:.1f}°C, {humi:.1f}%) else: print(f[{current_time}] 警告: 传感器读取失败本次跳过。) time.sleep(LOG_INTERVAL) except KeyboardInterrupt: print(\n数据记录器被用户中断。) except Exception as e: print(f\n发生未知错误: {e}) if __name__ __main__: log_data()这个脚本做了几件关键事定时循环每60秒可调读取一次传感器。错误处理加入了重试机制单次读取失败会自动重试2次避免因瞬时干扰丢失数据。数据持久化将时间戳、温度和湿度以CSV格式保存到文件。CSV是一种通用格式可以用Excel、Numbers或任何文本编辑器打开后续分析非常方便。自动创建文件首次运行时如果CSV文件不存在会自动创建并写入表头。4.2 配置系统服务实现开机自启我们不希望每次树莓派重启后都要手动去运行这个Python脚本。最好的方式是将其配置为一个系统服务systemd service。首先给脚本添加可执行权限chmod x temperature_logger.py然后创建系统服务文件sudo nano /etc/systemd/system/temp-tracker.service在文件中写入以下配置[Unit] DescriptionTemperature and Humidity Tracker Service Aftermulti-user.target [Service] Typesimple Userpi WorkingDirectory/home/pi ExecStart/usr/bin/python3 /home/pi/temperature_logger.py Restarton-failure RestartSec10 [Install] WantedBymulti-user.target这个服务单元文件告诉系统Description服务描述。After指定在什么目标之后启动这里是在多用户模式启动后。Type服务类型为简单型。User以pi用户身份运行请确保你的用户名是pi否则需要修改。ExecStart服务启动时执行的命令即运行我们的Python脚本。Restart如果服务意外失败自动重启。WantedBy指定服务被哪个系统目标需要。保存退出后执行以下命令启用并启动服务# 重新加载systemd配置 sudo systemctl daemon-reload # 启用服务使其开机自启 sudo systemctl enable temp-tracker.service # 立即启动服务 sudo systemctl start temp-tracker.service # 查看服务状态确认运行正常 sudo systemctl status temp-tracker.service如果状态显示为“active (running)”并且用tail -f /home/pi/temperature_data.csv命令能看到数据在不断追加那么恭喜你的自动化数据采集后台服务已经搭建成功。即使树莓派重启这个服务也会自动运行。5. 创建可视化Web监控界面数据躺在CSV文件里还不够直观。我们将搭建一个轻量级的Web服务器创建一个简单的页面来实时显示当前数据并绘制历史趋势图。5.1 使用Flask搭建轻量级Web服务器Python的Flask框架非常适合快速构建小型Web应用。首先安装Flasksudo pip3 install flask接下来创建我们的Web应用主文件web_app.pynano web_app.py输入以下代码#!/usr/bin/env python3 from flask import Flask, render_template, jsonify import csv import os from datetime import datetime, timedelta import Adafruit_DHT app Flask(__name__) # 配置 CSV_FILE /home/pi/temperature_data.csv DHT_SENSOR Adafruit_DHT.DHT22 DHT_PIN 4 def get_latest_sensor_data(): 直接从传感器读取最新数据用于实时显示 humidity, temperature Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) if humidity is not None and temperature is not None: return { temperature: round(temperature, 1), humidity: round(humidity, 1), timestamp: datetime.now().strftime(%H:%M:%S) } return None def get_historical_data(hours24): 从CSV文件中获取最近N小时的历史数据用于绘图 data {timestamps: [], temperatures: [], humidities: []} if not os.path.exists(CSV_FILE): return data cutoff_time datetime.now() - timedelta(hourshours) with open(CSV_FILE, r) as f: reader csv.DictReader(f) for row in reader: try: # 解析时间戳 record_time datetime.strptime(row[timestamp], %Y-%m-%d %H:%M:%S) if record_time cutoff_time: data[timestamps].append(row[timestamp][11:19]) # 只取时分秒 data[temperatures].append(float(row[temperature_c])) data[humidities].append(float(row[humidity_percent])) except (KeyError, ValueError) as e: # 跳过格式错误的行 continue # 为了图表显示清晰如果数据点太多可以适当抽样。这里简单返回最后300个点。 max_points 300 if len(data[timestamps]) max_points: step len(data[timestamps]) // max_points data[timestamps] data[timestamps][::step] data[temperatures] data[temperatures][::step] data[humidities] data[humidities][::step] return data app.route(/) def index(): 主页面渲染HTML模板 return render_template(index.html) app.route(/api/current) def current_data(): API接口返回当前传感器数据 data get_latest_sensor_data() if data: return jsonify(data) else: return jsonify({error: 无法读取传感器}), 500 app.route(/api/history) def history_data(): API接口返回历史数据 hours request.args.get(hours, default24, typeint) return jsonify(get_historical_data(hours)) if __name__ __main__: # 在树莓派本地5000端口运行局域网内可访问 app.run(host0.0.0.0, port5000, debugFalse)5.2 设计前端页面与动态图表Flask使用Jinja2模板。我们需要创建一个templates文件夹并在里面放置HTML文件。mkdir templates nano templates/index.html这是一个集成了Chart.js图表库的简单前端页面!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title树莓派温度监控站/title script srchttps://cdn.jsdelivr.net/npm/chart.js/script style body { font-family: sans-serif; margin: 20px; background-color: #f5f5f5; } .container { max-width: 1000px; margin: auto; background: white; padding: 20px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } .current-data { display: flex; justify-content: space-around; margin-bottom: 30px; } .data-box { text-align: center; padding: 20px; border-radius: 8px; color: white; min-width: 150px; } .temp-box { background: linear-gradient(135deg, #ff7e5f, #feb47b); } .humi-box { background: linear-gradient(135deg, #36d1dc, #5b86e5); } .value { font-size: 3em; font-weight: bold; } .unit { font-size: 1.5em; } .label { font-size: 1.2em; margin-top: 5px; } .chart-container { margin-top: 20px; } .controls { margin: 20px 0; text-align: center; } button { padding: 10px 20px; margin: 5px; border: none; border-radius: 5px; cursor: pointer; background-color: #4CAF50; color: white; } button:hover { opacity: 0.9; } /style /head body div classcontainer h1️ 树莓派环境监控中心/h1 p实时监控温度与湿度数据数据更新于 span idupdateTime--:--:--/span/p div classcurrent-data div classdata-box temp-box div classvalue idcurrentTemp--/div div classunit°C/div div classlabel当前温度/div /div div classdata-box humi-box div classvalue idcurrentHumi--/div div classunit%/div div classlabel当前湿度/div /div /div div classcontrols label查看历史数据/label button onclickloadHistoryData(6)最近6小时/button button onclickloadHistoryData(24)最近24小时/button button onclickloadHistoryData(72)最近3天/button /div div classchart-container canvas idhistoryChart/canvas /div /div script let historyChart; const ctx document.getElementById(historyChart).getContext(2d); // 初始化图表 function initChart() { historyChart new Chart(ctx, { type: line, data: { labels: [], datasets: [{ label: 温度 (°C), data: [], borderColor: rgb(255, 99, 132), backgroundColor: rgba(255, 99, 132, 0.1), tension: 0.3, yAxisID: y }, { label: 湿度 (%), data: [], borderColor: rgb(54, 162, 235), backgroundColor: rgba(54, 162, 235, 0.1), tension: 0.3, yAxisID: y1 }] }, options: { responsive: true, interaction: { mode: index, intersect: false }, scales: { x: { title: { display: true, text: 时间 } }, y: { type: linear, display: true, position: left, title: { display: true, text: 温度 (°C) } }, y1: { type: linear, display: true, position: right, title: { display: true, text: 湿度 (%) }, grid: { drawOnChartArea: false } } } } }); } // 获取并更新当前数据 function fetchCurrentData() { fetch(/api/current) .then(response response.json()) .then(data { if (!data.error) { document.getElementById(currentTemp).textContent data.temperature; document.getElementById(currentHumi).textContent data.humidity; document.getElementById(updateTime).textContent data.timestamp; } }) .catch(err console.error(获取当前数据失败:, err)); } // 加载历史数据并更新图表 function loadHistoryData(hours) { fetch(/api/history?hours${hours}) .then(response response.json()) .then(data { historyChart.data.labels data.timestamps; historyChart.data.datasets[0].data data.temperatures; historyChart.data.datasets[1].data data.humidities; historyChart.update(); }) .catch(err console.error(获取历史数据失败:, err)); } // 页面加载完成后初始化 document.addEventListener(DOMContentLoaded, function() { initChart(); loadHistoryData(24); // 默认加载24小时数据 fetchCurrentData(); // 立即获取一次当前数据 // 每10秒更新一次当前数据 setInterval(fetchCurrentData, 10000); }); /script /body /html5.3 启动Web服务与访问现在回到终端运行我们的Flask应用python3 web_app.py你会看到输出提示服务运行在http://0.0.0.0:5000。这意味着它正在监听树莓派的所有网络接口。在你的电脑或手机浏览器中输入树莓派的IP地址加上端口号5000进行访问。例如http://192.168.1.100:5000请将IP替换为你树莓派的实际局域网IP可以通过在树莓派终端输入hostname -I查看。如果一切顺利你将看到一个简洁的监控面板上方卡片实时显示当前温湿度下方是交互式图表可以切换查看最近6小时、24小时或72小时的历史趋势。实操心得在生产环境我们同样应该将Flask应用配置为系统服务并可能使用Nginx作为反向代理用Gunicorn作为WSGI服务器来提升性能和稳定性。但对于家庭或工作室内部使用直接用Flask开发服务器在5000端口运行已经足够简单和稳定。记得在路由器中为树莓派设置一个静态IP地址这样每次访问的地址就不会变了。6. 高级功能扩展与优化思路基础功能实现后这个系统还有巨大的潜力可以挖掘。这里分享几个我实践过或认为非常有价值的扩展方向。6.1 实现阈值报警功能邮件/通知监控的核心价值之一是预警。我们可以修改数据采集脚本在数据超出设定范围时触发报警。邮件报警示例 首先需要配置树莓派的邮件发送功能。可以使用smtplib库。以下是一个集成到temperature_logger.py中的简单思路在脚本开头定义报警阈值和邮件配置。在log_data函数的循环中每次读取数据后判断是否超出阈值。如果超出调用一个send_alert_email(temp, humi)函数。该函数使用SMTP协议例如QQ邮箱、Gmail的SMTP服务发送邮件到指定地址。注意使用邮箱SMTP服务通常需要开启“授权码”而不是使用密码登录并且要确保网络环境允许访问外网SMTP端口。对于更即时的通知可以考虑使用Telegram Bot或Server酱微信通知等API它们配置起来更简单且不依赖邮件客户端。6.2 接入开源可视化平台Grafana如果你希望获得更专业、更强大的仪表盘可以将数据导入InfluxDB时序数据库然后使用Grafana进行可视化。这是一个在运维和IoT领域非常流行的组合。简要步骤在树莓派上安装InfluxDB和Grafana。修改数据采集脚本将数据写入InfluxDB使用influxdbPython库而不是或同时写入CSV。在Grafana中添加InfluxDB作为数据源。在Grafana中创建仪表盘可以自由拖拽组件绘制多种图表曲线图、仪表盘、统计值等并设置丰富的报警规则。这套方案的优势是可视化能力极强支持多数据源聚合适合严肃的生产环境监控。6.3 多节点部署与集中监控如果你需要在多个位置例如客厅、书房、地下室部署监测点可以搭建一个“中心-节点”的架构。节点每个监测点使用一个更廉价的设备如ESP8266NodeMCU或Raspberry Pi Pico搭配DHT22。它们负责采集数据并通过Wi-Fi将数据发送到中心服务器。中心服务器树莓派作为服务器运行一个接收数据的服务可以用Flask写一个接收API并将所有节点的数据存入数据库如InfluxDB或MySQL。统一展示在中心服务器的Web界面或Grafana中可以同时展示所有节点的数据并进行对比分析。这样既节省了中心节点的成本多个Pi Pico比多个树莓派便宜得多又实现了分布式监控。7. 常见问题排查与维护心得在部署和长期运行过程中你可能会遇到一些问题。以下是我总结的一些常见情况及解决方法。7.1 传感器读数不稳定或频繁失败症状数据时有时无或经常显示“读取失败”。可能原因与解决电源干扰确保传感器VCC连接的是树莓派上“干净”的3.3V电源。避免使用面包板上过长、过细的导线供电。可以尝试在VCC和GND之间并联一个10uF - 100uF的电解电容以稳定电压。信号干扰DATA信号线尽可能短。如果导线超过20厘米考虑使用屏蔽线或双绞线。确保上拉电阻4.7KΩ - 10KΩ已正确连接且阻值合适。时序问题DHT22对读取时序要求严格。Adafruit_DHT库已经做了优化但如果问题依旧可以尝试在read_retry函数中增加delay_seconds参数例如设为2给传感器更长的准备时间。传感器损坏在极端潮湿、静电或过压情况下传感器可能损坏。可以用万用表测量VCC和GND之间电压是否为稳定的3.3V并尝试更换一个传感器测试。7.2 Web页面无法访问或加载缓慢症状浏览器打不开页面或图表加载很久。可能原因与解决IP地址错误确认你访问的树莓派IP地址是否正确且没有变化。最好在路由器中为树莓派设置静态IPDHCP保留。防火墙阻止树莓派OS默认的防火墙如ufw可能阻止了5000端口。可以暂时关闭防火墙测试sudo ufw disable或开放端口sudo ufw allow 5000。Flask服务未运行检查python3 web_app.py进程是否在运行。可以用ps aux | grep web_app查看。性能问题如果树莓派型号较老如Pi 1或Zero同时运行数据记录和Web服务可能负载较高。可以考虑将两者合并到一个脚本中或者使用更轻量的HTTP服务器如lighttpd来托管静态页面用Python CGI提供API。7.3 数据记录服务意外停止症状temperature_data.csv文件不再更新。可能原因与解决查看服务日志使用sudo journalctl -u temp-tracker.service -f命令实时查看服务的日志输出通常能找到错误信息。权限问题确保服务运行用户如pi对脚本文件和CSV文件所在目录有读写权限。SD卡空间不足定期检查磁盘空间df -h。可以修改脚本按日期分割CSV文件例如每天一个新文件并定期清理旧数据。Python环境问题如果更新了系统或Python包可能导致依赖冲突。可以尝试重启服务sudo systemctl restart temp-tracker.service或重新安装Adafruit_DHT库。7.4 长期运行的稳定性建议使用高质量的电源树莓派对电源质量敏感劣质电源可能导致系统不稳定、SD卡损坏。使用官方电源或输出为5V/2.5A以上、质量可靠的电源适配器。启用只读文件系统如果项目部署后基本不再改动可以考虑将根文件系统挂载为只读这能极大提高SD卡寿命和系统抗意外断电的能力。但这需要额外的配置。定期备份数据将temperature_data.csv文件定期备份到其他设备或云存储防止SD卡损坏导致历史数据丢失。可以写一个简单的cron任务用scp或rsync同步到NAS或电脑上。监控树莓派本身你甚至可以再写一个脚本监控树莓派的CPU温度、负载和内存使用情况一并展示在Web界面上实现“监控者的自我监控”。这个项目从一根杜邦线开始到构建出一个完整的本地化监控系统涵盖了硬件连接、Linux操作、Python编程、Web开发等多个环节。它最大的魅力不在于用了多高深的技术而在于用简单的工具解决了一个真实的需求并且每一个环节你都能完全掌控和定制。当你坐在办公室里就能随时查看家里书房的温湿度曲线时那种亲手搭建系统带来的满足感是购买任何成品都无法替代的。希望这份详细的指南能帮你顺利搭建起自己的树莓派温度追踪站并在此基础上玩出更多花样。
返回列表