随着智能家居的普及,香薰机作为提升生活品质的重要设备,正从传统的手动控制向智能化方向发展。本文将介绍一款基于Python的香薰机智能控制软件的设计与实现,该软件支持远程控制、定时开关、香薰浓度调节等功能,并可通过MQTT协议实现物联网集成。
系统架构设计
硬件需求
树莓派/ESP32等微控制器
香薰机控制模块(继电器/PWM控制)
温湿度传感器(可选)
触摸显示屏(可选)
Wi-Fi模块
软件架构
香薰控制软件
├── 用户界面层 (GUI/Web/Mobile)
├── 业务逻辑层
│ ├── 设备控制模块
│ ├── 定时任务模块
│ ├── 传感器数据处理
│ └── 用户偏好管理
└── 硬件接口层
├── MQTT通信
├── GPIO控制
└── 串口通信
核心代码实现
1 设备控制基础类
python
import RPi GPIO as GPIO
import ti me
from enum import Enum
class ScentLevel(Enum):
LOW = 1
MEDIUM = 2
HIGH = 3
class AromaDiffuser:
def __init__(self, relay_pin, fan_pin):
self relay_pin = relay_pin # 雾化片控制
self fan_pin = fan_pin # 风扇控制
GPIO setmode(GPIO BCM)
GPIO setup(relay_pin, GPIO OUT)
GPIO setup(fan_pin, GPIO OUT)
self current_level = ScentLevel LOW
def set_level(self, level):
"""设置香薰浓度级别"""
if not isinstance(level, ScentLevel):
raise ValueError("Invalid scent level")
self current_level = level
# 根据级别调整PWM占空比或继电器开关组合
if level == ScentLevel LOW:
GPIO output(self relay_pin, GPIO HIGH) # 低功率雾化
GPIO output(self fan_pin, GPIO LOW) # 风扇低速
elif level == ScentLevel MEDIUM:
GPIO output(self relay_pin, GPIO LOW) # 正常雾化
GPIO output(self fan_pin, GPIO HIGH) # 风扇中速
else: # HIGH
GPIO output(self relay_pin, GPIO LOW) # 正常雾化
GPIO output(self fan_pin, GPIO HIGH) # 风扇高速
# 实际应用中可添加更多控制逻辑
代码参考:https://wa0p.github.io/ua.html
def turn_on(self):
"""开启香薰机"""
self set_level(self current_level)
def turn_off(self):
"""关闭香薰机"""
GPIO output(self relay_pin, GPIO HIGH)
GPIO output(self fan_pin, GPIO LOW)
def cleanup(self):
"""清理GPIO资源"""
GPIO cleanup([self relay_pin, self fan_pin])
2 MQTT物联网集成
python
import paho mqtt client as mqtt
import json
class AromaMQTTController:
def __init__(self, diffuser, broker="localhost", port=1883):
self diffuser = diffuser
self client = mqtt Client("aroma_diffuser")
self client on_connect = self on_connect
self client on_message = self on_message
self broker = broker
self port = port
代码参考:https://wa0p.github.io/ub.html
def on_connect(self, client, userdata, flags, rc):
print("Connected with result code "+str(rc))
# 订阅控制主题
client subscribe("home/aroma/control")
client subscribe("home/aroma/set_level")
def on_message(self, client, userdata, msg):
payload = json loads(msg payload decode())
print(f"Received message on {msg topic}: {payload}")
if msg topic == "home/aroma/control":
if payload get("action") == "on":
self diffuser turn_on()
elif payload get("action") == "off":
self diffuser turn_off()
elif msg topic == "home/aroma/set_level":
level = payload get("level")
try:
self diffuser set_level(ScentLevel[level upper()])
except (KeyError, ValueError):
print("Invalid scent level specified")
def start(self):
self client connect(self broker, self port, 60)
self client loop_forever()
代码参考:https://wa0p.github.io/uc.html
3 Web控制界面(Flask示例)
python
from flask import Flask, render_template, request, jsonify
app = Flask(__name__)
# 模拟设备状态(实际应用中应与硬件交互)
current_status = {"power": False, "level": "LOW"}
@app route('/')
def index():
return render_template('control html')
@app route('/api/status', methods=['GET'])
def get_status():
return jsonify(current_status)
@app route('/api/control', methods=['POST'])
def control_device():
global current_status
data = request json
action = data get('action')
if action == 'toggle':
current_status['power'] = not current_status['power']
elif action == 'set_level':
level = data get('level')
if level in ['LOW', 'MEDIUM', 'HIGH']:
current_status['level'] = level
# 这里应添加实际硬件控制代码
print(f"Device control: {current_status}")
return jsonify({"status": "success", "new_state": current_status})
代码参考:https://wa0p.github.io/ud.html
if __name__ == '__main__':
app run(host='0 0 0 0', port=5000, debug=True)
4 定时任务模块
python
import schedule
import ti me
from dateti me import dateti me
class AromaScheduler:
def __init__(self, diffuser):
self diffuser = diffuser
self schedules = []
def add_schedule(self, ti me_str, action, level=None):
"""添加定时任务
ti me_str: "HH:MM"格式的时间
action: "on"/"off"
level: 可选,开启时的浓度级别
"""
def job():
if action == "on":
if level:
# 在实际应用中需要转换为ScentLevel枚举
pass
self diffuser turn_on()
else:
self diffuser turn_off()
schedule every() day at(ti me_str) do(job)
self schedules append((ti me_str, action, level))
def run_pending(self):
"""运行所有待处理的任务"""
schedule run_pending()
def get_schedules(self):
"""获取所有定时任务"""
return self schedules
代码参考:https://wa0p.github.io/ue.html
# 示例用法
if __name__ == "__main__":
diffuser = AromaDiffuser(relay_pin=17, fan_pin=18)
scheduler = AromaScheduler(diffuser)
# 添加每天8:00开启的定时任务
scheduler add_schedule("08:00", "on", "MEDIUM")
# 添加每天22:00关闭的定时任务
scheduler add_schedule("22:00", "off")
try:
while True:
scheduler run_pending()
ti me sl eep(1)
except KeyboardInterrupt:
diffuser cleanup()
完整系统集成示例
python
import ti me
from aroma_diffuser import AromaDiffuser, ScentLevel
from aroma_mqtt import AromaMQTTController
from aroma_scheduler import AromaScheduler
def main():
# 初始化硬件
diffuser = AromaDiffuser(relay_pin=17, fan_pin=18)
# 初始化MQTT控制器
mqtt_controller = AromaMQTTController(diffuser, broker="192 168 1 100")
# 初始化定时任务
scheduler = AromaScheduler(diffuser)
scheduler add_schedule("08:00", "on", "MEDIUM")
scheduler add_schedule("22:00", "off")
try:
# 启动MQTT客户端(在单独线程中运行)
import threading
mqtt_thread = threading Thread(target=mqtt_controller start)
mqtt_thread daemon = True
mqtt_thread start()
print("Aroma Diffuser Control System Started")
while True:
# 这里可以添加主循环逻辑
# 例如检查传感器数据、处理用户输入等
# 运行定时任务检查
scheduler run_pending()
ti me sl eep(1)
代码参考:https://wa0p.github.io/uf.html
except KeyboardInterrupt:
print("\nShutting down ")
diffuser turn_off()
diffuser cleanup()
if __name__ == "__main__":
main()
扩展功能建议
传感器集成:添加温湿度传感器,根据环境自动调节香薰浓度
语音控制:集成Amazon Alexa或Google Assistant
移动应用:开发配套的Android/iOS应用
能耗监测:记录设备使用时间和能耗
香薰油管理:跟踪剩余油量并提醒更换
场景模式:预设"睡眠"、"工作"、"放松"等场景
用户账户:多用户支持与个性化设置
结论
本文实现了一个基础的香薰机智能控制系统,涵盖了设备控制、物联网集成、定时任务和Web界面等核心功能。该系统可根据实际需求进行扩展,通过添加更多传感器和智能算法,实现更复杂的自动化场景。随着物联网技术的发展,智能香薰设备将成为智能家居生态系统中重要的一环,为用户提供更加个性化、舒适的生活体验。