基于 Python 的智能家居控制系统
基于 Python 的智能家居控制系统
1. 项目背景
智能家居控制系统是现代物联网技术的典型应用之一。通过传感器采集环境数据,结合 Python 的数据处理和 Web 开发能力,用户可以实时监控家居环境并远程控制设备。本项目将模拟一个智能家居系统,包括环境数据采集、数据存储、Web 界面和设备控制功能。
2. 功能需求
- 环境数据采集:模拟传感器采集温度、湿度和光照数据。
- 数据存储:将采集的数据存储到数据库中。
- Web 界面:提供实时数据展示和设备控制界面。
- 设备控制:允许用户通过 Web 界面控制灯光和空调。
3. 技术选型
- 编程语言:Python
- Web 框架:Flask(轻量级 Web 框架)
- 数据库:SQLite(轻量级数据库)
- 前端技术:HTML、CSS、JavaScript(用于 Web 界面)
- 数据可视化:Chart.js(用于绘制实时数据图表)
4. 系统设计
4.1 数据库设计
- 环境数据表(EnvironmentData):
id
:数据编号(主键)timestamp
:时间戳temperature
:温度humidity
:湿度light
:光照强度
- 设备状态表(DeviceStatus):
id
:设备编号(主键)name
:设备名称(如“灯光”、“空调”)status
:设备状态(如“开”或“关”)
4.2 功能模块
- 数据采集模块:模拟传感器数据并存储到数据库。
- Web 服务模块:提供 Web 界面和数据接口。
- 设备控制模块:通过 Web 界面控制设备状态。
5. 核心代码实现
5.1 数据库初始化
import sqlite3
# 连接数据库
conn = sqlite3.connect('smart_home.db')
cursor = conn.cursor()
# 创建环境数据表
cursor.execute('''
CREATE TABLE IF NOT EXISTS EnvironmentData (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
temperature REAL,
humidity REAL,
light REAL
)
''')
# 创建设备状态表
cursor.execute('''
CREATE TABLE IF NOT EXISTS DeviceStatus (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
status TEXT NOT NULL
)
''')
# 初始化设备状态
cursor.execute('INSERT OR IGNORE INTO DeviceStatus (name, status) VALUES ("灯光", "关")')
cursor.execute('INSERT OR IGNORE INTO DeviceStatus (name, status) VALUES ("空调", "关")')
conn.commit()
5.2 数据采集模块
import random
from datetime import datetime
def simulate_sensor_data():
# 模拟传感器数据
temperature = round(random.uniform(20, 30), 2) # 温度在 20℃ 到 30℃ 之间
humidity = round(random.uniform(40, 80), 2) # 湿度在 40% 到 80% 之间
light = round(random.uniform(0, 100), 2) # 光照强度在 0 到 100 之间
return temperature, humidity, light
def save_sensor_data():
temperature, humidity, light = simulate_sensor_data()
cursor.execute('''
INSERT INTO EnvironmentData (temperature, humidity, light)
VALUES (?, ?, ?)
''', (temperature, humidity, light))
conn.commit()
5.3 Web 服务模块
from flask import Flask, render_template, jsonify, request
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/api/data')
def get_data():
# 获取最新的环境数据
cursor.execute('SELECT * FROM EnvironmentData ORDER BY timestamp DESC LIMIT 10')
data = cursor.fetchall()
return jsonify(data)
@app.route('/api/devices', methods=['GET', 'POST'])
def control_devices():
if request.method == 'GET':
# 获取设备状态
cursor.execute('SELECT * FROM DeviceStatus')
devices = cursor.fetchall()
return jsonify(devices)
elif request.method == 'POST':
# 更新设备状态
device_id = request.json.get('id')
new_status = request.json.get('status')
cursor.execute('UPDATE DeviceStatus SET status = ? WHERE id = ?', (new_status, device_id))
conn.commit()
return jsonify({"message": "设备状态更新成功"})
5.4 前端界面(HTML + JavaScript)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>智能家居控制系统</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<h1>智能家居控制系统</h1>
<div>
<h2>环境数据</h2>
<canvas id="environmentChart" width="400" height="200"></canvas>
</div>
<div>
<h2>设备控制</h2>
<button onclick="toggleDevice(1)">切换灯光</button>
<button onclick="toggleDevice(2)">切换空调</button>
</div>
<script>
const ctx = document.getElementById('environmentChart').getContext('2d');
const chart = new Chart(ctx, {
type: 'line',
data: {
labels: [],
datasets: [
{ label: '温度 (℃)', data: [], borderColor: 'red' },
{ label: '湿度 (%)', data: [], borderColor: 'blue' },
{ label: '光照强度', data: [], borderColor: 'green' }
]
},
options: { responsive: true }
});
// 获取环境数据
function fetchData() {
fetch('/api/data')
.then(response => response.json())
.then(data => {
chart.data.labels = data.map(d => d[1]); // 时间戳
chart.data.datasets[0].data = data.map(d => d[2]); // 温度
chart.data.datasets[1].data = data.map(d => d[3]); // 湿度
chart.data.datasets[2].data = data.map(d => d[4]); // 光照
chart.update();
});
}
// 切换设备状态
function toggleDevice(deviceId) {
fetch('/api/devices', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: deviceId, status: '开' }) // 简化逻辑
}).then(() => location.reload());
}
// 每 5 秒更新一次数据
setInterval(fetchData, 5000);
fetchData();
</script>
</body>
</html>
6. 运行效果
- 环境数据监控:
- 实时显示温度、湿度和光照强度的折线图。
- 数据每 5 秒更新一次。
- 设备控制:
- 用户可以通过按钮控制灯光和空调的开关状态。
- Web 界面:
- 提供直观的数据展示和设备控制界面。
7. 总结
通过本项目的开发,我们实现了一个基于 Python 的智能家居控制系统,涵盖了数据采集、数据存储、Web 服务和设备控制等功能。Python 的灵活性和丰富的库使得该项目易于实现和扩展。未来可以进一步优化系统,例如:
- 接入真实的传感器硬件。
- 添加用户认证和权限管理。
- 支持移动端应用(如通过 React Native 开发)。
希望这篇文章能为你的毕业设计提供帮助!如果需要更多功能或优化建议,可以随时告诉我!😊