1. 项目概述
Orange Pi One作为一款性价比极高的开源硬件开发板,在物联网和嵌入式开发领域广受欢迎。最近我在一个工业环境监测项目中,需要实时监控多台设备的运行温度。经过对比多种方案,最终选择用Orange Pi One搭建了一套低成本、高可靠性的温度监控系统。
这个方案最大的优势在于硬件成本不到200元,却能实现专业级温控设备80%的功能。整套系统包含温度传感器数据采集、本地存储、异常报警和远程监控四个核心模块,完全基于开源技术栈实现。下面我就详细拆解这套系统的设计思路和具体实现方法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件选型与连接
2.1 核心硬件组件
选择Orange Pi One主要看中它的几个特性:
- 全志H3四核处理器,性能足够处理传感器数据
- 1GB内存可以流畅运行轻量级Linux系统
- 40pin GPIO接口方便连接各类传感器
- 支持USB和网络连接,便于数据传输
- 功耗仅3W左右,适合7x24小时运行
温度传感器方面,我测试了三种常见方案:
- DS18B20数字温度传感器(最终选择)
- 精度±0.5℃满足工业需求
- 单总线协议节省GPIO资源
- 防水型号可直接接触被测物体
- DHT22温湿度传感器
- 集成温湿度检测
- 但采样速率较慢(2秒/次)
- LM35模拟温度传感器
- 需要ADC转换
- 电路相对复杂
2.2 硬件连接示意图
DS18B20与Orange Pi One的连接非常简单:
- 传感器VDD接开发板3.3V
- GND接开发板地线
- 数据线接GPIO4(物理引脚7)
- 数据线需要接4.7KΩ上拉电阻
注意:不同型号Orange Pi的GPIO编号可能不同,务必查阅对应版本的引脚图
3. 系统环境配置
3.1 基础系统安装
推荐使用Armbian系统,这是专为ARM开发板优化的Linux发行版:
bash复制# 下载最新Armbian镜像
wget https://dl.armbian.com/orangepione/archive/Armbian_23.08.0-trunk_Orangepione_jammy_current_6.1.38.img.xz
# 烧录到SD卡
xzcat Armbian_23.08.0-trunk_Orangepione_jammy_current_6.1.38.img.xz | dd of=/dev/sdX bs=4M status=progress
首次启动后需要:
- 通过
armbian-config工具扩展文件系统 - 设置静态IP(生产环境推荐)
- 安装必要依赖:
bash复制sudo apt update sudo apt install -y python3-pip git build-essential pip install RPi.GPIO requests
3.2 1-Wire总线配置
DS18B20使用1-Wire协议通信,需要加载内核模块:
bash复制# 编辑/boot/armbianEnv.txt
sudo nano /boot/armbianEnv.txt
# 添加以下内容
overlays=w1-gpio
param_w1_pin=PA6 # Orange Pi One的GPIO4对应PA6
param_w1_pin_int_pullup=1
# 重启后检查设备
ls /sys/bus/w1/devices/
# 应看到类似28-01131a1e1eff的设备目录
4. 核心代码实现
4.1 温度采集脚本
创建temperature_monitor.py:
python复制import os
import time
from datetime import datetime
DEVICE_FOLDER = "/sys/bus/w1/devices/"
DEVICE_PREFIX = "28-"
def read_temp_raw(device_file):
with open(device_file, 'r') as f:
lines = f.readlines()
return lines
def parse_temp(lines):
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
temp = float(lines[1][equals_pos+2:])/1000.0
return temp
def get_devices():
return [d for d in os.listdir(DEVICE_FOLDER) if d.startswith(DEVICE_PREFIX)]
def main():
devices = get_devices()
if not devices:
print("未检测到温度传感器")
return
while True:
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
for device in devices:
device_file = f"{DEVICE_FOLDER}{device}/w1_slave"
temp = p
