自己动手打造属于自己的智能家居二在上一篇文章中我们了解了智能家居的基本概念并搭建了第一个简单的智能开关。今天我们将继续深入教你如何用树莓派和传感器打造一个能自动感知环境并作出响应的智能家居系统。我们将重点实现智能温度监控与自动风扇控制。通过这个项目你会学到如何将物理世界的数据温度、湿度转化为数字信号并通过编程逻辑控制外部设备。—## 项目目标温控风扇想象一下夏天家里热得像蒸笼你希望风扇能自动开启冬天冷了风扇自动关闭。这就是我们要实现的功能。硬件清单- 树莓派任何型号推荐3B或4B- DHT11或DHT22温湿度传感器- 5V继电器模块- 小风扇USB风扇或直流风扇- 杜邦线若干- 面包板可选软件环境- Raspberry Pi OS (已安装Python 3)- Adafruit_DHT 库用于读取传感器数据- RPi.GPIO 库控制GPIO引脚—## 第一步硬件连接首先我们来搭建电路。请确保树莓派已断电然后按以下方式连接-DHT11传感器 - VCC电源 → 树莓派5V物理引脚2或4 - GND地 → 树莓派GND物理引脚6 - DATA数据 → 树莓派GPIO 4物理引脚7-继电器模块 - VCC → 树莓派5V - GND → 树莓派GND - IN信号 → 树莓派GPIO 17物理引脚11 - COM公共端 → 风扇电源正极 - NO常开端 → 风扇电源负极或通过外部电源注意如果风扇功率较大如超过500mA请使用外部电源驱动继电器不要直接从树莓派取电。—## 第二步读取传感器数据在开始编码前先安装必要的库。打开树莓派终端执行bashsudo pip3 install Adafruit_DHT现在我们来编写一个读取温湿度的脚本。python# 文件: read_sensor.pyimport Adafruit_DHTimport time# 定义传感器类型和GPIO引脚SENSOR_TYPE Adafruit_DHT.DHT11 # 如果你用DHT22就改成DHT22GPIO_PIN 4def read_temp_humidity(): 读取温湿度数据返回温度摄氏度和湿度百分比 如果读取失败返回 (None, None) humidity, temperature Adafruit_DHT.read_retry(SENSOR_TYPE, GPIO_PIN) return temperature, humidity# 主循环每隔5秒读取一次并输出if __name__ __main__: print(开始读取温湿度数据...) while True: temp, hum read_temp_humidity() if temp is not None and hum is not None: print(f温度: {temp:.1f}°C, 湿度: {hum:.1f}%) else: print(读取失败请检查传感器连接) time.sleep(5)运行这个脚本bashpython3 read_sensor.py你会看到类似输出开始读取温湿度数据...温度: 25.3°C, 湿度: 60.2%温度: 25.4°C, 湿度: 60.1%小贴士如果一直显示读取失败检查传感器接线或换一个GPIO引脚试试。—## 第三步控制风扇开关现在我们要让树莓派通过继电器控制风扇。继电器的工作原理是给IN引脚一个高电平3.3V继电器吸合风扇通电给低电平继电器断开风扇断电。下面是一个简单的控制脚本python# 文件: control_fan.pyimport RPi.GPIO as GPIOimport time# 设置GPIO模式为BCM编号GPIO.setmode(GPIO.BCM)FAN_PIN 17 # 继电器的IN引脚连接到GPIO 17# 设置引脚为输出模式初始状态为低电平风扇关闭GPIO.setup(FAN_PIN, GPIO.OUT)GPIO.output(FAN_PIN, GPIO.LOW)def fan_on(): 开启风扇 GPIO.output(FAN_PIN, GPIO.HIGH) print(风扇已开启)def fan_off(): 关闭风扇 GPIO.output(FAN_PIN, GPIO.LOW) print(风扇已关闭)# 测试先开3秒再关3秒if __name__ __main__: try: print(测试风扇控制...) fan_on() time.sleep(3) fan_off() time.sleep(3) print(测试完成) except KeyboardInterrupt: print(用户中断) finally: GPIO.cleanup() # 清理GPIO防止残留状态运行后你会听到继电器“咔嗒”一声风扇开始转动3秒后停止。如果风扇没反应检查继电器是否供电或者IN引脚接对了吗—## 第四步整合——智能温控系统现在我们把传感器读取和风扇控制结合起来实现自动化当温度超过30°C时开启风扇低于25°C时关闭。python# 文件: smart_thermostat.pyimport Adafruit_DHTimport RPi.GPIO as GPIOimport time# ---------- 硬件配置 ----------SENSOR_TYPE Adafruit_DHT.DHT11SENSOR_PIN 4FAN_PIN 17# ---------- 温度阈值 ----------TEMP_HIGH 30.0 # 开启风扇的温度上限TEMP_LOW 25.0 # 关闭风扇的温度下限# ---------- 初始化 ----------GPIO.setmode(GPIO.BCM)GPIO.setup(FAN_PIN, GPIO.OUT)GPIO.output(FAN_PIN, GPIO.LOW) # 初始关闭def read_sensor(): 读取温湿度返回 (温度, 湿度) humidity, temperature Adafruit_DHT.read_retry(SENSOR_TYPE, SENSOR_PIN) return temperature, humiditydef control_fan(temperature): 根据温度控制风扇开关 采用滞回控制hysteresis避免频繁开关 if temperature is None: return # 读取失败不做操作 # 获取当前风扇状态 current_state GPIO.input(FAN_PIN) if temperature TEMP_HIGH and current_state GPIO.LOW: # 温度过高且风扇关闭 - 开启 GPIO.output(FAN_PIN, GPIO.HIGH) print(f温度 {temperature:.1f}°C 超过上限开启风扇) elif temperature TEMP_LOW and current_state GPIO.HIGH: # 温度过低且风扇开启 - 关闭 GPIO.output(FAN_PIN, GPIO.LOW) print(f温度 {temperature:.1f}°C 低于下限关闭风扇) else: # 温度在中间范围保持当前状态 pass# ---------- 主循环 ----------if __name__ __main__: print(智能温控系统启动...) try: while True: temp, hum read_sensor() if temp is not None and hum is not None: print(f当前温度: {temp:.1f}°C, 湿度: {hum:.1f}%) control_fan(temp) else: print(传感器读取失败) time.sleep(10) # 每10秒检查一次 except KeyboardInterrupt: print(系统关闭) finally: GPIO.cleanup()运行效果- 当温度上升到30°C以上时风扇自动启动你会听到继电器吸合声。- 当温度下降到25°C以下时风扇自动关闭。- 中间区域25-30°C风扇保持原状态避免频繁开关。—## 进阶扩展加入数据记录和远程控制这个系统已经能工作了但我们可以让它更智能1.数据记录将温湿度数据写入CSV文件方便分析。python import csv with open(data.csv, a, newline) as f: writer csv.writer(f) writer.writerow([time.time(), temp, hum])2.远程通知使用IFTTT或Telegram Bot在温度异常时发送消息到手机。3.Web界面用Flask搭建一个简单的Web服务器实时显示数据并手动控制风扇。—## 总结通过这个项目我们亲手打造了一个基于树莓派的智能温控风扇系统。你学会了- 读取DHT11温湿度传感器的数据- 用GPIO控制继电器和风扇- 实现滞回控制算法避免设备频繁开关- 将传感器和执行器整合成一个完整的闭环控制系统智能家居的核心思想就是“感知-决策-执行”。今天你实现了温度感知和风扇执行明天你可以加入光照传感器控制窗帘或者烟雾传感器报警——一切皆有可能。动手试试吧让你的家真正“聪明”起来下一期预告我们将用语音控制灯光和风扇让智能家居更懂你。敬请期待