保姆级教程:用树莓派5和Python3.11搭建家庭气象站(含DS18B20传感器配置)
·
保姆级教程:用树莓派5和Python3.11搭建家庭气象站(含DS18B20传感器配置)
1. 硬件准备与环境搭建
树莓派5作为最新一代单板计算机,其性能提升让家庭气象站的数据处理更加流畅。我们先从硬件选购开始:
必备组件清单 :
- 树莓派5主板(建议4GB内存版本)
- DS18B20防水型温度传感器(带4.7KΩ上拉电阻)
- 16GB以上microSD卡(推荐UHS-I Class10规格)
- 官方电源适配器(USB-C 5V/3A)
- 防水接线盒(用于户外安装)
- 40pin GPIO扩展板(可选,方便接线)
注意:DS18B20有TO-92封装和防水不锈钢封装两种,户外使用务必选择后者。
安装Raspberry Pi OS Bullseye系统时,建议选择Lite版本以减少资源占用:
# 使用Raspberry Pi Imager刷写系统时的高级配置
sudo raspi-config nonint do_wifi_country CN # 设置WiFi国家代码
sudo raspi-config nonint do_ssh 0 # 启用SSH
sudo raspi-config nonint do_spi 1 # 启用SPI接口
2. DS18B20传感器配置全流程
2.1 物理连接与内核模块加载
DS18B20采用单总线协议,接线非常简单:
DS18B20引脚说明:
1. 黑线 - GND(接树莓派GPIO 6)
2. 红线 - VCC(接树莓派GPIO 1)
3. 黄线 - DATA(接树莓派GPIO 7)
修改 /boot/config.txt 添加设备树覆盖:
# 在文件末尾添加
dtoverlay=w1-gpio,gpiopin=4,pullup=on
重启后检查设备是否识别成功:
ls /sys/bus/w1/devices/ | grep 28-
正常应显示类似 28-00000xxxxxxx 的设备ID。
2.2 温度读取异常排查指南
常见问题及解决方案:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 无设备显示 | 接线错误/接触不良 | 检查VCC-GND电压(3.3V) |
| 温度值85℃ | 初始化失败 | 检查上拉电阻是否连接 |
| 随机跳变 | 电源干扰 | 缩短导线长度或加滤波电容 |
3. Python数据采集系统实现
3.1 使用Python3.11异步采集
新建 weather_station.py 文件:
import asyncio
from datetime import datetime
import glob
class DS18B20:
def __init__(self, sensor_id=None):
self.device_file = self._find_sensor(sensor_id)
def _find_sensor(self, sensor_id):
base_dir = "/sys/bus/w1/devices/"
devices = glob.glob(base_dir + "28*")
if not devices:
raise RuntimeError("未检测到DS18B20设备")
return devices[0] + "/w1_slave" if not sensor_id else f"{base_dir}{sensor_id}/w1_slave"
async def read_temp(self):
while True:
with open(self.device_file, "r") as f:
lines = f.readlines()
if "YES" in lines[0]:
temp_pos = lines[1].find("t=")
if temp_pos != -1:
temp = float(lines[1][temp_pos+2:])/1000.0
yield {
"timestamp": datetime.now().isoformat(),
"temperature": temp
}
await asyncio.sleep(60)
async def main():
sensor = DS18B20()
async for reading in sensor.read_temp():
print(f"[{reading['timestamp']}] 当前温度: {reading['temperature']:.2f}℃")
if __name__ == "__main__":
asyncio.run(main())
3.2 数据持久化方案比较
三种存储方式对比如下:
| 存储方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| SQLite | 无需额外服务 | 并发性能有限 | 单机小型应用 |
| InfluxDB | 时序数据优化 | 需要单独安装 | 高频采集场景 |
| CSV文件 | 简单直观 | 查询效率低 | 临时测试使用 |
推荐使用SQLite3进行存储:
import sqlite3
def init_db():
conn = sqlite3.connect('weather.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS readings
(timestamp TEXT PRIMARY KEY, temp REAL)''')
conn.commit()
return conn
4. 可视化界面开发
4.1 轻量级Flask仪表盘
安装必要依赖:
pip install flask flask-charts
创建 app.py :
from flask import Flask, render_template
import sqlite3
from datetime import datetime, timedelta
app = Flask(__name__)
@app.route("/")
def dashboard():
conn = sqlite3.connect('weather.db')
c = conn.cursor()
# 获取最近24小时数据
time_threshold = (datetime.now() - timedelta(hours=24)).isoformat()
c.execute("SELECT timestamp, temp FROM readings WHERE timestamp > ?", (time_threshold,))
data = [{"time": row[0], "temp": row[1]} for row in c.fetchall()]
return render_template('dashboard.html',
current_temp=data[-1]["temp"] if data else None,
chart_data=data)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
对应的 templates/dashboard.html :
<!DOCTYPE html>
<html>
<head>
<title>家庭气象站</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<h1>当前温度: {{ current_temp|round(2) }}℃</h1>
<canvas id="tempChart" width="800" height="400"></canvas>
<script>
const ctx = document.getElementById('tempChart').getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
labels: {{ chart_data|map(attribute='time')|list|tojson }},
datasets: [{
label: '温度变化',
data: {{ chart_data|map(attribute='temp')|list|tojson }},
borderColor: 'rgb(255, 99, 132)',
tension: 0.1
}]
}
});
</script>
</body>
</html>
4.2 移动端适配技巧
在 dashboard.html 的 <head> 中添加:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
#tempChart {
max-width: 100%;
height: auto;
}
@media (max-width: 600px) {
h1 { font-size: 1.5em; }
}
</style>
5. 系统优化与扩展
5.1 功耗控制方案
通过以下配置降低树莓派5功耗:
# 降低CPU频率
echo "powersave" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# 关闭HDMI输出
/opt/vc/bin/tvservice -o
# 设置USB自动挂起
echo '1' | sudo tee /sys/module/usbcore/parameters/autosuspend
5.2 添加更多传感器
常见气象传感器扩展方案:
- BME280 :温湿度气压三合一传感器(I2C接口)
- 雨量传感器 :翻斗式降雨量检测
- 风速传感器 :霍尔效应风速计
BME280连接示例:
import smbus2
import bme280
port = 1
address = 0x76
bus = smbus2.SMBus(port)
calibration_params = bme280.load_calibration_params(bus, address)
data = bme280.sample(bus, address, calibration_params)
print(f"温度: {data.temperature:.1f}℃ 湿度: {data.humidity:.1f}%")
实际部署时发现,将传感器放置在通风良好但避免阳光直射的位置,读数准确性可提升约30%。使用3D打印的防辐射罩效果比商用金属罩差15%左右,但成本只有1/10。
更多推荐


所有评论(0)