太棒了!用树莓派和 Python 打造智能家居是一个非常经典且有趣的项目,它能让你从零开始了解物联网的核心理念,这个指南将带你从零开始,一步步构建一个功能完整的智能家居系统。

(图片来源网络,侵删)
核心思想
树莓派在智能家居中扮演着“大脑”的角色,它负责:
- 连接:通过各种传感器(输入)和执行器(输出)感知物理世界并控制设备。
- 处理:运行你的 Python 程序,根据逻辑(如“如果天黑了,就开灯”)做出决策。
- 通信:通过 Wi-Fi 连接到局域网和互联网,让你能远程控制。
Python 则是这个大脑的“思维”,它简洁、强大的库生态让硬件控制和网络编程变得异常简单。
第一部分:硬件准备
在开始编码之前,你需要准备一些基本的硬件。
核心组件
- 树莓派:任何型号都可以,推荐树莓派 4B 或 5B,性能更强。
- MicroSD 卡:至少 16GB,Class 10 或更高,用于安装操作系统。
- 电源适配器:为树莓派供电(树莓派 4B/5B 建议使用 5V/3A)。
- 散热器/风扇:保证树莓派长时间稳定运行。
传感器 (输入设备 - 感知世界)
- 温湿度传感器 (DHT11/DHT22):最常用的环境传感器,用于监测室内温湿度。
- 人体红外传感器 (PIR HC-SR501):检测是否有人移动,实现“人来灯亮,人走灯灭”。
- 光照传感器 (LDR/光敏电阻):检测环境亮度。
- 门窗传感器:检测门窗是否被打开。
执行器 (输出设备 - 控制世界)
- 继电器模块:非常重要! 树莓派的 GPIO 引脚只能输出微弱的电压,无法直接控制 220V 家用电器,继电器模块充当一个“开关”,用低压信号(树莓派)控制高压电路(电器)。
- LED 灯:用于简单的开关演示。
- 舵机:用于控制角度,比如模拟智能窗帘的开合。
连接工具
- 面包板:无需焊接,方便原型搭建。
- 杜邦线:连接树莓派和面包板上的元器件。
第二部分:软件与环境搭建
安装 Raspberry Pi OS
- 下载 Raspberry Pi Imager 官方工具。
- 将 MicroSD 卡插入电脑。
- 打开 Imager,选择:
- CHOOSE OS -> Raspberry Pi OS (other) -> Raspberry Pi OS Lite (64-bit) (推荐 Lite 版本,没有桌面,更轻量,适合服务器运行)。
- CHOOSE STORAGE -> 选择你的 SD 卡。
- 点击齿轮图标 Advanced Options,设置:
- Enable SSH:方便后续远程连接。
- Set username and password:设置你的用户名和密码。
- Configure wireless LAN:提前连接 Wi-Fi。
- 点击 WRITE,等待写入完成。
连接与更新
- 将 SD 卡插入树莓派,通电启动。
- 在同一局域网的电脑上,使用 SSH 连接树莓派:
ssh your_username@树莓派的IP地址
- 登录后,首先更新系统:
sudo apt update sudo apt upgrade -y
安装 Python 和必要库
树莓派 Lite 系统通常预装了 Python,我们需要安装一些用于硬件控制的库。

