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


·居
原创
发布时间: 2025-09-28 17:39:01 | 阅读数 0收藏数 0评论数 0
封面
本项目基于Arduino Uno与Python构建智能家居电动窗帘系统,通过光敏传感器实时采集环境光照强度,Arduino控制舵机模拟窗帘开合,Python上位机实现远程交互,兼具实用性与可扩展性,为智能居家环境提供基础解决方案。

准备工作:

材料:

材料名称
数量
备注
Arduino Uno
1
sg舵机
1
红外传感器
1
杜邦线
若干
1

准备步骤

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

2

接线图

准备好红外传感器、Arduino Uno 和 SG90 舵机,并按照图示进行接线:

  1. 舵机的信号线(橙色)连接到 Uno 的 D9 引脚;
  2. 舵机的 VCC(红色)连接到 Uno 的 3.3V 引脚;
  3. 舵机的 GND(棕色)连接到 Uno 的 GND 引脚。

接下来连接红外传感器:

  1. 红外传感器的 DO 引脚连接到 Uno 的 A0 引脚;
  2. 红外传感器的 VCC 连接到 Uno 的 3.3V 引脚;
  3. 红外传感器的 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代码

// 功能:测试光敏模块 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
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载