智能家居:构建智能电动窗帘 + 环境监测

本项目基于Arduino Uno与Python构建智能家居电动窗帘系统,通过光敏传感器实时采集环境光照强度,Arduino控制舵机模拟窗帘开合,Python上位机实现远程交互,兼具实用性与可扩展性,为智能居家环境提供基础解决方案。
准备工作:
材料:
材料名称
数量
备注
Arduino Uno
1
sg舵机
1
红外传感器
1
杜邦线
若干
1
准备步骤






1234
首先,安装Arduino IDE。安装完成后,打开软件,依次点击菜单栏中的 **Tools → Board → Arduino Uno**,选择对应的开发板型号。接着,按下 **Win + X** 键,打开设备管理器,查看Arduino Uno所连接的串口(如 COM3、COM4 等)。最后,返回Arduino IDE,在 **Tools → Port** 中选择对应的端口号(例如 COMX),确保开发板与电脑正确通信。
2
接线图

准备好红外传感器、Arduino Uno 和 SG90 舵机,并按照图示进行接线:
- 舵机的信号线(橙色)连接到 Uno 的 D9 引脚;
- 舵机的 VCC(红色)连接到 Uno 的 3.3V 引脚;
- 舵机的 GND(棕色)连接到 Uno 的 GND 引脚。
接下来连接红外传感器:
- 红外传感器的 DO 引脚连接到 Uno 的 A0 引脚;
- 红外传感器的 VCC 连接到 Uno 的 3.3V 引脚;
- 红外传感器的 GND 连接到 Uno 的 GND 引脚。
所有接线完成后,即可开始编写控制代码。
sg舵机
线缆颜色 | 功能 | 连接Arduino Uno |
棕色 | GND(地) | GND |
红色 | VCC(电源) | 3.3V(小舵机) |
橙色 | 信号(Signal) | 任意数字引脚(如 D9) |
红外传感器
端口 | 功能 | 连接Arduino Uno |
GND | GND(地) | GND |
VCC | VCC(电源) | 3.3v |
DO | Digital Output / 数字输出 | A0 |
3
编写Arduino代码





123
// 功能:测试光敏模块 AO 输出,串口打印光照值
#include <Servo.h>
Servo myServo;
const int lightPin = A0; // 光敏接 A0
// 初始化(只执行一次)
void setup() {
Serial.begin(9600);
myServo.attach(9); // 舵机信号线接 D9
myServo.write(90); // 启动时居中
Serial.println("✅ 光控窗帘系统启动成功!");
Serial.println("等待Python发送 OPEN / CLOSE 指令...");
}
// 代码执行逻辑(一直运行直到程序停止)
void loop() {
// 读取光照值并发送给Python(每500ms)
int lightValue = analogRead(lightPin);
Serial.println(lightValue);
delay(500);
// 同时监听Python发来的控制指令
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
if (cmd == "OPEN") {
myServo.write(180);
Serial.println(">>> 🌞 窗帘已打开 (180度)");
} else if (cmd == "CLOSE") {
myServo.write(0);
Serial.println(">>> 🌑 窗帘已关闭 (0度)");
}
// 收到指令后清空缓冲区
while (Serial.available()) Serial.read();
}
}
4
python代码

import serial
import time
import sys
# ========== 配置区 ==========
# 实际连接端口
SERIAL_PORT = 'COM6'
BAUD_RATE = 9600
# 📊 根据你的实测数据设置阈值(你测到最亮=8,最暗≈980)
LIGHT_THRESHOLD_LOW = 50 # 低于此值 = 天亮 → 开窗帘
LIGHT_THRESHOLD_HIGH = 600 # 高于此值 = 天黑 → 关窗帘
# ========== 初始化 ==========
try:
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
print(f"✅ 已连接到 {SERIAL_PORT}")
time.sleep(2) # 等待Arduino重启完成
except Exception as e:
print(f"❌ 串口打开失败: {e}")
sys.exit(1)
last_action = None # 记录上一次动作,避免重复发送
print("🌞 全自动光控窗帘系统运行中...")
print(f"开窗帘阈值: < {LIGHT_THRESHOLD_LOW}")
print(f"关窗帘阈值: > {LIGHT_THRESHOLD_HIGH}")
print("-------------------------------")
# ========== 主循环 ==========
try:
while True:
line = ser.readline().decode('utf-8').strip()
if line.isdigit():
light_value = int(line)
# 📈 打印当前光照值
status = "🌤️ 适中"
if light_value < LIGHT_THRESHOLD_LOW:
status = "☀️ 很亮"
elif light_value > LIGHT_THRESHOLD_HIGH:
status = "🌑 很暗"
print(f"光照值: {light_value:4d} | 状态: {status}")
# 🧠 智能判断 + 发送指令
if light_value < LIGHT_THRESHOLD_LOW and last_action != "OPEN":
ser.write(b'OPEN\n')
print(" → 🚪 发送指令: OPEN (开窗帘)")
last_action = "OPEN"
elif light_value > LIGHT_THRESHOLD_HIGH and last_action != "CLOSE":
ser.write(b'CLOSE\n')
print(" → 🚪 发送指令: CLOSE (关窗帘)")
last_action = "CLOSE"
time.sleep(0.1)
except KeyboardInterrupt:
print("\n🛑 用户终止程序")
except Exception as e:
print(f"❌ 运行时错误: {e}")
finally:
if 'ser' in locals() and ser.is_open:
ser.close()
print("✅ 串口已关闭")
5
运行效果








更多相关项目
猜你喜欢
评论/提问(已发布 0 条)