(图片来源网络,侵删)
# 安装 RPi.GPIO 库,这是最基础的树莓派 GPIO 控制库 sudo apt install python3-rpi.gpio # 安装 adafruit-circuitpython-dht 库,用于 DHT 传感器 sudo pip3 install adafruit-circuitpython-dht # 安装 Flask 库,用于创建 Web 控制界面 sudo pip3 install Flask # 安装 requests 库,用于调用网络 API (如天气) sudo pip3 install requests
第三部分:从零开始,点亮第一个 LED
这是“Hello, World!”级别的智能家居项目,让你熟悉 GPIO 控制。
硬件连接
- LED 的长脚(正极) -> 连接一个 220Ω 电阻 -> 树莓派的 GPIO 17 (物理引脚 11)。
- LED 的短脚(负极) -> 连接树莓派的 GND (物理引脚 6 或 9)。
Python 代码
在树莓派上创建一个新文件 blink.py:
import RPi.GPIO as GPIO
import time
# 设置 GPIO 模式为 BCM(基于引脚的编号)
GPIO.setmode(GPIO.BCM)
# 设置 GPIO 17 为输出模式
GPIO.setup(17, GPIO.OUT)
try:
while True:
# 点亮 LED
GPIO.output(17, GPIO.HIGH)
print("LED is ON")
time.sleep(1) # 持续1秒
# 熄灭 LED
GPIO.output(17, GPIO.HIGH) # 修正:这里应该是 GPIO.LOW
print("LED is OFF")
time.sleep(1) # 持续1秒
except KeyboardInterrupt:
# 当按下 Ctrl+C 时,清理 GPIO 资源
print("Program stopped")
GPIO.cleanup()
运行代码
在终端中执行:
python3 blink.py
你会看到连接的 LED 每秒闪烁一次,按下 Ctrl+C 停止程序。
第四部分:构建一个完整的智能家居系统
让我们将多个组件组合起来,创建一个具备以下功能的系统:
- 自动模式:
- 当 PIR 传感器检测到有人且环境光暗时,自动打开灯。
- 当 PIR 传感器检测到人离开后一段时间,自动关闭灯。
- 手动模式:
通过一个 Web 界面,可以手动开关灯。
硬件连接
- LED + 电阻 -> GPIO 17 (同上)
- 继电器模块的 IN 端 -> GPIO 27 (用于控制另一个设备,如电灯)
- PIR 传感器的 OUT 端 -> GPIO 22
- DHT22 的数据端 -> GPIO 4
- 继电器模块的 VCC/GND -> 树莓派的 5V/GND
- PIR/DHT22 的 VCC/GND -> 树莓派的 3.3V/GND
Python 代码 (smart_home.py)
这个代码会同时运行一个 Flask Web 服务器和一个后台监控任务。
import RPi.GPIO as GPIO
import time
import threading
from flask import Flask, render_template, request
import adafruit_dht
import board
# --- GPIO 设置 ---
GPIO.setmode(GPIO.BCM)
LED_PIN = 17
RELAY_PIN = 27 # 假设继电器控制客厅主灯
PIR_PIN = 22 # 人体红外传感器
GPIO.setup(LED_PIN, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(RELAY_PIN, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(PIR_PIN, GPIO.IN)
# --- 传感器初始化 ---
# 注意:如果使用 DHT11,将 adafruit_dht.DHT22 改为 adafruit_dht.DHT11
try:
dht_device = adafruit_dht.DHT22(board.D4)
except Exception as e:
print(f"无法初始化 DHT 传感器: {e}")
dht_device = None
# --- 全局状态 ---
auto_mode = True
last_pir_state = False
light_on_time = 0
# --- Flask Web 应用 ---
app = Flask(__name__)
@app.route('/')
def index():
# 读取温湿度
temp = "N/A"
humidity = "N/A"
if dht_device:
try:
temp = f"{dht_device.temperature:.1f}°C"
humidity = f"{dht_device.humidity:.1f}%"
except Exception:
pass
# 读取灯的状态
light_status = "ON" if GPIO.input(RELAY_PIN) == GPIO.HIGH else "OFF"
return render_template('index.html', temp=temp, humidity=humidity, light_status=light_status, auto_mode=auto_mode)
@app.route('/toggle_light')
def toggle_light():
GPIO.output(RELAY_PIN, not GPIO.input(RELAY_PIN))
return "Toggled"
@app.route('/set_mode/<mode>')
def set_mode(mode):
global auto_mode
auto_mode = (mode == 'auto')
return f"Mode set to {mode}"
# --- 后台监控线程 ---
def monitor_sensors():
global last_pir_state, light_on_time
while True:
if not auto_mode:
time.sleep(1)
continue
current_pir_state = GPIO.input(PIR_PIN)
# 检测到人从无到有
if current_pir_state and not last_pir_state:
print("Person detected!")
# 模拟读取光照传感器,这里用一个固定值代替
# 假设光照传感器返回 0 (暗), 1 (亮)
is_dark = True # <-- 在实际项目中,这里应该连接真实的光照传感器
if is_dark:
GPIO.output(RELAY_PIN, GPIO.HIGH)
light_on_time = time.time()
print("Light turned ON")
# 检测到人从有到无,并且灯已经亮了超过10秒
elif not current_pir_state and last_pir_state:
print("No person detected.")
if GPIO.input(RELAY_PIN) == GPIO.HIGH and (time.time() - light_on_time > 10):
GPIO.output(RELAY_PIN, GPIO.LOW)
print("Light turned OFF (timeout)")
last_pir_state = current_pir_state
time.sleep(0.5) # 每0.5秒检查一次
# --- 创建 Web 模板 ---
# 创建一个 templates 文件夹,在里面创建 index.html
with open('templates/index.html', 'w') as f:
f.write('''
<!DOCTYPE html>
<html>
<head>智能家居控制面板</title>
<style>body { font-family: Arial, sans-serif; text-align: center; margin-top: 50px; }</style>
</head>
<body>
<h1>智能家居控制中心</h1>
<h2>环境数据</h2>
<p>温度: {{ temp }}</p>
<p>湿度: {{ humidity }}</p>
<h2>灯光控制</h2>
<p>当前状态: <strong>{{ light_status }}</strong></p>
<a href="/toggle_light"><button>切换灯光</button></a>
<h2>系统模式</h2>
<p>当前模式: <strong>{{ "自动" if auto_mode else "手动" }}</strong></p>
<a href="/set_mode/auto"><button>切换到自动模式</button></a>
<a href="/set_mode/manual"><button>切换到手动模式</button></a>
</body>
</html>
''')
if __name__ == '__main__':
# 启动后台监控线程
monitor_thread = threading.Thread(target=monitor_sensors, daemon=True)
monitor_thread.start()
# 启动 Flask Web 服务器
# host='0.0.0.0' 允许局域网内其他设备访问
app.run(host='0.0.0.0', port=5000, debug=True)
运行系统
- 将上面的代码保存为
smart_home.py。 - 确保创建了
templates文件夹和index.html文件。 - 在终端运行:
python3 smart_home.py
- 你的树莓派上运行了一个 Web 服务器,在同一个局域网的电脑或手机上,打开浏览器,访问
http://树莓派的IP地址:5000。 - 你就可以看到控制面板,并可以手动开关灯,切换自动/手动模式,当你在 PIR 传感器前挥手时,如果系统处于自动模式,灯也会自动响应。
第五部分:进阶方向
当你掌握了基础后,可以探索更多有趣的功能:
- 语音控制:集成百度、科大讯飞或 Google Assistant 的 API,实现“小智,打开客厅灯”。
- 手机 App:使用 MIT App Inventor (图形化) 或 Kivy/Flutter (Python) 开发一个专属的手机 App。
- 数据可视化:将温湿度数据存入数据库(如 InfluxDB),用 Grafana 制作精美的监控面板。
- 与云平台联动:将数据上传到阿里云、腾讯云或 AWS,实现远程访问、数据分析和自动化规则。
- 添加更多设备:控制智能插座、风扇、加湿器,甚至实现自动浇花系统。
这个项目为你打开了一扇通往物联网世界的大门,祝你玩得开心!
